ひとまとめの処理をループする
ことのはじまり
開発サーバに、開発環境を、開発ユーザ分だけ整える、というロールを構築する機会があったのですが、
ユーザごとに、一連の処理をループしたいな。。。
でもwith_itemsたくさん書くのもやだし、registerとか使うとごちゃごちゃになるなぁ。。。
とか、変に悩みました。
悩んだ結果、loop_controlという機能をつかうことで解決できました。
前提
- Ansible 2
- ベスト・プラクティスに倣い、roleを利用
- role名は
user_env
とする。
方法
Playbookのrolesには、通常通りの指定でOKです。
user_env.yml
---
- hosts: dev
become: True
roles:
- user_env
はい。いつも通りですね。
こうして、roles/user_env/tasks/main.yml
が、
tasksとして自動で読み込まれるわけですが、
この、roles/user_env/tasks/main.yml
が、ループの親となります。
roles/user_env/tasks/main.yml
---
- name: ユーザごとに一連の環境設定
include: user_env.yml
with_items:
- name: user_1
- name: user_2
loop_control:
loop_var: user
include
には、user_env.yml
が指定されています。
これで、単純なループと同様に、with_items
の要素分だけinclude
したtasks
が実行されます。
また、loop_control
下に、loop_var
をuser
として記述しています。
こうしておくことで、呼び出されたuser_env.yml
の内部で、ループの要素をuser
として展開できます。
roles/user_env/tasks/user_env.yml
- name: ユーザディレクトリがあるか確認
command: ls -la chdir=/home/{{ user.name }}
ignore_errors: True
changed_when: False
まとめ
これで、何重にもループ処理が可能です。
やったぜ。