どうもKuboです。
本日は前回に引き続きループの話
多重ループはどうしたら出来る?
二重のループを行う時Ansibleでは、「with_nested」、「with_together」または、「with_subelements」などで実現出来ますが、更にループしたい時どうしたらいいのだろうか?
includeとloop_varで多重ループを実現
まずplaybook.ymlを書いていきます。
playbook.yml
--- - hosts: all tasks: - include: inner.yml with_list: - aaa - bbb - ccc loop_control: loop_var: loop_hoge
includeで外部ファイルを読み込みます。 そして「with_list」でループそしてその値を「loop_control」の”loop_var”でloop_hogeという変数に代入します。
inner.yml
--- - debug: msg: "loop:{{ loop_hoge }} and {{ item }}" with_list: - aaa - bbb - ccc
読み込み先のファイル「inner.yml」ではloop_varで代入したloop_hogeが使えるのでこれでどんどんincludeしていけば理論上無限に多重ループが出来ちゃいます。
実行結果
$ ansible-playbook -i inventory playbook.yml PLAY [all] ************************************************************************************************************************************************************* TASK [Gathering Facts] ************************************************************************************************************************************************* ok: [localhost] TASK [include] ********************************************************************************************************************************************************* included: /home/ec2-user/ansible/inner.yml for localhost included: /home/ec2-user/ansible/inner.yml for localhost included: /home/ec2-user/ansible/inner.yml for localhost TASK [debug] *********************************************************************************************************************************************************** ok: [localhost] => (item=aaa) => { "msg": "loop:aaa and aaa" } ok: [localhost] => (item=bbb) => { "msg": "loop:aaa and bbb" } ok: [localhost] => (item=ccc) => { "msg": "loop:aaa and ccc" } TASK [debug] *********************************************************************************************************************************************************** ok: [localhost] => (item=aaa) => { "msg": "loop:bbb and aaa" } ok: [localhost] => (item=bbb) => { "msg": "loop:bbb and bbb" } ok: [localhost] => (item=ccc) => { "msg": "loop:bbb and ccc" } TASK [debug] *********************************************************************************************************************************************************** ok: [localhost] => (item=aaa) => { "msg": "loop:ccc and aaa" } ok: [localhost] => (item=bbb) => { "msg": "loop:ccc and bbb" } ok: [localhost] => (item=ccc) => { "msg": "loop:ccc and ccc" } PLAY RECAP ************************************************************************************************************************************************************* localhost : ok=7 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
最後に
Ansibleの多重ループの方法がもっとスマートなやり方があるんじゃないかと納得していないながらご紹介させて頂きました。
もっといい方法がありましたらコメント欄にでもよろしくお願いします。
以上、Kuboでした。