もりはやメモφ(・ω・ )

ITとか読書感想文とか

Ansibleの繰り返しは with_xxx より loop を使った方が良い時代になってた

タイトルの通りです。手癖で with_items でループ処理を書きかけましたが、ドキュメントのサンプルでより良い書き方がないかと読んだところ loop を推奨されていてびっくりしたのでメモです。 具体的には以下の文章がありました。

We added loop in Ansible 2.5. It is not yet a full replacement for with_<lookup> , but we recommend it for most use cases.

docs.ansible.com

with_<lookup> の一部処理が置き換えできていない様ですが、一般的なユースケースでは loop を推奨するとあります。しかも v2.5 に追加されているそうです。 v2.5 というと、2018/03/28にリリースされているので既にこなれた機能と言えるでしょう。*1

というわけで今後繰り返し系の処理を書くなら、まずは loop を使っていきましょう。 以下はよくやりそうなサンプルです。

複数ファイルをコピーする

まず group_vars などでファイルの一覧を渡して、

---
# varsの設定
copyfiles:
  - src:  usr/local/hoge/fuga
    dest: /usr/local/hoge/fuga
  - src:  usr/local/hoge/piyo
    dest: /usr/local/hoge/piyo

tasks で loop を利用して繰り返し処理をします。

---
- name: Copy files
  ansible.builtin.copy:
    src: "{{ item.src }}"
    dest: "{{ item.dest }}"
    owner: "{{ item.owner | default('root') }}"
    group: "{{ item.group | default('root') }}"
    mode:  "{{ item.mode  | default('0775')  }}"
    backup: "{{ item.backup | default('yes') }}"
  loop:
    "{{ copyfiles | default([]) }}"
  tags:
    - copyfiles

余談 dict の書き方

loop で処理する dict 変数について、今までは以下の様な書き方しかしてきませんでしたが、同僚氏の書き方の方がみやすいので今後は基本的に上述したものにしようと思います。 キーが多いと横幅がどこまで広がってしまって見辛いのですよね... 行がひとつのアイテムを示すのでわかりやすい面もありケースバイケースとは思うのですが、見辛いことの方が多い気がします。

copyfiles:
  - { src: usr/local/hoge/fuga, dest: /usr/local/hoge/fuga }
  - { src: usr/local/hoge/piyo, dest: /usr/local/hoge/piyo }

*1:キャッチアップできてなくて反省