循环

通常一个任务会做很多事情,如创建大量的用户、安装很多包,或重复轮询特定的步骤,直到某种结果条件为止,Ansible 为我们提供了此支持。下面是一个简单的示例:

- name: add several users
  user: name={{ item }} state=present groups=wheel
  with_items:
    - testuser1
    - testuser2

这个示例实现了一个批量创建系统用户的功能,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 语句循环引用定义好的列表变量。