一、playbook剧本介绍
1)playbook介绍
Playbooks是Ansible的配置,部署和编排语言。它们可以描述您希望远程系统执行的策略,或一般IT流程中的一组步骤。
如果说ansible 模块 是你车间里的工具,那么playbooks 是你的说明书/使用手册,并且资源清单上的主机是你的原材料。
在基本层面上,剧本可以用于管理远程主机的配置与部署,在更高的一层来说,它们可以对涉及滚动更新的多层发布任务进行排序,并且可以将操作委派给其他主机,同时与监视服务器和负载平衡器进行交互。
在ansible 上使用Playbooks是一种完全不同于adhoc的任务执行模式,并且特别强大。简单地说,playbooks是一个非常简单的配置管理和多机器部署系统的基础,以及非常适合部署复杂应用程序的系统。
Playbooks可以对任务进行编排,就像我们要安装一个程序,写个安装shell脚本一样,在哪一步复制配置文件,最后一步启动服务。
虽然/usr/bin/ansible 可以运行一些临时任务,但是针对复杂的配置,并且可以将配置标准化,这个时候就需要Playbooks了。
2)写简单的playbook剧本,tree_install.yml
[root@web01 ~]# cat ansible_test/tree_install.yml --- - hosts: web01 tasks: - name: Installs tree yum: name=tree state=installed update_cache=true
剧本写好了,需要先测试一下语法
ansible-playbook -C xx.yml 测试的时候先验证语法
分析剧本内容
--- - hosts: web01 tasks: - name: Installs tree yum: name=tree state=installed update_cache=true =======分析========= hosts 执行的主机。在 /etc/ansible/hosts tasks 任务 name 任务名字 yum 执行的命令操作 yum install tree -y name=tree ==>指要安装的名字,update_cache=true ==> 相当于 y
执行记录
第一次执行 [root@web01 ~]# ansible-playbook ansible_test/tree_install.yml PLAY [web01] ************************************************************************************************************************************************************************ TASK [Gathering Facts] ************************************************************************************************************************************************************** ok: [192.168.10.25] ok: [myweb] TASK [Installs lrzsz] *************************************************************************************************************************************************************** changed: [myweb] changed: [192.168.10.25] PLAY RECAP ************************************************************************************************************************************************************************** 192.168.10.25 : ok=2 changed=1 unreachable=0 failed=0 myweb : ok=2 changed=1 unreachable=0 failed=0 返回状态:ok=2(执行成功) changed=1(命令执行成功) 第二次再执行 [root@web01 ~]# ansible-playbook ansible_test/tree_install.yml PLAY [web01] ************************************************************************************************************************************************************************ TASK [Gathering Facts] ************************************************************************************************************************************************************** ok: [192.168.10.25] ok: [myweb] TASK [Installs lrzsz] *************************************************************************************************************************************************************** ok: [192.168.10.25] ok: [myweb] PLAY RECAP ************************************************************************************************************************************************************************** 192.168.10.25 : ok=2 changed=0 unreachable=0 failed=0 myweb : ok=2 changed=0 unreachable=0 failed=0 返回状态:ok=2(执行成功) changed=0(已经安装了)
等同于 ansible web01 -m yum -a "name=tree state=present update-cache=true"
等同于ansible web01 -a "yum install tree -y"
3)playbook剧本安装nginx并启动他
[root@web01 ~]# cat ansible_test/nginx_install.yml --- - hosts: nginx01 tasks: - name: Installs nginx web server yum: name=nginx state=installed update_cache=true notify: - start nginx handlers: - name: start nginx service: name=nginx state=started
执行结果分析
[root@web01 ~]# ansible-playbook ansible_test/nginx_install.yml PLAY [nginx01] ********************************************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************************************** ok: [k8s1_192_168_10_41] TASK [Installs nginx web server] **************************************************************************************************************************************************** changed: [k8s1_192_168_10_41] RUNNING HANDLER [start nginx] ******************************************************************************************************************************************************* changed: [k8s1_192_168_10_41] PLAY RECAP ************************************************************************************************************************************************************************** k8s1_192_168_10_41 : ok=3 changed=2 unreachable=0 failed=0 结果分析ok=3,连接OK,安装OK,启动ok changed=2,安装变化,启动变化
4)以指定主机iP的形式提交任务,需要加上 -l
ansible-playbook -l 192.168.10.176 nginx_install.yml
测试未通过
5) 安装nginx并拷贝文件
--- - hosts: all tasks: - name: Installs nginx web server yum: name=nginx state=installed update_cache=true notify: - start nginx - name: Upload default index.html for host copy: src=static_files/index.html dest=/usr/share/nginx/html/ mode=0644 handlers: - name: start nginx service: name=nginx state=started
6)调用shell命令
[root@k8s6 ansible_yml]# cat shell.yml --- - hosts: web tasks: - name: shell_test shell: ss -tnl|grep :22
二、playbook剧本的深入操作
1)任务执行结果判断,register
--- - hosts: all tasks: - name: Installs nginx web server yum: name=nginx state=installed update_cache=true notify: - start nginx - name: Upload default index.html for host copy: src=static_files/index.php dest=/usr/share/nginx/html/ mode=0644 register: php ignore_errors: True
# 如果任务php执行成功,执行该任务 - name: Remove index.html for host command: rm /usr/share/nginx/html/index.html when: php|success
# 如果任务php执行失败,执行该任务 - name: Upload default index.html for host copy: src=static_files/index.html dest=/usr/share/nginx/html/ mode=0644 when: php|failed handlers: - name: start nginx service: name=nginx state=started
分析关键字
执行该任务,并注册任务名字 register: php php任务执行成功后执行 when: php|success php任务执行失败后执行 when: php|failed
2)生产环境服务安装
--- - name: 安装neodb hosts: eos-neodb vars_files: - vars/iot.yml tasks: - name: "build java 1.8.0" shell: "sudo sed -i s/jdk1.7.0_79/jdk1.8.0_60/g {{ profile_path }}" - name: "check java version" shell: "source {{ profile_path }} && java -version" register: java_version failed_when: java_version is defined and "1.8.0" not in java_version.stderr - name: "check neodb" shell: "sudo ls /home/envuser/ongdb-enterprise-3.4.9" register: check_neodb failed_when: check_neodb is defined and "No such file or directory" not in check_neodb.stderr - name: Upload {{ neodb }} become: yes become_user: root become_method: sudo copy: src={{ srcfile }} dest={{ descfile }} - name: tar -xf {{ neodb }} become: yes become_user: root become_method: sudo shell: cd {{ descfile }} && tar -xf {{ neodb }} && chown envuser:envuser -R {{ ongdb }} - name: Upload neo4j.conf become: yes become_user: root become_method: sudo copy: src=/home/supper-user/tools/neo4j.conf dest=/home/envuser/ongdb-enterprise-3.4.9/conf/ - name: ln -s ongdb-enterprise-3.4.9 become: yes become_user: envuser become_method: sudo shell: cd /home/envuser && ln -s ongdb-enterprise-3.4.9 ongdb - name: sed neo4j become: yes become_user: envuser become_method: sudo shell: cd /home/envuser/ongdb-enterprise-3.4.9/conf/ && sed -i "s#hostname#`hostname`#g" neo4j.conf && chown envuser:envuser neo4j.conf - name: "set admin password" become: yes become_user: envuser become_method: sudo shell: source {{ profile_path }} && cd /home/envuser/ongdb-enterprise-3.4.9/bin/ && ./neo4j-admin set-initial-password admin
三、参数验证
--- - hosts: all gather_facts: no tasks: - name : touch file shell: "touch /tmp/{{touch_file}}"
执行服务
ansible-playbook ./f1.yml --extra-vars "touch_file=123"