一 条件语句
1 点睛
有时候一个playbook的结果取决于一个变量,或者取决于上一个任 务(task)的执行结果值,在某些情况下,一个变量的值可以依赖于其他变量的值,当然也会影响Ansible的执行过程。
2 when声明
2.1 点睛
有时候我们想跳过某些主机的执行步骤,比如符合特定版本的操 作系统将不安装某个软件包,或者磁盘空间爆满了将进行清理的步骤。 在Ansible中很容易做到这一点,通过When子句实现,其中将引用Jinja2 表达式。
2.2 示例
tasks:
- name: "shutdown Debian flavored systems"
command: /sbin/shutdown -t now
when: ansible_os_family == "Debian"
2.3 说明
通过定义任务的Facts本地变量ansible_os_family(操作系统版本名 称)是否为Debian,结果将返回BOOL类型值,为True时将执行上一条 语句command:/sbin/shutdown-t now,为False时该条语句都不会触发。
3 实战
3.1 点睛
通过判断一条命令执行结果做不同分支的二级处 理。
3.2 代码
tasks:
- command: /bin/false
register: result
ignore_errors: True
- command: /bin/something
when: result|failed
- command: /bin/something_else
when: result|success
- command: /bin/still/something_else
when: result|skipped
3.3 说明
“when:result|success”的意思为当变量result执行结果为成功状态时,将执行/bin/something_else命令,其他同理,其中success为Ansible内部过滤器方法,返回Ture代表命令运行成功。
二 循环语句
1 点睛
通常一个任务会做很多事情,如创建大量的用户、安装很多包, 或重复轮询特定的步骤,直到某种结果条件为止,Ansible为我们提供了此支持。
2 示例
2.1 代码
- name: add several users
user: name={{ item }} state=present groups=wheel
with_items:
- testuser1
- testuser2
2.3 说明
这个示例实现了一个批量创建系统用户的功能,with_items会自动循环执行上面的语句“user:name={{item}}state=present groups=wheel”,循环的次数为with_items的元素个数,这里有2个元素, 分别为testuser1、testuser2,会分别替换{{item}}项。
该示例与下面代码等价:
- name: add user testuser1
user: name=testuser1 state=present groups=wheel
- name: add user testuser2
user: name=testuser2 state=present groups=wheel
当然,元素也支持字典的形式
- name: add several users
user: name={{ item.name }} state=present groups={{ item.groups }}
with_items:
- { name: 'testuser1', groups: 'wheel' }
- { name: 'testuser2', groups: 'root' }
循环也支持列表(List)的形式,不过是通过with_flattened语句来 实现的,例如:
---
# file: roles/foo/vars/main.yml
packages_base:
- [ 'foo-package', 'bar-package' ]
packages_apps:
- [ ['one-package', 'two-package' ]]
- [ ['red-package'], ['blue-package']]
以上定义了两个列表变量,分别是需要安装的软件包名,以便后面进行如下引用:
- name: flattened loop demo
yum: name={{ item }} state=installed
with_flattened:
- packages_base
- packages_apps
通过使用with_flattened语句循环引用定义好的列表变量。