playbook高级特性
tags 标签
给task打上标签可以允许playbook执行的时候使用–tags选项只执行某个task或者–skip-tags选项不执行某个task.例如:
1 | tasks: |
如果只想执行”configuration”和”packags”标签的task,只需要执行:
1 | ansible-playbook example.yml --tags "configuration,packages" |
或者如果想跳过configuration的task.只需要–skip-tags选项
1 | ansible-playbook example.yml --skip-tags "configuration" |
tags标签可以复用.可以为多个task打上同一个tags
tags继承性
tags可以定义在整个playbook中,或者roles中:
1 | - hosts: all |
1 | roles: |
Blocks 块功能
Blocks块可以允许将一个或多个task归为一组,例如:
1 | tasks: |
这些task都被放置与一个block中,而且在block中定义了一个whn条件判断语句.这样就不用再每个task中都定义一个相同的when语句.
block块处理异常任务.
block可以用来处理任务的异常.有点类似于python编程语句的try exception…finally语句捕获异常.例如:
1 | tasks: |
rescue表示上一个task(command:/bin/false)语句执行异常时就会执行rescue的task.
而always表示无论command:/bin/false是否执行异常都会执行.
block块或者l-方式功能–使notify对应多个handlers
利用block块功能,可以将一个notify语句,对应多个handlers语句.例如:
1 | notify: |
如此一来,可以分别针对不同服务器的重启方法来重启nginx.还可以利用下面的方式:
1 | notify: |
|- 表示不换行,下列的if控制语句内的真实command语句都在shell模块的本行执行.
includes
includes在Ansible中起引用功能,.其功能非常强大,可以引入一个Playbook文件,变量var文件等等.有时候多个task或者playbook需要进行一项重复的工作,则可以将这部分功能单独写入一个playbook文件,然后再通过includes调用.而不必每个playbook都去写同样一个功能的task.这有点类似于shell脚本的函数
用法:
比如下面定义了一个php的playbook:
1 | - hosts: all |
然后定义restartphp.yml文件:
1 | - name: restart php |
同样其他的playbook想要重启Php服务不必再写重复的playbook task.只需要include retartphp.yml文件即可.
动态includes
includes还可以结合when语句.即只有当满足when条件时,才include文件执行.例如:
1 | -name: check if file exist |
下面的一个简单的例子演示了include的用法:
1 | [root@localhost playbook]$vim include.yml |
执行结果可以显示这个include的task.yml文件只在10.0.4.230这台服务器上执行了:
1 | [root@localhost playbook]$ansible-playbook include.yml |
template 模板
template常被用来传输文件,但是template模板的强大之处就在于支持变量替换.template支持jinja2的渲染格式,.另外还支持for循环以及if判断语句.下面来一个简单的例子:
1 | #编写一个简单的playbook |
执行template.yml这个playbook:
1 | [root@localhost playbook]$ansible-playbook template.yml |
查看远程主机上的test_template.txt文件:
1 | [root@localhost ~]$cat /tmp/test_template.txt |
template的jinja2 模板for循环
模板for循环的格式如下:
1 | {% for item in item_list %} |
渲染风格和python的django的模板渲染风格一模一样,. 大括号两边也要预留一个空格..
例如稍微改一下上面例子中的test_template.j2模板文件:
1 | [root@localhost playbook]$vim template/test_template.j2 |
重新执行playbook后,在远程服务器节点上查看/tmp/test_template.txt文件内容:
1 | [root@localhost ~]$cat /tmp/test_template.txt |
template模板的 jinja2 If语句
- if条件判断语句格式如下:
1 | {% if condition %} |
继续稍微改一下上面例子的test_template.j2模板文件:
1 | #下面的例子中先判断author值,以及myname变量是否定义.(我们的template.yml的playbook文件中定义了author变量,但是没有定义myname变量) |
执行完毕后,远程服务器节点文件内容如下
1 | [root@localhost ~]$cat /tmp/test_template.txt |
- if多重判断
if语句执行逻辑与(and)和逻辑或(or)的多重判断.比如下面的例子:
1 | {% if dwd_env is defined and https %} |
上面例子中变量dwd_env是字符串类型.值为beta,而https的变量类型是布尔型,值为True.
template jinja2 default()语句
除了if条件判断外,还可以使用default()语句.顾名思义,这是表示一个默认值.
用法格式:
1 | {{ var | default(value) }} #如果变量var有定义则取用var的值,否则就使用默认值value |
修改一下上述的template模板文件如下:
1 | [root@localhost playbook]$vim template/test_template.j2 |
执行后,远程服务器节点的文件内容输出如下:
1 | [root@localhost ~]$cat /tmp/test_template.txt |