有时候一个playbook文件中很多tasks都重复引用了某个模块,通过循环可以降低代码工作量,
1.标准loops
loop.yaml文件内容如下:
---
- hosts: all
gather_facts: False
tasks:
- name: debug loops
debug: msg="name ----------> {{ item }} "
with_items:
- one
- two
- three
运行结果如下:

with_items的值是python list数据结构,当然list里面也支持python字典:
---
- hosts: all
gather_facts: False
tasks:
- name: debug loops
debug: msg="name ----------> {{ item.key }} ----------> {{ item.value }} "
with_items:
- {key: "one", value: "VALUE1"}
- {key: "two", value: "VALUE2"}
- {key: "three", value: "VALUE3"}
运行结果如下:

2.嵌套loops
修改loop.yaml内容如下:
---
- hosts: all
gather_facts: False
tasks:
- name: debug loops
debug: msg="name ----------> {{ item[0] }} ----------> {{ item[1] }} "
with_nested:
- ['A', 'B']
- ['a', 'b', 'c']
运行结果如下:

3.散列loops
散列loops相比标准loops支持更丰富的数据结构,支持YAML格式的数据变量。
修改loops.yaml内容如下:
---
- hosts: all
gather_facts: False
vars:
user:
zhangsan:
name: zhangsan
shell: bash
lisi:
name: lisi
shell: zsh
tasks:
- name: debug loops
debug: msg="name ---> {{ item.key }} ---> value ---> {{ item.value.name }} ---> {{ item.value.shell }}"
with_dict: "{{ user }}"
运行结果如下:

4.文件匹配loops
原理:使用python glob模块去做文件模糊匹配:
修改loop.yaml文件内容如下:
---
- hosts: all
gather_facts: False
tasks:
- name: debug loops
debug: msg="files ---> {{ item }}"
with_fileglob:
- ./*.yaml
运行结果如下:

5.随机选择loops
原理:使用python random模块实现:
修改loop.yaml文件内容如下:
---
- hosts: all
gather_facts: False
tasks:
- name: debug loops
debug: msg="name ---> {{ item }}"
with_random_choice:
- "ansible1"
- "ansible2"
- "ansible3"
运行结果如下:

6.条件判断loops
修改loop.yaml文件内容如下:
---
- hosts: all
gather_facts: False
tasks:
- name: debug loops
shell: cat /etc/redhat-release
register: host
until: host.stdout.startswith("RedHat")
retries: 5
delay: 5
5秒执行一次 cat /etc/redhat-release并将结果register传递给host,然后判断host.stdout.startswith的内容是否以RadHat开头,如果条件成立,则该task完成,否则5s后重试,总共尝试5次。运行结果如下:

7.文件优先匹配loops
该匹配方式和文件匹配方式很相似,它会根据传入的变量从上到下优先匹配。修改loop.yaml文件内容如下:
---
- hosts: all
gather_facts: False
tasks:
- name: debug loops
debug: msg="files ---> {{ item }}"
with_first_found:
- "loop.yaml"
- "variable.yaml"
运行结果如下:

8.register loops
其实register可以同时接受多个task的结果,这时需要使用jinja2的for循环把所有的结果显示出来。修改loop.yaml文件内容如下:
---
- hosts: all
gather_facts: False
tasks:
- name: debug loops
shell: "{{ item }}"
with_items:
- hostname
- uname
register: ret
- name: display loops
debug: msg="{% for i in ret.results %} {{ i.stdout }} {% endfor %}"
运行结果如下:
