LoginSignup
5
4

More than 5 years have passed since last update.

Ansibleでリスト変数をループ処理する方法

Posted at

やりたかったこと

Ansibleを用いて定義したリスト変数(配列変数)をPlaybook実行時にリスト変数内の値ごとにループ処理を行いたかった。リスト変数で定義した複数の名前に対して複数ディレクトリを作成するという処理を例にまとめておく。

実現方法

調べたり実行してみたりした所、以下の3つの方法があったのでそれぞれについて記載していく。
1. Playbookファイルに直接書く方法(yaml形式)
2. inventoryファイルに書く方法(yaml形式)
3. inventoryファイルに書く方法(ini形式?)

どの実現方法も以下の方法で実行している。

# ansible-playbook -i <inventoryファイル> <Playbookファイル>

Playbookファイルに直接書く方法(yaml形式)

Playbookファイル上で変数宣言するにはvarsセクションにリスト変数を定義しておきます。ディレクトリを複数作成するPlaybookファイルは以下のように書きます。

mkdir1.yml
---
- 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ファイルについては以下のように書きます。

inventory1
[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セクションを削除して以下のように修正しています。

mkdir2.yml
---
- 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形式で書いた場合は以下となります。

inventory2.yml
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ファイルのみ以下に書きます。

inventory3
[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つの方法でリスト変数を使用し、ループ処理する方法についてまとめてみた。書きやすい方法を選択して実装できればと思います。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4