hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

Ansibleの使い方(配列、連想配列編)



1 はじめに

本記事では、配列、連想配列を使った簡単なplaybookを作成して、その動作確認をしてみます。

(1) 配列(シーケンス)
配列は、先頭に「-」(ハイフン)を付け、その後にスペースを空けて値を記述します。以下は、配列名がtest_arrayの例です。

test_array:
  - user1
  - user2
  - user3

(2) 連想配列マッピング
連想配列とは、配列の添え字にスカラー以外のデータ型(例:文字列)を使用できる配列のことです。Key(キー)のあとに「:」(コロン)を付け、その後スペースを空けてValue(バリュー)を記述します。以下は、配列名がtest_associative_arrayの例です。

test_associative_array:
  key1: value1
  key2: value2
  key3: value3

2 検証環境

動作検証をするための環境は以下のとおりです。enp1s0はNICの名前です。

                          192.168.122.0/24
control(enp1s0) -------------------------------------(enp1s0) node1
               .220                               .87
ホスト名 役割
control コントロールノードとして動作します。Ansibleをインストールします。
node1 ターゲットノードとして動作します。モジュールが実行されるホストです

コントロールノード、ターゲットノードのAlmaLinux版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
AlmaLinux release 9.2 (Turquoise Kodkod)

コントロールノード、ターゲットノードのカーネル版数は以下のとおりです。

[root@server ~]# uname -r
5.14.0-284.11.1.el9_2.x86_64

3 事前準備

ansibleのインストールや公開鍵認証の設定方法などは、Ansibleの使い方(モジュール編) - hana_shinのLinux技術ブログを参照してください。

4 インベントリファイルの作成

管理対象となるサーバの一覧を記述したインベントリファイルを作成します。この後の動作確認でも、このインベントリファイルを使用します。node1 はターゲットノードのホスト名であり、ansible_host はターゲットノードのIPアドレスを定義しています。

[root@control ~]# cat hosts.ini
[nodes]
node1 ansible_host=192.168.122.220

5 配列の使い方

5.1 その1

Varsセクションで配列usersを定義します。Tasksセクションでは、loopディレクティブを使って配列に対して繰り返し処理を実行します。この繰り返し処理の中で、配列usersの要素であるuser1とuser2をuserモジュールのパラメータとして渡すことで、user1とuser2を作成します。なお、モジュールの使い方は、Ansibleの使い方(モジュール編) - hana_shinのLinux技術ブログを参照してください。

[root@control ~]# cat test.yml
- name: Sample Playbook
  hosts: nodes
  vars:
    users:
      - user1
      - user2
  tasks:
    - name: Add users
      ansible.builtin.user:
        name: "{{ item }}"
        state: present
      loop: "{{ users }}"

playbookを実行します。

[root@control ~]# ansible-playbook -i hosts.ini test.yml

PLAY [Sample Playbook] ********************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [node1]

TASK [Add users] **************************************************************************************
changed: [node1] => (item=user1)
changed: [node1] => (item=user2)

PLAY RECAP ********************************************************************************************
node1                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@control ~]#

ターゲットノードで作成したユーザを確認すると、user1とuser2が作成されたことがわかります。

[root@node1 ~]# id user1
uid=1000(user1) gid=1000(user1) groups=1000(user1)
[root@node1 ~]# id user2
uid=1001(user2) gid=1001(user2) groups=1001(user2)

あと始末をします。

[root@node1 ~]# userdel user1
[root@node1 ~]# userdel user2

5.2 その2

Varsセクションで配列usersを定義します。Tasksセクションでは、loopディレクティブを使って配列に対して繰り返し処理を実行します。この繰り返し処理の中で、配列usersの要素であるユーザ名(user1,user2)とUID(5000,5001)をuserモジュールのパラメータとして渡すことで、user1(UID=5000)とuser2(UID=5001)を作成します。

[root@control ~]# cat test.yml
- name: Sample Playbook
  hosts: nodes
  vars:
    users:
      - name: user1
        uid: 5000
      - name: user2
        uid: 5001
  tasks:
    - name: Add users with specific UID.
      ansible.builtin.user:
        name: "{{ item.name }}"
        uid: "{{ item.uid }}"
        state: present
      loop: "{{ users }}"

playbookを実行します。

[root@control ~]# ansible-playbook -i hosts.ini test.yml

PLAY [Sample Playbook] ********************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [node1]

TASK [Add users with specific UID.] *******************************************************************
changed: [node1] => (item={'name': 'user1', 'uid': 5000})
changed: [node1] => (item={'name': 'user2', 'uid': 5001})

PLAY RECAP ********************************************************************************************
node1                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@control ~]#

idコマンドを使って作成したユーザを確認すると、user1(uid=5000)とuser2(uid=5001)が作成されたことがわかります。

[root@node1 ~]# id user1
uid=5000(user1) gid=5000(user1) groups=5000(user1)
[root@node1 ~]# id user2
uid=5001(user2) gid=5001(user2) groups=5001(user2)

あと始末をします。

[root@node1 ~]# userdel user1
[root@node1 ~]# userdel user2

6 連想配列の使い方

6.1 その1

連想配列の使い方を確認するplaybookを作成します。Varsセクションで連想配列を定義します。Tasksセクションでは、loopディレクティブを使って連想配列に対して繰り返し処理を実行します。この繰り返し処理の中で、連想配列のキーとバリューをdebugモジュールのパラメータとして渡します。

[root@control ~]# vi test.yml
[root@control ~]# cat test.yml
- name: Sample Playbook
  hosts: nodes
  vars:
    test_associative_array:
      key1: value1
      key2: value2
      key3: value3
  tasks:
    - name: Print values from the associative array
      ansible.builtin.debug:
        msg: "{{ item.key }}: {{ item.value }}"
      loop: "{{ test_associative_array | dict2items }}"

playbookを実行すると、連想配列で定義してキーとバリューが出力されていることが確認できます。

[root@control ~]# ansible-playbook -i hosts.ini test.yml

PLAY [Sample Playbook] **********************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************
ok: [node1]

TASK [Print values from the associative array] **********************************************************************************
ok: [node1] => (item={'key': 'key1', 'value': 'value1'}) => {
    "msg": "key1: value1"
}
ok: [node1] => (item={'key': 'key2', 'value': 'value2'}) => {
    "msg": "key2: value2"
}
ok: [node1] => (item={'key': 'key3', 'value': 'value3'}) => {
    "msg": "key3: value3"
}

PLAY RECAP **********************************************************************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@control ~]#

6.2 その2

連想配列の使い方を確認するplaybookを作成します。Varsセクションで連想配列を定義します。Tasksセクションで、指定したキーに対するバリューを表示します。バリューをdebugモジュールのパラメータとして渡します。

[root@control ~]# cat test.yml
- name: Sample Playbook
  hosts: nodes
  vars:
    test_associative_array:
      key1: value1
      key2: value2
      key3: value3
  tasks:
    - name: Print value of key2 from the associative array
      ansible.builtin.debug:
        msg: "{{ test_associative_array['key2'] }}"

playbookを実行すると、キー (key2) に対応するバリュー (value2) が出力されていることが確認できます。

[root@control ~]# ansible-playbook -i hosts.ini test.yml

PLAY [Sample Playbook] ***************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************
ok: [node1]

TASK [Print value of key2 from the associative array] ********************************************************************
ok: [node1] => {
    "msg": "value2"
}

PLAY RECAP ***************************************************************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@control ~]#