playbook扩展配置

playbook的扩展配置主要包括其设置变量功能、逻辑控制语句、调试功能配置、触发功能。

1、playbook设置变量功能

在剧本中可以通过设置变量信息,实现相应参数的配置功能,在某些场景下,可以简化对剧本的修改调整。在playbook中,常用几种变量设置方法如下:

1.在playbook中用户自定义的变量

2.用户无需定义,Ansible会在执行playbook之前去管理主机上搜集关于远程主机系统的信息变量

3.在文件模板中,可以直接使用上述两种变量

4.把任务的运行结果作为一个变量来使用,这个交注册变量

5.为了是playbook根灵活,通用性更强,允许用户在执行playbook是传入变量的值,这个时候就需要用到额外变量

1)在playbook中用户自定义的变量

用户可以在playbook中,通过vars关键字自定义变量,之后再用{{ }}调用即可。

playbook扩展配置

 注意剧本的格式,编写剧本的时候,注意后缀为.yaml

当变量较多的时候、或者变量在多个playbook中多次使用的时候,可以把变量的放到一个单独的文件中,之后通过关键字“vars_files”可将该变量引用到playbook中,使用变量的方法和在文件中定义变量的方法相同

playbook扩展配置 

 变量文件/vars/server_vars.yml的内容为

 http_port :  80

定义和使用复杂的变量:在某些场景中需要使用的变量不是简单的字符串或数字,而是一个对象,对象的定义语法如下,格式为YAML的字典格式

foo:

      field1: one

      field2: two

访问复杂变量中的子属性,可以利用中括号或者点号

foo [ 'field1' ]

foo . field2

2)远程主机的系统变量(Facts)

Ansible会通过模块“ setup ”来搜集主机的系统信息,这些搜集到的系统信息称为Facts,每个playbook在执行前都会默认执行setup模块,所以这些Facts信息可以直接以变量的形式使用。可以通过在命令行中调用setup模块的命令

[root@localhost ~]# ansible all -m setup -u root   #查看所有可调用的Facts变量信息

搜集Facts信息会消耗额外的时间,如果不需要Facts信息,则可在playbook中通过关键字gather_facts来控制是否搜集远程的系统信息。如果不搜集系统信息,那么上面的Facts的变量就不能在该playbook中使用了,基本格式如下:

-   hosts:   wangju

gather_facts:  no

省略下面的部分

3)文件模板中的使用变量

template模块在Ansible中十分常用,而他在使用过程中并没有显示的指定template文件中的值。所有在playbook定义的变量中,都可以直接在template中使用。同时Facts变量可以直接在template中使用,当然在Inventory中定义的Hosts和Group 变量也是如此。

使用template模块复制文件index.html.j2,并且替换index.html.j2中的变量为playbook中的变量值。

playbook扩展配置

 4)运行结果注册变量

把任务的执行结果当作一个变量的值也是可以的。这个时候就需要用到”注册变量”,即把执行结果注册到一个变量中,待后面的任务使用,把执行结果注册到变量中的关键字是register,使用方法如下:                                                                                                                                                         

[root@localhost tmp]# vim 3.test.yaml

playbook扩展配置

[root@localhost tmp]# ansible-playbook 3.test.yaml

PLAY [wangju] *****************************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [192.168.146.110]

TASK [shell] ******************************************************************************************
changed: [192.168.146.110]

TASK [shell] ******************************************************************************************
skipping: [192.168.146.110]

TASK [debug] ******************************************************************************************
ok: [192.168.146.110] => {
"msg": "\"\"anaconda-ks.cfg\nauth.smb\ninitial-setup-ks.cfg\nnull\n公共\n模板\n视频\n图片\n文档\n下载\n音乐\n桌面"
}

PLAY RECAP ********************************************************************************************
192.168.146.110 : ok=3 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0

 注册变量经常和debug模块一块儿使用,这样能够可以得到更多的关于执行错误的信息,以帮助用户调试剧本内容。

5)用命令行传递变量信息

为了是playbook更灵活,通用性更强,允许用户在执行的时候传入指定变量的值,此时就需要用到”额外变量”

在playbook中定义变量信息,例如在下面的剧本中,如果命令行中传入新的值,那么会覆盖playbook中的值,未在命令行中传入值也不会报错

[root@localhost tmp]# vim 4.test.yaml

playbook扩展配置

[root@localhost tmp]# ansible-playbook 4.test.yaml

PLAY [wangju] *****************************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [192.168.146.110]

TASK [debug] ******************************************************************************************
ok: [192.168.146.110] => {
"msg": "\"\"Value in playbook file"
}

PLAY RECAP ********************************************************************************************
192.168.146.110 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

[root@localhost tmp]# ansible-playbook 4.test.yaml --extra-vars "hosts=feifei user=root"     #使用的是
[WARNING]: Found variable using reserved name: hosts

PLAY [wangju] *****************************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [192.168.146.110]

TASK [debug] ******************************************************************************************
ok: [192.168.146.110] => {
"msg": "\"\"Value in playbook file"
}

PLAY RECAP ********************************************************************************************
192.168.146.110 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

 还可以用JSON格式传递参数:[root@localhost tmp]# ansible-playbook 4.test.yaml --extra-vars {'hosts' : 'feifei' ,   'user' :'root'}

  2、playbook逻辑控制语句

值playbook中也可以设置一些逻辑控制语句(类似于shell脚本中的逻辑语句信息),是剧本配置方式更加灵活多样,在剧本中常用的逻辑语句的参数如下:

when:条件判断语句,类似于编程语言中的if

