有時候一個playbook文件中很多tasks都重復(fù)引用了某個模塊著蟹,通過循環(huán)可以降低代碼工作量墩蔓,
1.標準loops
loop.yaml文件內(nèi)容如下:
---
- hosts: all
? gather_facts: False
? tasks:
? - name: debug loops
? ? debug: msg="name ----------> {{ item }} "
? ? with_items:
? ? - one
? ? - two
? ? - three
運行結(jié)果如下:
with_items的值是python list數(shù)據(jù)結(jié)構(gòu),當然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"}
運行結(jié)果如下:
2.嵌套loops
修改loop.yaml內(nèi)容如下:
---
- hosts: all
? gather_facts: False
? tasks:
? - name: debug loops
? ? debug: msg="name ----------> {{ item[0] }} ----------> {{ item[1] }} "
? ? with_nested:
? ? - ['A', 'B']
? ? - ['a', 'b', 'c']
運行結(jié)果如下:
3.散列l(wèi)oops
散列l(wèi)oops相比標準loops支持更豐富的數(shù)據(jù)結(jié)構(gòu)萧豆,支持YAML格式的數(shù)據(jù)變量奸披。
修改loops.yaml內(nèi)容如下:
---
- 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 }}"
運行結(jié)果如下:
4.文件匹配loops
原理:使用python glob模塊去做文件模糊匹配:
修改loop.yaml文件內(nèi)容如下:
---
- hosts: all
? gather_facts: False
? tasks:
? - name: debug loops
? ? debug: msg="files ---> {{ item }}"
? ? with_fileglob:
? ? - ./*.yaml
運行結(jié)果如下:
5.隨機選擇loops
原理:使用python random模塊實現(xiàn):
修改loop.yaml文件內(nèi)容如下:
---
- hosts: all
? gather_facts: False
? tasks:
? - name: debug loops
? ? debug: msg="name ---> {{ item }}"
? ? with_random_choice:
? ? - "ansible1"
? ? - "ansible2"
? ? - "ansible3"
運行結(jié)果如下:
6.條件判斷l(xiāng)oops
修改loop.yaml文件內(nèi)容如下:
---
- 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秒執(zhí)行一次?cat /etc/redhat-release并將結(jié)果register傳遞給host,然后判斷host.stdout.startswith的內(nèi)容是否以RadHat開頭涮雷,如果條件成立阵面,則該task完成,否則5s后重試洪鸭,總共嘗試5次样刷。運行結(jié)果如下:
7.文件優(yōu)先匹配loops
該匹配方式和文件匹配方式很相似,它會根據(jù)傳入的變量從上到下優(yōu)先匹配览爵。修改loop.yaml文件內(nèi)容如下:
---
- hosts: all
? gather_facts: False
? tasks:
? - name: debug loops
? ? debug: msg="files ---> {{ item }}"
? ? with_first_found:
? ? - "loop.yaml"
? ? - "variable.yaml"
運行結(jié)果如下:
8.register loops
其實register可以同時接受多個task的結(jié)果置鼻,這時需要使用jinja2的for循環(huán)把所有的結(jié)果顯示出來。修改loop.yaml文件內(nèi)容如下:
---
- 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 %}"
運行結(jié)果如下: