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]$