SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【Ansible】入門②Inventoryの基本的な記述方法

一般的には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を確認します。

・前回
www.wantanblog.com

・次回
www.wantanblog.com

参考:インベントリーの構築方法 — Ansible Documentation

■参考書籍