【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 ## インベントリ