Loop - 繰り返し

2019/03/13

Ansible

 Ansible Documentation

Loops

 機能

  • タスクを繰り返し実行する
  • 配列やリストと組み合わせて使用することが多い

 標準的なループ

次の例は debug モジュールで書いたタスクを loop: の次に書いた要素を順番に取り出しながら繰り返し実行します。 sato,  suzuki, takahashi, tanaka, watanage の 5 つの要素が設定されています。 1 回目に sato を、2 回目に suzuki  を ・・・ 5 回目に watanabe を順に取り出しながらタスクを繰り返し実行します。 loop: で取り出した要素(値)は変数 item に設定されます。
---
- hosts: all
  gather_facts: no

  tasks:
    - name: 名字を表示
      debug:
        var: item
      loop:
        - sato
        - suzuki
        - takahashi
        - tanaka
        - watanabe
実行結果です。 loop: の次に 5 つの要素があり、順番に表示されています。
[ansibleman@ansiblesv ansible]$ ansible-playbook -i hosts.yml site.yml 
 
PLAY [all] *****************************************************************************************
 
TASK [名字を表示] ***************************************************************************************
ok: [node1] => (item=sato) => {
    "item": "sato"
}
ok: [node1] => (item=suzuki) => {
    "item": "suzuki"
}
ok: [node1] => (item=takahashi) => {
    "item": "takahashi"
}
ok: [node1] => (item=tanaka) => {
    "item": "tanaka"
}
ok: [node1] => (item=watanabe) => {
    "item": "watanabe"
}
 
PLAY RECAP *****************************************************************************************
node1                      : ok=1    changed=0    unreachable=0    failed=0   
 
[ansibleman@ansiblesv ansible]$ 

 配列との組み合わせ

loop: の次に繰り返す要素を書かず、配列名を書きます。
loop:
  "{{ 配列名 }}"
配列と組み合わせて書いた play です。
---
- hosts: all
  gather_facts: no
  
  vars:
    myoji:
      - sato
      - suzuki
      - takahashi
      - tanaka
      - watanabe


  tasks:
    - name: 名字を表示
      debug:
        var: item
      loop:
        "{{ myoji }}"
実行結果は「標準的なループ」と同じです。
[ansibleman@ansiblesv ansible]$ ansible-playbook -i hosts.yml site.yml 
 
PLAY [all] *****************************************************************************************
 
TASK [名字を表示] ***************************************************************************************
ok: [node1] => (item=sato) => {
    "item": "sato"
}
ok: [node1] => (item=suzuki) => {
    "item": "suzuki"
}
ok: [node1] => (item=takahashi) => {
    "item": "takahashi"
}
ok: [node1] => (item=tanaka) => {
    "item": "tanaka"
}
ok: [node1] => (item=watanabe) => {
    "item": "watanabe"
}
 
PLAY RECAP *****************************************************************************************
node1                      : ok=1    changed=0    unreachable=0    failed=0   
 
[ansibleman@ansiblesv ansible]$

 リストとの組み合わせ

配列と同じく繰り返す要素を書かず、リスト名を書きます。
loop:
  "{{ リスト名 }}"
リストと組み合わせて書いた play です。
---
- hosts: all
  gather_facts: no
  
  vars:
    namae:
      - sei: sato
        mei: ren
      - sei: suzuki
        mei: yuzuki
      - sei: takahashi
        mei: minato
      - sei: tanaka
        mei: yua
      - sei: watanabe
        mei: sora

  tasks:
    - name: 名前を表示
      debug:
        var: item
      loop:
        "{{ namae }}"
実行結果です。
[ansibleman@ansiblesv ansible]$ ansible-playbook -i hosts.yml site3.yml
 
PLAY [all] *****************************************************************************************
 
TASK [名前を表示] ***************************************************************************************
ok: [node1] => (item={u'mei': u'ren', u'sei': u'sato'}) => {
    "item": {
        "mei": "ren", 
        "sei": "sato"
    }
}
ok: [node1] => (item={u'mei': u'yuzuki', u'sei': u'suzuki'}) => {
    "item": {
        "mei": "yuzuki", 
        "sei": "suzuki"
    }
}
ok: [node1] => (item={u'mei': u'minato', u'sei': u'takahashi'}) => {
    "item": {
        "mei": "minato", 
        "sei": "takahashi"
    }
}
ok: [node1] => (item={u'mei': u'yua', u'sei': u'tanaka'}) => {
    "item": {
        "mei": "yua", 
        "sei": "tanaka"
    }
}
ok: [node1] => (item={u'mei': u'sora', u'sei': u'watanabe'}) => {
    "item": {
        "mei": "sora", 
        "sei": "watanabe"
    }
}
 
PLAY RECAP *****************************************************************************************
node1                      : ok=1    changed=0    unreachable=0    failed=0   
 
[ansibleman@ansiblesv ansible]$ 
実行結果を確認すると item の中に sei, mei の 2 つの要素が含まれていることがわかります。 item と含まれている要素を “.” でつなげると、それぞれの要素ごとに取り出せます。次はそれぞれの要素ごとに取り出すように変更した play です。
---
- hosts: all
  gather_facts: no
  
  vars:
    namae:
      - sei: sato
        mei: ren
      - sei: suzuki
        mei: yuzuki
      - sei: takahashi
        mei: minato
      - sei: tanaka
        mei: yua
      - sei: watanabe
        mei: sora

  tasks:
    - name: 名前を表示
      debug:
        msg: "{{ item.sei }} {{ item.mei }} "
      loop:
        "{{ namae }}"
実行結果です。sei, mei がそれぞれ表示されていることがわかります。
[ansibleman@ansiblesv ansible]$ ansible-playbook -i hosts.yml site.yml
 
PLAY [all] *****************************************************************************************
 
TASK [名前を表示] ***************************************************************************************
ok: [node1] => (item={u'mei': u'ren', u'sei': u'sato'}) => {
    "msg": "sato ren "
}
ok: [node1] => (item={u'mei': u'yuzuki', u'sei': u'suzuki'}) => {
    "msg": "suzuki yuzuki "
}
ok: [node1] => (item={u'mei': u'minato', u'sei': u'takahashi'}) => {
    "msg": "takahashi minato "
}
ok: [node1] => (item={u'mei': u'yua', u'sei': u'tanaka'}) => {
    "msg": "tanaka yua "
}
ok: [node1] => (item={u'mei': u'sora', u'sei': u'watanabe'}) => {
    "msg": "watanabe sora "
}
 
PLAY RECAP *****************************************************************************************
node1                      : ok=1    changed=0    unreachable=0    failed=0   
 
[ansibleman@ansiblesv ansible]$

カテゴリー

目次

QooQ