Task控制
Task Control
when条件语句
when 关键字主要针对 TASK 任务进行判断,对于此前我 们使用过的 yum 模块是可以自动检测软件包是否已被安 装,无需人为干涉;但对于有些任务则是需要进行判断 才可以实现的。
web 节点都需要配置 nginx 仓库,但其他节 点并不需要,此时就会用到 when 判断
Centos 与 Ubuntu 都需要安装 Apache,而 Centos 系统软件包为 httpd,而 Ubuntu系统软件 包为httpd2,那么此时就需要判断主机系统,然后 为不同的主机系统安装不同的软件包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 为所有主机安装 Apache 软件
1.系统为CentOS:安装 httpd
2.系统为Ubuntu:安装 httpd2
cat facts4.yml
- hosts: web
tasks:
- name: Centos Install httpd
yum:
name: httpd
state: present
when: (ansible_distribution =="CentOS")
- name: Ubuntu Install httpd
yum:
name: apache2
state: present
when: (ansible_distribution =="Ubuntu")
针对主机名为web的机器添加nginx仓库
1 | - hosts: all |
判断 httpd 服务是否处于运行状态
1 | # 判断 httpd 服务是否处于运行状态 |
为特定的主机执行任务
1 | # 有2台 server |
loop 循环语句
在写 playbook 的时候发现了很多 task 都要重复引用 某个相同的模块,比如一次启动10个服务,或者一次拷 贝10个文件,如果按照传统的写法最少要写10次,这样 会显得 playbook 很臃肿。如果使用循环的方式来编写 playbook,这样可以减少重复编写 task 带来的臃肿
1 | # 循环启动nginx和php-fpm |
Handlers和Notify
Handlers 是一个触发器,同时是一个特殊的 tasks, 它无法直接运行,它需要被 tasks 通知后才会运行
比如:httpd 服务配置文件发生变更,我们则可通过 Notify 通知给指定的 handlers 触发器,然后执行相 应重启服务的操作,如果配置文件不发生变更操作,则 不会触发 Handlers 任务的执行
handlers 注意事项
1.无论多少个 task 通知了相同的
handlers,handlers仅会在所有tasks结束后运行一次2.只有
task发生改变了才会通知handlers,没 有改变则不会触发handlers3.不能使用 handlers 替代
tasks、因为handlers是一个特殊的tasks
tags任务标签
默认情况下,Ansible 在执行一个 playbook 时,会执 行 playbook中所有的任务。而标签功能是用来指定要 运行 playbook中的某个特定的任务;
为
playbook添加标签的方式有如下几种- 对一个
task打一个标签 - 对一个
task打多个标签 - 对多个
task打一个标签
- 对一个
task打完标签使用的几种方式-t执行指定tag标签对应的任务--skip-tags执行除--skip-tags标签之外的所有任务
1 | cat f5.yml |
include任务复用
有时,我们发现大量的 Playbook 内容需要重复编写, 各 Tasks 之间功能需相互调用才能完成各自功能, Playbook 庞大到维护困难,这时我们需要使用 include 比如:A项目需要用到重启 httpd,B项目需要用到,重 启 httpd,那么我们可以使用 Include来减少重复编 写
1 | cat main.yml |
Playbook异常处理
在 playbook 执行的过程中,难免会遇到一些错误。由 于 playbook 遇到错误后,不会执行之后的任务,不便 于调试,此时,可以使用 ignore_errors 来暂时忽略 错误,使得 playbook 继续执行
1 | - hosts: all |