ゆるい感じのプログラムを書きたい。

プログラムの敷居を下げて、多くの人が開発出来るように色々書いていきます!

【Playbook概要】変数について 2章:繰り返し実行

2.繰り返し実行

複数のファイルをコピーしたり、複数のユーザを追加したい場合
追加したい数だけ対応するモジュールを書くことで実現できるが、Playbookが長く読みづらくなる。
その際は、以下のようにタスクの繰り返しを扱う機能を使うと良い。


2.1.単純な繰り返しを行う「with_items」

userコマンドを使い複数のユーザを追加する場合
with_itemsをタスクに指定することで、一括で追加可能

  • 記載例
tasks:
  user: name={{ item }}
  with_items:
    - hoge
    - hogehoge

with_itemsに渡されたシーケンスの内容が順にitemという名称の変数に設定、繰り返し実行


以下のように あらかじめシーケンスを変数で作成し、with_itemsで指定することも可能

  • 記載例
vars:
  users:
    - hoge
    - hogehoge
tasks:
  user: name={{ item }}
  with_items: "{{ users }}"

ユーザ名と一緒にパスワードを指定したい場合は以下の通り + 記載例

vars:
  users:
    - name: hoge
      pasword: gbfgjghjghkhhk
    - name: hogejpge
      pasword: gbfgjghjghkhhk
tasks:
  - user: name={{ item.name }} password={{ item.password }}
    with_items:"{{ users }}"    


2.2.マッピングを繰り返す「with_dict」

with_itemsでは以下のようなマッピングのすべての要素を繰り返したい場合は使えません。

  • 記載例
vars:
  users:
    admin:
      - name: hoge
        password: gbfgjghjghkhhk
    workes:
      - name: hogehoge
        password:  gbfgjghjghkhhk

マッピングを繰り返しに利用する場合with_itemsの代わりにwith_dictを利用
with_dictを利用すると、with_itemsと同様にitems変数からマッピングのキーとバリューを取得可能

変数を指定
  • 記載例
vars:
  users:
    admin:
      - name: hoge
        password: gbfgjghjghkhhk
    workes:
      - name: hogehoge
        password:  gbfgjghjghkhhk
with_dictの記載例は以下の通り
  • 記載例
tasks:
  - user: name={{ itme.value.name }} password={{ iteme.value.password }}
    with_dict:"{{ users }}"

キーを取得するにはitem.keyを指定
バリューを取得するにはitem_valueを指定


2.3.ワイルドカードを使って繰り返す「with_filelob」

ある拡張子のファイルだけコピーしたい場合

以下のようにsrc引数にはワイルドカードを利用することは出来ません。
実行すると*.txtという名称のファイルがコピーされます。

  • 記載例
tasks:
  - copy: src=/home/vagrant/*.txt dest=/home/hoge/text/


解決方法として、with_fileglobを利用します。
with_itemsと同じようにシーケンスでファイル指定することで、ヒットしたファイルパスだけタスクが繰り返し実行

with_fileglobの記載例は以下の通り

  • 記載例
tasks:
  - copy: src={{ item }} dest=/home/hoge/txt/
    with_fileglob
      - /home/vagrant/*/txt