【Infrastructure as code】Ansible入門その5

どうもKuboです。

本日はAnsibleの色々なLoopの方法をご紹介します。

with_list

リスト型の値をループします。

playbook.yml

---
- hosts: all
  tasks:
    - debug:
        msg: "loop:{{ item }}"
      with_list:
        - aaa
        - bbb
        - ccc

値は「item」の中に入ります。

実行結果

 ansible-playbook -i inventory playbook.yml

PLAY [all] **********************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ********************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=aaa) => {
    "msg": "loop:aaa"
}
ok: [localhost] => (item=bbb) => {
    "msg": "loop:bbb"
}
ok: [localhost] => (item=ccc) => {
    "msg": "loop:ccc"
}

PLAY RECAP **********************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

with_items

リスト型の値をループします。

playbook.yml

---
- hosts: all
  tasks:
    - debug:
        msg: "loop:{{ item }}"
      with_items:
        - aaa
        - bbb
        - ccc

値は「item」の中に入ります。

実行結果

$ ansible-playbook -i inventory playbook.yml


PLAY [all] **********************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ********************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=aaa) => {
    "msg": "loop:aaa"
}
ok: [localhost] => (item=bbb) => {
    "msg": "loop:bbb"
}
ok: [localhost] => (item=ccc) => {
    "msg": "loop:ccc"
}

PLAY RECAP **********************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

with_listと違い

結果を見てwith_itemswith_listの結果が一緒なので違いは?と思ったと思いますが、
with_itemsの特徴はflattenされる点です。

playbook.yml

---
- hosts: all
  tasks:
    - debug:
        msg: "loop:{{ item }}"
      with_items:
        - [ aaa, ddd ]
        - bbb
        - ccc

1つ目のパラメータがaaadddでネストされていてもwith_itemsはflattenされ合計4回ループします。

実行結果

$ ansible-playbook -i inventory playbook.yml

PLAY [all] **********************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ********************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=aaa) => {
    "msg": "loop:aaa"
}
ok: [localhost] => (item=ddd) => {
    "msg": "loop:ddd"
}
ok: [localhost] => (item=bbb) => {
    "msg": "loop:bbb"
}
ok: [localhost] => (item=ccc) => {
    "msg": "loop:ccc"
}

PLAY RECAP **********************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

 

これがwith_listの場合は、3回のループになります。

$ ansible-playbook -i inventory playbook.yml

PLAY [all] **********************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ********************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=['aaa', 'ddd']) => {
    "msg": "loop:['aaa', 'ddd']"
}
ok: [localhost] => (item=bbb) => {
    "msg": "loop:bbb"
}
ok: [localhost] => (item=ccc) => {
    "msg": "loop:ccc"
}

PLAY RECAP **********************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

 

with_indexed_items

with_itemsにインデックス付きでループします。

playbook.yml

---
- hosts: all
  tasks:
    - debug:
        msg: "loop{{ item.0 }}:{{ item.1 }}"
      with_indexed_items:
        - [ aaa, ddd ]
        - bbb
        - ccc

実行結果

$ ansible-playbook -i inventory playbook.yml

PLAY [all] **********************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ********************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=[0, 'aaa']) => {
    "msg": "loop0:aaa"
}
ok: [localhost] => (item=[1, 'ddd']) => {
    "msg": "loop1:ddd"
}
ok: [localhost] => (item=[2, 'bbb']) => {
    "msg": "loop2:bbb"
}
ok: [localhost] => (item=[3, 'ccc']) => {
    "msg": "loop3:ccc"
}

with_together

2つのリストをループします。

playbook.yml

---
- hosts: all
  tasks:
    - debug:
        msg: "{{ item.0 }} - {{ item.1 }}"
      with_together:
        - [aaa  , bbb]
        - [ccc  , ddd]

実行結果

$ ansible-playbook -i inventory playbook.yml

PLAY [all] **********************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ********************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=['aaa', 'ccc']) => {
    "msg": "aaa - ccc"
}
ok: [localhost] => (item=['bbb', 'ddd']) => {
    "msg": "bbb - ddd"
}

PLAY RECAP **********************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

 

with_dict

辞書型の値をループします。

playbook.yml

---
- hosts: all
  tasks:
    - debug:
        msg: "{{ item.key }} : {{ item.value }}"
      with_dict:
        "aaa" : "bbb"
        "ccc" : "ddd"

実行結果

$ ansible-playbook -i inventory playbook.yml

PLAY [all] **********************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ********************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item={'key': 'aaa', 'value': 'bbb'}) => {
    "msg": "aaa : bbb"
}
ok: [localhost] => (item={'key': 'ccc', 'value': 'ddd'}) => {
    "msg": "ccc : ddd"
}

PLAY RECAP **********************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

with_subelements

1つ目のパラメータに含まれる要素を2つ目に指定してループすることができます。

playbook.yml

---
- hosts: all
  tasks:
    - debug:
        msg: "{{ item.0.name }} : {{ item.1 }}"
      with_subelements:
        -
          - name: aaa
            hoge:
              - 1hoge
              - 2hoge
          - name: ddd
            hoge:
              - 3hoge
              - 4hoge
        - hoge

実行結果

$ ansible-playbook -i inventory playbook.yml

PLAY [all] **********************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ********************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=[{'name': 'aaa'}, '1hoge']) => {
    "msg": "aaa : 1hoge"
}
ok: [localhost] => (item=[{'name': 'aaa'}, '2hoge']) => {
    "msg": "aaa : 2hoge"
}
ok: [localhost] => (item=[{'name': 'ddd'}, '3hoge']) => {
    "msg": "ddd : 3hoge"
}
ok: [localhost] => (item=[{'name': 'ddd'}, '4hoge']) => {
    "msg": "ddd : 4hoge"
}

PLAY RECAP **********************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

with_nested

渡した要素の全組み合わせを実行します。

playbook.yml

---
- hosts: all
  tasks:
    - debug:
        msg: "{{ item.0 }} : {{ item.1 }}"
      with_nested:
        - [aaa , bbb]
        - [ccc , ddd]

実行結果

$ ansible-playbook -i inventory playbook.yml

PLAY [all] **********************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ********************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=['aaa', 'ccc']) => {
    "msg": "aaa : ccc"
}
ok: [localhost] => (item=['aaa', 'ddd']) => {
    "msg": "aaa : ddd"
}
ok: [localhost] => (item=['bbb', 'ccc']) => {
    "msg": "bbb : ccc"
}
ok: [localhost] => (item=['bbb', 'ddd']) => {
    "msg": "bbb : ddd"
}

PLAY RECAP **********************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

最後に

如何だったでしょうかAnsibleのループの種類が沢山あって覚えきれません

これは私のメモでもあるので何か不足があったら随時更新したいと思います。

以上、Kuboでした。

 

開発日記
この記事の投稿者
kubo

このサイトの共同編集者、プログラマ、素人デザイナー
得意言語:Java,PHP,Python

フォローする
フォローする
スポンサーリンク
WoW creators
タイトルとURLをコピーしました