【Infrastructure as code】Ansible入門その6

どうも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でした。

 

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

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

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