概要
Ansible-playbookの1つのタスクで複数のユーザーを作成したり、色んなパッケージをインストールしたいときに役立つのがループ処理です。その代表的なパラメータがwith_items
ではありますが、このパラメータもうまく使わないとwith_items
に羅列するパラメータが膨大になってしまい、1つのタスクだけ長ったらしくなります。
簡潔なタスクを書くためにwith_items
の使い方を工夫したのでそのときのメモです。
環境
- MacOS 10.14.6
- Ansible 2.5.0
解決案
以前のタスクの書き方
最初は以下のようなタスクを書いていました。
環境変数の設定で変数名を被らせることはできないので、どんどんwith_items
以下が増える一方でした。
# 変数yamlファイル test1: xxx test2: xxx test3: xxx test4: xxx # main.yml - name: setting env lineinfile: dest: /etc/environment line: "export {{ item }}={{ lookup('vars', item) }}" with_items: - test1 - test2 - test3 - test4
新しい書き方
変数定義の書き方をちょっと工夫すれば、タスクを簡潔に書くことができるようになりました。 辞書型の変数env_listに環境変数名とその値を入れ込むことで、タスクをかなりスッキリした形で書くことができます。
# 変数yamlファイル env_list: - name: test1 value: xxx - name: test2 value: xxx - name: test3 value: xxx - name: test4 value: xxx # main.yml - name: setting env lineinfile: dest: /etc/environment line: "export {{ item.name }}={{ item.value }}" with_items: {{ env_list }}
追記
もっと良い書き方がありました。
上記の書方だと、変数をname
とvalue
で設定しないといけないので、ちょっとめんどくさいんですよね。そこで、with_items
ではなくてwith_dict
を使うことで変数名と値をkey
とvalue
で取り出すことが可能となり以下のようにすっきり書くことができます。
# 変数yamlファイル env_list: - test1: xxx - test2: xxx - test3: xxx - test4: xxx # main.yml - name: setting env lineinfile: dest: /etc/environment line: "export {{ item.key }}={{ item.value }}" with_dict: {{ env_list }}
以上