ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

playbook扩展配置

2021-05-24 11:01:40  阅读:199  来源: 互联网

标签:146.110 changed ok 变量 配置 扩展 192.168 playbook


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

1、playbook设置变量功能

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

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

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

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

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

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

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

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

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

当变量较多的时候、或者变量在多个playbook中多次使用的时候,可以把变量的放到一个单独的文件中,之后通过关键字“vars_files”可将该变量引用到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中的变量值。

 4)运行结果注册变量

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

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

[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

[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

[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

[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

[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

[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

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

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

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

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

 

标签:146.110,changed,ok,变量,配置,扩展,192.168,playbook
来源: https://www.cnblogs.com/luncy/p/14797586.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有