ときどきAnsible日記

主にITインフラ基盤の自動化に関する事を書いているブログです

with_itemsの使い方

お疲れ様です。伊藤です。
すいません、サボっていたわけではないのですが1ヶ月...ってか丸2ヶ月ぶりの更新です。サボって...たのかな...


Playbook内で繰り返しを使いたい場合があります。たとえばユーザを作成する際に変数にユーザ名を複数入れても作成する側で繰り返し処理を入れていないと1ユーザしか作成されません。プログラムを書いたことがある人であれば当たり前のことですが、インフラとなるとなかなかプログラミング経験がない方も多いので、苦労されるかもわかりません。そーゆー意味にでも、今はちょっとコードを書けるインフラ技術者が引く手数多だと聞きます。

では繰り返し処理の書き方ですが、結構簡単です。が、種類がいっぱいあるので、なれないといやな感じがします。でもとりあえずこれさえ覚えておけばOK。with_itemsです。まあ普通に調べるとこれが出てきますね。ただし、使い方は簡単なのですが、その周りが少々わかりづらい部分がありますので、最後にちょっと説明出来ればと思います。

まずは変数の宣言ですが、以下のような形になります。

vars: 
 user_info:
   user_name: test_user

varsは変数宣言の先頭です。varsフォルダのmain.ymlに記載する際には不要ですが、Playbook内に記載する際には必要となります。
実際の変数はuser_infoからです。user_infoの配下にuser_nameという変数があり、そこにtest_userという値を入れています。書き方を変えると
user_info.use_name=test_user
という感じです。こっちのほうがわかりやすい人が多いかと思います。実際にPlaybook内で使用するにはこちらの形になります。

また、これでuser_nameを複数持たせたい場合は

vars: 
 user_info:
   - user_name: test_user1
   - user_name: test_user2

という感じで先頭に‐(ハイフン)をつけます。
さらにこのユーザごとに変数を増やしたい場合は

vars: 
 user_info:
   - user_name: test_user1
     user_id: 1
     user_group: 1
   - user_name: test_user2
     user_id: 2
     user_group: 2

という感じで増やしていきます。この辺の理解がないと結構混乱します。

データベースっぽく表現するとこんな感じになります。
f:id:pj_doaa:20180403162514p:plain

そしてこの変数をUserを作るモジュールに当てはめていきます。単純に繰り返しをしない場合は下記のようになります。

---
- name: user make
  user:
    name: '{{ user_info.user_name }}'
    uid: '{{ user_info.user_id | default(omit) }}'
    group: '{{ user_info.user_group | default(omit) }}'
    state: 'present'

変数は{{}}に囲まれた形で表記されます。default(omit)はこの変数定義がなかった場合にはデフォルト値を入れる、という意味です。このパイプの書き方はjinja2のフィルターという機能を使っています。まあ慣れれば難しいものではないですね。

で、これを繰り返し表現で書くとこんな感じ

---
- name: user make
  user:
    name: '{{ item.user_name }}'
    uid: '{{ item.user_id | default(omit) }}'
    group: '{{ item.user_group | default(omit) }}'
    state: 'present'
  with_items: "{{ user_info }}"

with_itemsで宣言した変数の中身がitemという名前で置き換えられて展開されます。こうしておけば変数に追加するたびにどんどんユーザが作成されていくというわけです。非常に簡単ですね。

ただ冒頭で書いたちょっとハマるとしては、変数と連携しておかないとエラーになるというところです。途中で変数にハイフンをつけて複数入力可能にしましたが、あれをリスト形式と呼びます。変数がリストの場合は繰り返しにしておかないとエラーになります。また、リスト形式でない変数を繰り返しに入れるとエラーになります。このあたりやや注意が必要です。

取り合えずwith_itemsについては以上です。機会があればほかの繰り返し表現についても記載していきます。例えばwith_sequenceなどは連番で繰り返しなどが出来て便利なのですがあまり記載がなかったりするので…それ辺はまた今度書きます。

お疲れ様でした。