最近、新規のサーバーを構築するのに、Ansibleを使用しているのですが、
どうやったら各サーバー毎にvarsファイルを読み込ませることが出来るのか。。
悩んでいたら、@tanuki_mujina様のこの記事を拝見しました。大変わかりやすい記事をありがとうございます!
Ansibleでサーバ毎にユニークな処理を行う
しかし、自分の場合は、名前解決のしていない新規サーバーを一から構築したかったので、
IPアドレスだけでどうにかできないものかと、考えた末、前述の記事をヒントにこういう方法を見つけました。
※多分もっといい方法はあるのかなと思います。。ご教授いただけるとすごく喜びます。
インベントリファイル
まずインベントリファイルを以下の形で記述します。
[TestServer1]
192.168.0.5
[TestServer1:vars]
ansible_ssh_user=Ansible
ansible_ssh_pass=******
ansible_sudo_pass=******
ansible_ssh_port=22
[TestServer2]
192.168.0.6
[TestServer2:vars]
ansible_ssh_user=Ansible
ansible_ssh_pass=******
ansible_sudo_pass=******
ansible_ssh_port=22
変数ファイルの作成
varsディレクトリを作成し、ファイル名を「リモート対象のIPアドレス.yml」とします。
test: testno1
test: testno2
Playbookの作成
以下のようにPlaybookを記述します。
前述の記事では、ansible_hostname を使い、読み込み対象のvarsファイルを動的に生成していたのですが、今回はIPアドレスを使用したいので、 inventory_hostname を使用します。
inventory_hostname には、インベントリファイルに書かれたホスト名が設定されます。
- hosts: all
vars_files:
- vars/{{ inventory_hostname }}.yml
tasks:
- debug: msg="TestServer={{test}}"
Playbookの実行
実行結果は以下のようになりました。
$ ansible-playbook -i hosts site.yml
PLAY [all] ****************************************************************************************
TASK [Gathering Facts] ****************************************************************************
ok: [192.168.0.6]
ok: [192.168.0.5]
TASK [debug] **************************************************************************************
ok: [192.168.0.5] => {
"msg": "TestServer=testno1"
}
ok: [192.168.0.6] => {
"msg": "TestServer=Testno2"
}
PLAY RECAP ****************************************************************************************
192.168.0.5 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.0.6 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ちゃんと各々のサーバー毎にユニークに変数が読み込まれていることがわかります。