いんふら女子めも

備忘録です

ansible-playbookのwith_itemsが肥大化するのを防ぎたい

概要

Ansible-playbookの1つのタスクで複数のユーザーを作成したり、色んなパッケージをインストールしたいときに役立つのがループ処理です。その代表的なパラメータがwith_itemsではありますが、このパラメータもうまく使わないとwith_itemsに羅列するパラメータが膨大になってしまい、1つのタスクだけ長ったらしくなります。 簡潔なタスクを書くためにwith_itemsの使い方を工夫したのでそのときのメモです。

docs.ansible.com

環境

  • 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 }}

追記

もっと良い書き方がありました。 上記の書方だと、変数をnamevalueで設定しないといけないので、ちょっとめんどくさいんですよね。そこで、with_itemsではなくてwith_dictを使うことで変数名と値をkeyvalueで取り出すことが可能となり以下のようにすっきり書くことができます。

# 変数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 }}

以上