ansible——playbook循環


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 %}"

執行結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM