一般的にはPlaybookの方の書き方から確認していくことが多そうですが、Inventoryの方がまず押さえやすそうなので本ブログではこちらから確認していきます。
Inventory
基本的な記述
InventoryではPlaybookの指示(処理)を実行するターゲットノードの指定を行います。
Inventoryとして作成するファイルにはターゲットノードやIPアドレスを記述することになります。
・IPアドレスで記述
#Inventory hosts-file 192.168.142.11 192.168.142.12 192.168.142.13
・ホスト名で記述
#Inventory hosts-file
web-server1
web-server2
db-server1
ホスト名で記述した場合のPlaybookの記述例と実行例を以下に示します。
--- - hosts: web-server1 db-server1 tasks: - name: test-playbook file: path: /tmp/hoge.txt state: touch
[ansusr@ctl-node test-task]$ ansible-playbook -i hosts test-bool.yml PLAY [web-server1 db-server1] ************************************************** TASK [Gathering Facts] ********************************************************* ok: [db-server1] ok: [web-server1] TASK [test-playbook] *********************************************************** changed: [db-server1] changed: [web-server1] PLAY RECAP ********************************************************************* db-server1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 web-server1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ここからは分かる基本的なこととしてはターゲットノードとしては「Inventory≧Playbook」になるということでしょうか。
例えssh接続できるホスト名やIPアドレスをPlaybook側で指定しても、Inventory側で指定されていない場合にはエラーになり実行できません。
つまり、実行可能なAnsibleで実行対象として指定可能なホスト名を記述しておくものと認識しておくというところでしょうか。
ホストグループ
Inventoryにはターゲットノードとなるホスト名を記述していきます。
自分が試しに使用しているテスト環境程度はせいぜい数ホストなので上記のような書き方でも不便は感じませんが、対象となるホストが多い大規模システム群を扱う場合にはホストの管理だけでも煩雑になります。
そのような際にはホストをホストグループに所属させることによって、ホストグループ単位で指定することなどができます。
・ホストグループの例
#Inventory hosts-file [web] web-server1 web-server2 [db] db-server1
・Playbook
--- - hosts: web tasks: - name: test-playbook file: path: /tmp/hoge.txt state: touch
・実行例
[ansusr@ctl-node test-task]$ ansible-playbook -i hosts test-pb.yml PLAY [web] ********************************************************************* TASK [Gathering Facts] ********************************************************* ok: [web-server2] ok: [web-server1] TASK [test-playbook] *********************************************************** changed: [web-server2] changed: [web-server1] PLAY RECAP ********************************************************************* web-server1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 web-server2 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ホスト変数
InventoryではPlaybook内で使用する変数を指定することができ、特にホスト固有の変数をホスト変数と呼びます。
いくつか記述する方法はあるようですが、一つとして以下のような記述方法があります。
ホスト変数の定義
以下の例ではInventory内のfile
変数にホストごとに値を格納して、ホストごとに別ファイルを作成するようにしています。
Playbook内では{{ file }}
の形式で変数を取り出すことができます。
・Inventory
#Inventory hosts-file [web] web-server1 file=web1.txt web-server2 file=web2.txt [db] db-server1 file=db1.txt
・Playbook
--- - hosts: web db tasks: - name: test-playbook file: path: /tmp/{{ file }} state: touch
ホストグループ変数
次の例ではホストグループ単位で変数を定義しています。
サーバ種別によって処理が異なる場合などにはこちらの方法でも記述することができます。
[ホストグループ名:vars]
の形式で指定を行います。
#Inventory hosts-file [web] web-server1 web-server2 [db] db-server1 [web:vars] file=web.txt [db:vars] file=db.txt
Playbookはホスト変数の場合と同様の記述で実行できます。
変数を別ファイルに定義する
上記で扱った変数は別ファイルに切り出すこともできます。
このように変数を切り出す構成はベストプラクティスにもなっています。
ベストプラクティス — Ansible Documentation
グループ変数の場合はgroup_vars
ディレクトリを、ホスト変数であればhost_vars
ディレクトリを定義し、その中にホストグループやホストごとのファイルを作成します。
ディレクトリ名やファイル名をルールに従って記述すればAnsible側で自動認識してくれるようです。
. |-- group_vars |-- host_vars |-- hosts
・ディレクトリ構成例
[ansusr@ctl-node test-task]$ tree . |-- group_vars | |-- db.yml | `-- web.yml |-- hosts
Inventoryファイルと同階層にgroup_vars
ディレクトリを作成し、その中にホストグループ名に対応するファイルを作成します。
変数のファイル名はそのままホストグループ名(web)か、yml
識別子をつける形式かのどちらでも大丈夫なようです。個人的には明示的に識別子をつけた方が分かりやすい気がしますね。
・hosts
この場合はInventoryには変数を記述していません。
#Inventory hosts-file [web] web-server1 web-server2 [db] db-server1
変数ファイルはそのまま変数のみを定義すればいいですが、記述方法は後述するYAML形式で記述する必要があるようです。
・web.yml
file: web.txt
・db.yml
file: db.txt
YAML形式での記述
Inventoryはいくつかの記述方法に対応しており、Playbookと同様にYAML形式で記述することもできます。
以下の記述でホストグループ変数で定義したInventoryと同様の内容が定義できます。
#Inventory YAML all: children: web: hosts: web-server1: web-server2: vars: file: web.txt db: hosts: db-server1: vars: file: db.txt
次回はPlaybookを確認します。
参考:インベントリーの構築方法 — Ansible Documentation
■参考書籍