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