gitkadoの気まぐれ日記

島根在住エンジニアが何かに興味を持ったらブログを更新します

Ansible-playbookのwith_itemsでblock内をまとめて回したい

立ちはだかった壁

普段 ansibleAWX を使用して環境構築することが多いです。
ある日のこと「with_itemsをblock全体に適用っと。」思ったがダメだった。
どうやらblockに対してwith_itemsは指定できないらしい。

# main.yml(動きそうだが動かない)
---
name: ユーザ作って云々
block:
  - name: userグループ作成
    group:
      name: "{{ item.name }}"
      gid: "{{ item.gid }}"

  - name: user作成
    user:
      name: "{{ item.name }}"
      uid: "{{ item.uid }}"
      groups: "{{ item.gid }},wheel"
      password: "{{ item.pw | password_hash('sha512') }}"
      update_password: on_create
      generate_ssh_key: yes

  - name: 貼付用ユーザ鍵テキスト取得
    shell: "cat /home/{{ item.name }}/.ssh/id_rsa.pub"
    register: key_text

  - name: 鍵で云々
    shell: "echo {{ key_text }}"
with_items:
  - { name: "admin_a", uid: "1001", gid: "1001", pw: "password" }
  - { name: "admin_b", uid: "1002", gid: "1002", pw: "password" }

解決策

with_itemsで繰り返し実行する内容を別ファイルに切り出します。
切り出したファイルをincludeで呼び出せば無事解決!
with_items毎にregisterを生成したい場合も対応可能という、素晴らしい。

# main.yml
---
- name: ユーザ作って云々
  include: user_create.yml
  with_items:
    - { name: "admin_a", uid: "1001", gid: "1001", pw: "password" }
    - { name: "admin_b", uid: "1002", gid: "1002", pw: "password" }
  loop_control:
    loop_var: user
# user_create.yml
---
- name: userグループ作成
  group:
    name: "{{ user.name }}"
    gid: "{{ user.gid }}"

- name: user作成
  user:
    name: "{{ user.name }}"
    uid: "{{ user.uid }}"
    groups: "{{ user.gid }},wheel"
    password: "{{ user.pw | password_hash('sha512') }}"
    update_password: on_create
    generate_ssh_key: yes

- name: 貼付用ユーザ鍵テキスト取得
  shell: "cat /home/{{ user.name }}/.ssh/id_rsa.pub"
  register: key_text

- name: 鍵で云々
  shell: "echo {{ key_text }}"

終わりに

ansibleさん、
block+with_itemsが実現できる日をお待ちしております。