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 ~]#
Y 参考図書
本記事の作成に以下の図書を参考にしました。
Ansible実践ガイド 第4版[基礎編] impress top gearシリーズ
Z 参考情報
私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ
Ansible の使い方
Ansible Playbookとはなにか [書き方 | 基本 | YAML] - APC Automation blog
Ansible マジック変数の一覧と内容 #Ansible - Qiita