Ansible最核心的组件playbook,其文件格式为YAML语法
安装部署Nginx服务的剧本编写案例
1 ---
2 - hosts:all
3 tasks:
4 - name:Install Nginx Package
5 yum:name=nginx state=present
6 - name: Copy Nginx.conf
7 copy:src=./nginx.conf dest=/etc/nginx/nginx.conf mode=0664
第一行表示该文件的注释说明,YAML文件中通常使用三个短横线表示注释,也可以使用#
第二行定义改playbook剧本管理的目标主机,all表示针对所有的主机,这个位置定义支持Ansible Ad-Hoc模式的所有参数
第三行定义改playbook所有的任务集合信息,比如此次剧本代码中定义了两个任务
第四行定义一个任务的名称,非必须,建议根据实际任务命名
第五行定义一个任务的具体操作动作,比如这里使用的yum实现Nginx软件包的安装
第六放到第七行表示使用copy模块,将本地的Nginx配置文件推送分发给其他所有被管理的主机,并且修改设置权限为644
Ansible的playbook是由两个最基本的部分组成hosts定义剧本所管理的主机信息,tasks 定义所管理的主机需要执行的任务信息
在编写playbook剧本的时候要注意剧本编写的缩进规范,在编写剧本的时候不同 行信息之间有时需要有缩进关系,一般将两个空格作为一个缩进;在编写剧本的时候,有时需要定义变量信息或设置模块参数的配置信息,可以采用字典的格式进行设置;在编写剧本时剧本中定义的有些信息可能会重复出现,并且缩进关系一致,以及他们表达的意思也比较相近,这样不同行的信息就成了列表。剧本编写完成后,需要进行运行,才能完成剧本的主机管理功能。一般情况下我们执行剧本,使用相对路径加剧本文件,也可以使用绝对路径执行剧本文件。
剧本在执行的过程中,会产生相应的输出,根据输出的信息可以掌握剧本是否完整执行,每个执行的过程是否正确,以及根据输出的错误提示信息,可以排查剧本编写中的逻辑问题。剧本在执行时,任务中的每个Action会调用一个模块,然后再模块中检查当前系统状态并决定是否需要重新执行。如果本地执行了,那么Action 会得到返回值changed,如果不需要执行,那么Action会得到返回值ok
[root@localhost ~]# vim copy_hosts.yaml
[root@localhost ~]# ansible-playbook copy_hosts.yaml
ERROR! 'copy' is not a valid attribute for a Play #解决此报错,需要安装软件yamllint
The error appears to be in '/root/copy_hosts.yaml': line 1, column 4, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
- hosts: all
^ here
[root@localhost ~]# yum install -y yamllint
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
-------------------------------------------------------------------------------------------------------------------
省略部分输出信息
-------------------------------------------------------------------------------------------------------------------
python36-PyYAML.x86_64 0:3.13-1.el7
python36-pathspec.noarch 0:0.6.0-1.el7
完毕!
[root@localhost ~]# ansible-playbook copy_hosts.yaml #现在执行命令(第一次)
PLAY [all] ********************************************************************************************
TASK [Gathering Facts] ********************************************************************************
ok: [192.168.146.120]
ok: [192.168.146.110]
TASK [copy the /etc/hosts] ****************************************************************************
changed: [192.168.146.120]
changed: [192.168.146.110]
PLAY RECAP ********************************************************************************************
192.168.146.110 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.146.120 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@localhost ~]# ansible-playbook copy_hosts.yaml #第二次执行命令
PLAY [all] ********************************************************************************************
TASK [Gathering Facts] ********************************************************************************
ok: [192.168.146.120]
ok: [192.168.146.110]
TASK [copy the /etc/hosts] ****************************************************************************
ok: [192.168.146.120]
ok: [192.168.146.110]
PLAY RECAP ********************************************************************************************
192.168.146.110 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.146.120 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
发现第二次执行命令的时候全是以ok开头的,出现这样的结果是因为第一次执行的时候已经复制过文件,因此Ansible会根据文件的状态避免重复复制。现在更改主机192.168.146.110下的/etc/hosts文件,在执行测试,发现只有192.168.146.110的主机状态是changed,其他的是ok。
[root@localhost ~]# ansible-playbook copy_hosts.yaml
PLAY [all] ********************************************************************************************
TASK [Gathering Facts] ********************************************************************************
ok: [192.168.146.120]
ok: [192.168.146.110]
TASK [copy the /etc/hosts] ****************************************************************************
ok: [192.168.146.120]
changed: [192.168.146.110]
PLAY RECAP ********************************************************************************************
192.168.146.110 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.146.120 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
通过测试,可以将剧本执行过程中输出的信息总结为三个部分
1、PLAY [all] :显示执行过程中加载所管理主机或者主机组的信息
2、TASK [Gathering Facts]:显示对所管理主机执行的任务信息,默认最先执行的任务为收集主机信息
2、TASK [copy the /etc/hosts(自己定义的名字)]:显示对所管理的主机具体执行的任务,默认加载模块儿命令,是根据name定义显示的
3、 PLAY RECAP:剧本执行结果汇总统计,统计对主机做了多少次改动,以及出现了多少次错误
Ansible核心组件基本介绍完成!!!