どうも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_itemsとwith_listの結果が一緒なので違いは?と思ったと思いますが、
with_itemsの特徴はflattenされる点です。
playbook.yml
--- - hosts: all tasks: - debug: msg: "loop:{{ item }}" with_items: - [ aaa, ddd ] - bbb - ccc
1つ目のパラメータがaaaとdddでネストされていても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でした。