やりたかったこと
Ansibleを用いて定義したリスト変数(配列変数)をPlaybook実行時にリスト変数内の値ごとにループ処理を行いたかった。リスト変数で定義した複数の名前に対して複数ディレクトリを作成するという処理を例にまとめておく。
実現方法
調べたり実行してみたりした所、以下の3つの方法があったのでそれぞれについて記載していく。
- Playbookファイルに直接書く方法(yaml形式)
- inventoryファイルに書く方法(yaml形式)
- inventoryファイルに書く方法(ini形式?)
どの実現方法も以下の方法で実行している。
# ansible-playbook -i <inventoryファイル> <Playbookファイル>
Playbookファイルに直接書く方法(yaml形式)
Playbookファイル上で変数宣言するにはvarsセクションにリスト変数を定義しておきます。ディレクトリを複数作成するPlaybookファイルは以下のように書きます。
---
- hosts: servers
become: yes
gather_facts: false
vars:
directories:
- test1
- test2
tasks:
- name: Create test directory
file:
path: '/tmp/{{ item }}'
owner: 'root'
group: 'root'
mode: '0644'
state: directory
with_items: '{{ directories }}'
リスト変数をPlaybook上でループ処理するにはwith_itemsモジュールの配下に書くのでは無く、上記のようにwith_items: '{{ リスト変数 }}'
と書くことで変数を展開してくれるようです。
inventoryファイルについては以下のように書きます。
[servers]
10.0.0.11
10.0.0.12
[servers:vars]
ansible_user=user
ansible_become_user: root
ansible_become_pass: ****
ansible_ssh_private_key_file: ~/.ssh/id_rsa
inventoryファイルに書く方法(yaml形式)
Playbookファイルではなくinventoryファイルで変数宣言する場合、Playbookと同様にinventoryファイルをyaml形式で書く方法があります。Playbookファイルはvarsセクションを削除して以下のように修正しています。
---
- hosts: servers
become: yes
gather_facts: false
tasks:
- name: Create test directory
file:
path: '/tmp/{{ item }}'
owner: 'root'
group: 'root'
mode: '0644'
state: directory
with_items: '{{ directories }}'
inventoryファイルをyaml形式で書いた場合は以下となります。
servers:
hosts:
10.0.0.11
directories:
- test1
- test2
10.0.0.12
directories:
- test3
- test4
vars:
ansible_user: user
ansible_become_user: root
ansible_become_pass: ****
ansible_ssh_private_key_file: ~/.ssh/id_rsa
inventoryファイルに書く方法(ini形式?)
従来のinventoryファイルの書き方でもリスト変数を定義するには以下のように変数を[]で囲んで定義する書き方で実現できます(この方法が一番やりたかったが情報が見当たらなかったです)。Playbookファイルはyaml形式の場合と同様なので省略し、invenntoryファイルのみ以下に書きます。
[servers]
10.0.0.11 directories='["test1", "test2"]'
10.0.0.12 directories='["test3", "test4"]'
[servers:vars]
ansible_user=user
ansible_become_user=root
ansible_become_pass=****
ansible_ssh_private_key_file=~/.ssh/id_rsa
まとめ
3つの方法でリスト変数を使用し、ループ処理する方法についてまとめてみた。書きやすい方法を選択して実装できればと思います。