loop:循环语句,类似于编程语言中的while

block:把几个任务组成一个代码块,以便针对一组操作的异常进行处理

1)条件判断语句when用法

[root@localhost tmp]# vim 5.test.yaml

playbook扩展配置

[root@localhost tmp]# ansible-playbook 5.test.yaml

PLAY [wangju] *****************************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [192.168.146.110]

TASK [shutdown Debian systems] ************************************************************************
skipping: [192.168.146.110]

PLAY RECAP ********************************************************************************************
192.168.146.110 : ok=1 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0

 2)逻辑循环语句主要是为了简洁,主要分标准循环与嵌套循环

3、playbook调试功能配置

常用的调试功能有以下几种:ignore_errors:忽略剧本执行过程中的错误信息

                                               tags:给剧本打标签

1)剧本执行错误忽略功能:在执行剧本时由于Ansible具有串行执行特性,即一个任务执行成功,才会执行下一个任务,如果一个剧本中的某个任务执行失败了,就会停止剧本执行,在引入剧本执行错误功能后,可以先忽略有些可能有错误的任务,确保剧本中的其他任务执行完毕,之后在研究出错的任务。

[root@localhost tmp]# vim 6.test.yaml

playbook扩展配置

[root@localhost tmp]# ansible-playbook 6.test.yaml

PLAY [wangju] *****************************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [192.168.146.110]

TASK [install software] *******************************************************************************
[WARNING]: Consider using the yum module rather than running 'yum'. If you need to use command
because yum is insufficient you can add 'warn: false' to this command task or set
'command_warnings=False' in ansible.cfg to get rid of this message.
changed: [192.168.146.110]

TASK [create user] ************************************************************************************
changed: [192.168.146.110]

TASK [boot server] ************************************************************************************
changed: [192.168.146.110]

PLAY RECAP ********************************************************************************************
192.168.146.110 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

2)剧本标签功能

[root@localhost tmp]# vim 7.test.yaml

playbook扩展配置

[root@localhost tmp]# ansible-playbook 7.test.yaml -t t1    #指定标签任务的命令

PLAY [all] ********************************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [192.168.146.110]
ok: [192.168.146.120]

TASK [creat file info] ********************************************************************************
skipping: [192.168.146.110]
changed: [192.168.146.120]

PLAY RECAP ********************************************************************************************
192.168.146.110 : ok=1 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
192.168.146.120 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

[root@localhost tmp]# ansible-playbook 7.test.yaml --skip-tags t2   #跳过指定标签任务的命令

PLAY [all] ********************************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [192.168.146.120]
ok: [192.168.146.110]

TASK [creat file info] ********************************************************************************
skipping: [192.168.146.110]
changed: [192.168.146.120]

PLAY RECAP ********************************************************************************************
192.168.146.110 : ok=1 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
192.168.146.120 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

 4、playbook触发功能

每个主流的编程语言都有Event机制,而handlers就是playbook的Event。handlers里面的每一个触发器信息都是对模块的一次调用。而handlers与任务不同,任务会默认地按照定义顺序执行,而handlers则不会,它需要在任务中调用,才有可能得到执行。前面提到在任务表中的任务都是有状态的,changed或者ok。在Ansible中,只有在任务的执行状态为changed时,才会执行该任务的调用的handlers。这也是handler与普通的Event的机制不同的地方。剧本触发功能的应用场景例如:在任务中修改了Apache的配置文件,那么需要重启Apache,如果还安装了插件,那么还需要重启Apache,像这样的场景,重启Apache就可以设置成一个handler。一个handler最多只执行一次,并且是在所有的任务都执行完之后在执行,如果有多个任务调用(notify)同一个handler,那么只执行一次。

[root@localhost tmp]# vim 8.test.yaml

playbook扩展配置

[root@localhost tmp]# ansible-playbook 8.test.yaml

PLAY [wangju] *****************************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [192.168.146.110]

TASK [copy the /etc/hosts to /tmp/hosts.1202] *********************************************************
changed: [192.168.146.110]

TASK [copy the /etc/hosts to /tmp/hosts.3929114] ******************************************************
changed: [192.168.146.110]

RUNNING HANDLER [call in every action] ****************************************************************
ok: [192.168.146.110] => {
"msg": "\"\"call in every action,but execute only one time"
}

PLAY RECAP ********************************************************************************************
192.168.146.110 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

 

 只有是changed状态的任务才会触发handler的执行。下面的剧本执行了两次,执行结果是不同的

第一次执行时:任务状态都是changed,会触发两次handler。第二次执行时:第一个任务状态是ok,因为不会触发handlers “ call by /tmp/hosts” 第二个任务的状态是changed,触发了handler “call by /tmp/hosts.random_number” 。测试代码如下:

[root@localhost tmp]# vim 9.test.yaml

playbook扩展配置

 3)按照定义的顺序执行触发功能

handler是按照定义的顺序执行的,而不是按照所安装的任务中调用的顺序执行的

[root@localhost tmp]# vim 10.test.yaml

playbook扩展配置                                                                                                                                                                                                                                                                                                            playbook是可以整合的,在整合多个剧本信息的时候,可以在每个剧本中定义具体的任务信息,而无须定义hosts管理的主机信息,在汇总剧本中灵活调用整合多个剧本,并定义需要执行任务的hosts主机信息,还有比较简单的是找到相应的剧本,直接利用import_playbook 参数进行整合,在执行时会按照整合加载的顺序,执行每一个剧本。 

 

上一篇:阿里云开放端口


下一篇:ansible及常用模块的使用