タイトルの通りです。手癖で 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.
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:キャッチアップできてなくて反省