#【Ansible 備忘録 ③】インベントリの基本
インベントリは、YAML 形式または INI 形式で、ターゲットノードの接続情報を定義する。
デフォルトのインベントリは、「/etc/ansbile/hosts」が利用される。
「ansible」コマンド、「ansible-playbook」コマンドで自分で定義したインベントリを利用する場合は、「-i <インベントリのパス>」を明示的に指定する必要がある。
例)
# デフォルトのインベントリが利用される
$ ansible-playbook test.yml
# 自分で定義したインベントリを利用する
$ ansible-playbook -i $HOME/inventory.ini test.yml
役割が共通のサーバー群や、本番環境と検証環境、開発環境など、同じ設定を行うサーバー群をグループ化しておくと運用がしやすくなる。
グループの定義には、「 [ ] 」でグループ名を囲み、その下に IP アドレスまたはホスト名を列挙する。
グループは、上位グループ、下位グループという階層型のグループを指定できる。
上位グループは、「 [グループ名: children] 」と表記して、下位グループ名を列挙する。
例)
[web] ## グループ名
192.168.10.[1:10] ## グループのターゲット ここでは、192.168.10.1〜192.168.10.10 を指定している
[postgresql] ## グループ名
postgresql1 ## グループのターゲットを列挙
postgresql2
[mysql] ## グループ名
mysql-[a:c] ## グループのターゲット ここでは、mysql-a、mysql-b、mysql-c を指定している
[db:children] ## グループ名 上位グループ
postgresql ## 下位グループを列挙
mysql
ターゲットノードやグループは、環境によって接続ユーザーや接続方法が異なることがある。(ほとんどそう)
また、ターゲットノード固有の環境情報を固定したい場合がある。こうした場合に、インベントリ変数を使用する。
インベントリ変数は 2 つに分かれる。
・ホスト変数
→ ターゲットノード固有に適応される変数。
インベントリ内では、ターゲットノードの後ろに定義する。
・グループ変数
→ グループ全体に適応される変数。
インベントリ内では、「 [ グループ名: vars ] 」というセクションを作成して、その下に変数を列挙する。
例)
[web]
192.168.10.[1:10]
[db]
db1 ansible_host=192.168.20.1 ## ホスト変数→SSH接続IPアドレス
db2 ansible_host=192.168.20.2 ## ホスト変数→SSH接続IPアドレス
[web:vars]
http_port=8080 ## グループ変数→ webグループのポート番号を指定
[all:vars] ## all を指定するとすべてのサーバーに対して変数を指定できる
ansible_port=22 ## グループ変数→ すべてのサーバーのSSH接続ポートを指定
ansible_user=ansible ## グループ変数→ SSH接続ユーザーを指定
ホスト変数とグループ変数には、ユーザーが固有に設定できるユーザー定義変数とターゲットノードへの接続を制御するための接続変数が存在する。
主な接続変数
種別 | 接続変数 | デフォルト値 | 詳細 |
---|---|---|---|
ターゲットノード接続 | ansible_connection | smart | Connection プラグインを使用したターゲットノードへの接続方法を設定。 SSH を利用しない「local」、「docker」を設定できる。 |
SSH 接続 | ansible_host | - | ターゲットノードの名前またはエイリアス名を設定。 |
SSH 接続 | ansible_port | 22 | ターゲットノードの SSH ポートを設定。 |
SSH 接続 | ansible_user | コマンド実行ユーザー | SSH 接続するユーザー名を設定。 |
SSH 接続 | ansible_password | - | SSH パスワード認証のパスフレーズを設定。 |
Privilege 設定 | ansible_become | false | 特権実行を行うかどうかを設定。 「true」に設定すると sudo 実行できる。 |
Privilege 設定 | ansible_become_user | - | タスクを実行する特権ユーザーを設定。 |
Privilege 設定 | ansible_become_password | - | 特権ユーザーになるためのパスフレーズを設定。 |
ターゲットノード環境 | ansible_shell_type | sh | ターゲットノードの Shell のタイプを選択。 |
ターゲットノード環境 | ansible_python_interpreter | /usr/bin/python | ターゲットノードの Python のパスを設定。 |
インベントリの中で定義していたホスト変数やグループ変数を YAML ファイルに分割できる。
通常、INI 形式のインベントリにはターゲットノードの接続情報を定義し、YAML ファイルにターゲットノード毎の変数を定義する。
インベントリ変数のディレクトリ構造は以下の通り。
・グループ変数
→「group_vars」ディレクトリ配下に、「group_vars/<グループ名>.yml」または、「group_vars/<グループ名>/<ファイル名>.yml」という名前の YAML ファイルを配置。
・ホスト変数
→「host_vars」ディレクトリ配下に、「group_vars/<ホスト名>.yml」または、「group_vars/<ホスト名>/<ファイル名>.yml」という名前で YAML ファイルを配置。
例)
インベントリが以下の設定で、YAML ファイルを配置する場合
[web]
192.168.10.[1-2] ## IPアドレス 192.168.10.1 〜 192.168.10.2
[db]
db-[a:b] ## db-a、db-b
ディレクトリ構造は以下の通り。
sample
├── group_vars
│ ├── all.yml ## すべてのグループ(実質すべてのホスト)の変数
│ ├── db.yml ## dbグループ用の変数
│ └── web.yml ## webグループ用の変数
├── host_vars
│ ├── 192.168.10.1.yml ## IPアドレス 192.168.10.1 のホスト用のホスト変数
│ ├── 192.168.10.2.yml ## IPアドレス 192.168.10.2 のホスト用のホスト変数
│ ├── db-a.yml ## db-a 用のホスト変数
│ └── db-b.yml ## db-b 用のホスト変数
└── inventory
└── inventory.ini ## インベントリ