loop_control: extended: yes
Nested List変数をloopする時の挙動が違う
例: 共通の値を、default.yml に定義して、他のyamlでマージして使いたい。example_confでは3回ループして欲しい。
default_conf: - name: var1 - name: var2
example_conf: - "{{ default_conf }}" - name: var3
- hosts: localhost connection: local gather_facts: false vars_files: - default.yml - overwrite.yml tasks: - debug: var: example_conf - name: with_items debug: var: item with_items: "{{ example_conf }}" - name: with_list debug: var: item with_list: "{{ example_conf }}" - name: loop debug: var: item loop: "{{ example_conf }}" - name: loop flatten(levels=1) debug: var: item loop: "{{ example_conf | flatten(levels=1) }}"
ansible-playbook playbook.yml TASK [debug] ***************************************************************************************************************************************** ok: [localhost] => { "example_conf": [ [ { "name": "var1" }, { "name": "var2" } ], { "name": "var3" } ] } TASK [with_items] ************************************************************************************************************************************ ok: [localhost] => (item={u'name': u'var1'}) => { "ansible_loop_var": "item", "item": { "name": "var1" } } ok: [localhost] => (item={u'name': u'var2'}) => { "ansible_loop_var": "item", "item": { "name": "var2" } } ok: [localhost] => (item={u'name': u'var3'}) => { "ansible_loop_var": "item", "item": { "name": "var3" } } TASK [with_list] ************************************************************************************************************************************* ok: [localhost] => (item=[{u'name': u'var1'}, {u'name': u'var2'}]) => { "ansible_loop_var": "item", "item": [ { "name": "var1" }, { "name": "var2" } ] } ok: [localhost] => (item={u'name': u'var3'}) => { "ansible_loop_var": "item", "item": { "name": "var3" } } TASK [loop] ****************************************************************************************************************************************** ok: [localhost] => (item=[{u'name': u'var1'}, {u'name': u'var2'}]) => { "ansible_loop_var": "item", "item": [ { "name": "var1" }, { "name": "var2" } ] } ok: [localhost] => (item={u'name': u'var3'}) => { "ansible_loop_var": "item", "item": { "name": "var3" } } TASK [loop flatten(levels=1)] ************************************************************************************************************************ ok: [localhost] => (item={u'name': u'var1'}) => { "ansible_loop_var": "item", "item": { "name": "var1" } } ok: [localhost] => (item={u'name': u'var2'}) => { "ansible_loop_var": "item", "item": { "name": "var2" } } ok: [localhost] => (item={u'name': u'var3'}) => { "ansible_loop_var": "item", "item": { "name": "var3" } }
複雑な変数の場合、ループ中に非常に大きい出力になり見難い。
「no_log: yes」では全部抑制されてしまい、不便。
loop_control: label: "{{ item.name }}"
- hosts: localhost gather_facts: false vars: servers: - server1 - server2 tasks: - name: create servers, pause 3s before creating next debug: msg: "{{ item }}" with_items: "{{ servers }}" loop_control: pause: 3
- hosts: localhost gather_facts: no connection: local vars: - users: - name: user01 groups: - group01 - name: user02 groups: - group01 - group02 - name: user03 tasks: - debug: msg: "name={{ item.0.name }}, group={{ item.1 }}" with_subelements: - "{{ users }}" - groups - skip_missing: True
ansible-playbook playbook.yml ... TASK [debug] ************************************************************************************************************************************ ok: [127.0.0.1] => (item=[{u'name': u'user01'}, u'group01']) => { "msg": "name=user01, group=group01" } ok: [127.0.0.1] => (item=[{u'name': u'user02'}, u'group01']) => { "msg": "name=user02, group=group01" } ok: [127.0.0.1] => (item=[{u'name': u'user02'}, u'group02']) => { "msg": "name=user02, group=group02" }
localに置いた不特定のファイルをワイルドカード(*,?)を使って処理したい時に使える。 remoteのファイルは非対応。
- name: give users access to multiple databases debug: var="name={{ item[0] }} priv={{ item[1] }}" with_nested: - [ 'alice', 'bob' ] - [ 'clientdb', 'employeedb' ]
TASK: [give users access to multiple databases] ******************************* ok: [127.0.0.1] => (item=['alice', 'clientdb']) => { "item": [ "alice", "clientdb" ], "var": { "name=alice priv=clientdb": "name=alice priv=clientdb" } } ok: [127.0.0.1] => (item=['alice', 'employeedb']) => { "item": [ "alice", "employeedb" ], "var": { "name=alice priv=employeedb": "name=alice priv=employeedb" } } ok: [127.0.0.1] => (item=['bob', 'clientdb']) => { "item": [ "bob", "clientdb" ], "var": { "name=bob priv=clientdb": "name=bob priv=clientdb" } } ok: [127.0.0.1] => (item=['bob', 'employeedb']) => { "item": [ "bob", "employeedb" ], "var": { "name=bob priv=employeedb": "name=bob priv=employeedb" } }