Ansible最核心的组件playbook

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

Ansible最核心的组件playbook

[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核心组件基本介绍完成!!!

 

上一篇:变量的使用


下一篇:自动化运维工具-Ansible的Playbook的使用