【インベントリー概要】構築方法 2章:変数の追加
インベントリーへの変数追加
特定のホストまたはグループに関連する変数の値をイベントリーに保存できます。
メインのイベントリーファイルのホスト及びグループに変数を直接追加することが出来ます。
管理ノードをAnsibleイベントリーに追加するため、変数を別々のホスト変数およびグループ変数のファイルに保存することが推奨されます。
2.あるマシンへの変数の割り当て:ホスト変数
1台のホスト変数を簡単に割り当てると、後でPlaybookで使用できます。 INIの場合は、以下のようになります。
[atlanta] host1 http_port=80 maxRequestsPerChild=808 host2 http_port=303 maxRequestsPerChild=909
YAMLの場合は、以下のようになります。
atlanta: host1: http_port: 80 maxRequestsPerChild: 808 host2: http_port: 303 maxRequestsPerChild: 909
非標準のSSHポートなどの一意な値は、ホスト変数として機能します。
コロンを使用してポート番号をホスト名の後に追加することで、ホスト変数としてAnsibleイベントリーに追加できます。
badwolf.example.com:5309
接続数もホスト変数として機能します。
[targets] localhost ansible_connection=local other1.example.com ansible_connection=ssh ansible_user=myuser other2.example.com ansible_connection=ssh ansible_user=myotheruser
Note SSH設定ファイル内に非標準のSSHポートの一覧を表示した場合、
openssh
接続はそのポートを見つけて使用しますが、paramiko
接続は行われません
2−1.インベントリーエイリアス
エイリアスをインベントリーに定義することも出来ます。
INIの場合は、以下のようになります。
jumper ansible_port=5555 ansible_host=192.0.2.50
YAMLの場合は、以下のようになります。
... hosts: jumper: ansible_port:5555 ansible_host:192.0.2.50
上記の例では、ホストエイリアス「Jumper」に対してAnsibleを実行すると、ポート5555で192.0.2.50に接続します。
これは、静的IPがあるホスト、またはトンネル経由で接続しているホストでのみ機能します。
Note
key-value
構文をしようしてINI形式で渡される値が解釈される方法は、宣言される場所に応じて異なります。・ホストとインラインで宣言すると、INI値はPythonリテラル構造(文字列、数値、リスト、辞書、プール値、なし)として解釈されます。 ホスト業は、行ごとに複数の
key=value
パラメータを受け入れます。 そのため、空白文字を区切り文字ではなく値の一部であることを示す方法が必要になります。・
:vars
セクションで宣言すると、INI値は文字列として解釈されます。 例えば、var=FALSE
は「FALSE」に等しい文字列を作成します。 ホスト行とは異なり、:vars
セクションは行ごとにエントリーを1つしか受け入れないため、=
に続くものはすべてエントリーの値である必要があります。・INIイベントリーに設定された変数の値を特定のタイプ(文字列やプール値など)にする必要がある場合は、タスクで常にそのタイプをフィルターで指定します。 変数の使用時にINIインベントリーに設定されたタイプに依存しないでください
・変数の実際のタイプの混乱を避けるために、インベントリーソースにはYAML形式を使用することを検討してください。 YAMLイベントリープラグインは、変数の値を一貫して正しく処理します。
通常は、システムポリシーを記述する変数を定義するのが最適な方法ではありません。
メインのイベントリーファイルで変数を設定するのは簡単な方法です。
「hosts_vars」ディレクトリーの個別ファイルに変数の値を保存するガイドラインはホスト変数とグループ変数の整理を参照してください。
3.多くのマシンへの変数の割り当て:グループ変数
グループのすべてのホストが変数値を共有している場合は、その変数をグループ全体に一度に適用できます。 INIの場合は以下のようになります。
[atlanta] host1 host2 [atlanta:vars] ntp_server=ntp.atlanta.example.com proxy=proxy.atlanta.example.com
YAMLの場合は、以下のようになります。
atlanta: hosts: host1: host2: vars: ntp_server: ntp.atlanta.example.com proxy: proxy.atlanta.example.com
グループ変数は、変数を複数のホストに当時に適用する場合に便利
ただし、Ansibleを実行する前に、イベントリー変数などの変数は常にホストレベルにフラットにします。
ホストが複数グループのメンバーである場合、Ansibleは、そのすべてのグループからヘンスの値を読み取ります。
異なるグループ内の同じ変数に異なる値を割り当てる場合、Ansibleは内部のマージ用ルールに基づいて、使用する値を選択します。
4.変数値の継承:グループのグループ用グループ変数
INIの:children
接尾辞またはYAMLのchildren:
エントリーを使用して、グループのグループ作成できます。
変数は、:vars
またはvars:
を使用して、これらのグループのグループに適用できます。
INIの場合は、以下のようになります。
[atlanta] host1 host2 [raleigh] host2 host3 [southeast:children] atlanta raleigh [southeast:vars] some_server=foo.southeast.example.com halon_system_timeout=30 self_destruct_countdown=60 escape_pods=2 [usa:children] southeast northeast southwest northwest
YAMLの場合は、以下のようになります。
all: children: usa: children: southeast: children: atlanta: hosts: host1: host2: raleigh: hosts: host2: host3: vars: some_server: foo.southeast.example.com halon_system_timeout: 30 self_destruct_countdown: 60 escape_pods: 2 northeast: northwest: southwest:
一覧またはハッシュデータを保持する必要がある場合や
イベントリーファイルとは別にホスト及びグループ固有の変数を保持する必要がある場合
ホスト変数とグループ変数の整理を参照してください
- 子グループのメンバーであるホストは、自動的に親グループのメンバーになります。
- 子グループの変数は、親グループの変数よりも優先度が高くなります(オーバライド)
- グループに複数の親と子を追加することは出来ますが、循環関係は設定できません。
- ホストは複数のグループに属することもできますが、ホストのインスタンスは1つだけであり、複数のグループからのデータをマージします。