Ansibleを使うと、複数のサーバで一斉に同じ処理を実行することができます。しかし、IPアドレスを設定するなど、サーバ毎に異なる処理を実行したい場合には、ちょっとした工夫が必要です。
以下では、処理対象のサーバ毎にユニークな値の変数を記述したファイルを準備し、playbook からそれを読み込む方法を説明します。
サンプルの内容
2台のサーバ tanuki と mujina に対して、各々、内容が異なる専用の変数ファイルを用意し、それらを読み込んで処理を実行する playbook を作成します。
インベントリファイルの作成
インベントリファイル ansible_hosts にサーバを記述します。
tanuki
mujina
変数ファイルの配置先ディレクトリの作成
各サーバの変数ファイルを配置するための vars ディレクトリを作成します。
# mkdir vars
変数ファイルの作成
varsディレクトリ配下に各サーバ毎に変数ファイルを作成します。ファイル名は ノード名.yml とします。内容としては、各サーバ固有のIPアドレスを my_iapddr 変数に設定するというものです。
vars/tanuki.yml
---
my_ipadder: 192.168.100.61
vars/mujina.yml
---
my_ipadder: 192.168.100.62
サンプル playbook の作成
サンプルとして、vars_files で各サーバ専用の変数ファイルを読み込み、debug モジュールで変化の内容を表示させる playbook を作成します。
---
- hosts: all
vars_files:
- vars/{{ansible_hostname}}.yml
tasks:
- debug: msg="my_ipaddr = {{ansible_hostname}}/{{my_ipaddr}}"
ここでは、読み込み対象のファイル名をマジック変数 ansible_hostname から動的に生成しています。ansible_hostname には、各ノードで hostname コマンドを実行した結果が設定されます。
サンプル playbook の実行
サンプル playbook の実行結果は以下のようになります。
# ansible-playbook -i ansible_hosts foreach.yml -u root -k
SSH password:
PLAY [all] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [tanuki]
ok: [mujina]
tanuki: importing vars/tanuki.yml
mujina: importing vars/mujina.yml
TASK: [debug msg="my_ipaddr = {{ansible_hostname}}/{{my_ipaddr}}"] *********
ok: [tanuki] => {
"msg": "my_ipaddr = tanuki/192.168.100.61"
}
ok: [mujina] => {
"msg": "my_ipaddr = mujina/192.168.100.62"
}
PLAY RECAP ********************************************************************
tanuki : ok=2 changed=0 unreachable=0 failed=0
mujina : ok=2 changed=0 unreachable=0 failed=0
各々のサーバ毎に専用の変数ファイルが読み込まれ、サーバ毎にユニークな値が表示されていることがわかります。