1.標准loop
通過with_items參數實現,item會去with_items這個數組中輪詢取值。
定義normal_loos.yaml:
--- - hosts: all gather_facts: False tasks: - name: debug loops debug: msg="name ------> {{ item }}" with_items: - one - two
執行結果:
當然可以支持鍵值對的方式:
定義normal2_loops.yaml:
--- - hosts: all gather_facts: False tasks: - name: debug loops debug: msg="name ------> {{ item.key }} value ------> {{ item.value }}" with_items: - {key: "one", value: "VALUE1"} - {key: "two", value: "VALUE2"}
執行結果:
2.嵌套Loops
主要實現多個循環體的合並。
定義nest_loop.yaml:
--- - hosts: all gather_facts: False tasks: - name: debug loops debug: msg="name->{{ item[0] }} value->{{ item[1] }}" with_nested: - ['A'] - ['a','b','b']
執行結果:
解釋說明:
with_nested是一個數組.
item[0]表示這個數組的第一個元素,也就是['A']
item[1]表示這個數組的第二個元素,也就是['a','b','b']
然后分別循環這兩個元素。
3.散列loops
標准loop支持的是數組,類似於python中的列表。
嵌套loop其實使用是[{},{}]這種列表套字典的形式,
而散列loop可以直接支持字典形式,只是變相要遵循yaml格式。
定義: hash_loop.yaml
--- - hosts: all gather_facts: Fasle vars: user: kebi: name: zhangrongkai addr: luotian maoxian: name: songlixing addr: xiaochang tasks: - name: debug loops debug: msg="name--->{{ item.key }} value--->{{ item.value.name }} addr---{{ item.value.addr }}" with_dict: "{{ user }}"
將其轉化為python中的字典格式:
user = { "kebi": { "name": "zhangrongkai", "addr": "luotian" }, "maoxian": { "name": "songlixing", "addr": "xiaochang" } }
item=user,key=[kebi,maoxian],然后取其屬性值。
注意這里:with_dict: "{{ user }}"
在2.0之前,采用的是這種格式:with_dict: user
否則就會報錯:
4.文件配置loops
在某些時候,我們需要針對某一類型的文件進行一些操作,這個時候就可以使用fileglob這個參數。
通過這個fileglob就能匹配到相應的文件,然后就可以進行相應的操作。
定義:file_loop.yaml
--- - hosts: all tasks: - name: debug loops debug: msg="filename--->{{ item }}" with_fileglob: - /tmp/*.py
執行結果:
在ansible內部其實是調用python模塊glob,然后進行如下操作:
glob.glob("/tmp/*.py")
5.隨機選擇loops
隨機選擇item數組中的一個值。
定義:random_loop.yaml
--- - hosts: all tasks: - name: debug loops debug: msg="name--->{{ item }}" with_random_choice: - "test1" - "test2" - "test3"
執行結果:
內部其實就是使用python的random模塊來實現。
6.條件判斷
有時候,我們需要執行一個操作,這個操作可能失敗,我們希望5秒之后再去嘗試執行,
這樣的操作重復5次,如果還不行就退出。
定義:case_loop.yaml
--- - hosts: all tasks: - name: debug loops shell: cat /etc/hostname register: host until: host.stdout.startswith("centos") retries: 5 delay: 5
執行結果:
解釋說明:
name: debug loops #任務名稱,非必需
shell: cat /etc/hostname #操作
register: host #操作的結果賦值給host
until: host.stdout.startswith("centos") #直到...成立
retries: 5 #重復5次
delay: 5 #每個5秒重復一次
如果操作失敗,是下面結果:
7.文件優先匹配Loops
文件優先匹配會根據你傳入的變量或者文件進行從上往下匹配,如果匹配到某個文件,它會用這個文件當作{{item}}的值。
--- - hosts: all tasks: - name: debug loops debug: msg="file--->{{ item }}" with_first_found: - "{{ ansible_distribution }}.yaml" - "default.yaml
8.register Loops
之前通過register定義ret來接收shell操作的結果。
當時之前接收的是一個數據,但是現在確實接收多個。
定義: register_loop.yaml
--- - hosts: all 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 %}"
執行結果: