18.2. 構築されたインベントリー
入力インベントリーのリストから新しいインベントリー (構築されたインベントリーと呼ばれる) を作成できます。
構築されたインベントリーには、入力インベントリー内のホストとグループのコピーが含まれており、ジョブが複数のインベントリーにわたるサーバーのグループを対象にできます。グループとホスト変数をインベントリーのコンテンツに追加したり、ホストをフィルタリングして構築されたインベントリーのサイズを制限したりできます。
構築されたインベントリーは、ansible.builtin.constructed インベントリー モデルを使用します。
構築されたインベントリーは、主に次のような要素が含まれます。
- 通常の Ansible hostvars 名前空間が利用可能である
- グループがある
構築されたインベントリーは、source_vars
と limit
を入力として受け取り、その input_inventories
をグループを備えた新しいインベントリーに変換します。グループ (既存または構築された) を limit
フィールドで参照して、生成されるホストの数を減らすことができます。
次のホストプロパティーに基づいてグループを構築できます。
- RHEL のメジャーバージョンまたはマイナーバージョン
- Windows ホスト
- 特定のリージョンでタグ付けされたクラウドベースのインスタンス
- その他
以下は、構築されたインベントリー詳細ビューの例です。
後続のセクションで説明する例は、入力インベントリーの構造別に整理されています。
18.2.1. グループ名と変数のフィルタリング
グループと変数の組み合わせに対してフィルタリングできます。たとえば、グループ変数値に一致し、ホスト変数値にも一致するホストをフィルタリングできます。
このフィルターを実行するには 2 つの方法があります。
-
2 つのグループを定義します。1 つのグループはグループ変数と一致し、もう 1 つのグループはホスト変数値と一致します。
limit
パターンを使用して、両方のグループに含まれるホストを返します。これは、推奨の手法です。 -
1 つのグループを定義します。定義には、グループ変数とホスト変数が特定の値に一致する必要があるという条件を含めます。
limit
パターンを使用して、新しいグループ内のすべてのホストを返します。
以下に例を示します。
次のインベントリーファイルは 4 つのホストを定義し、グループ変数とホスト変数を設定します。これは product グループと sustaining グループを定義し、2 つのホストをシャットダウン状態に設定します。
目標は、シャットダウンされた運用ホストのみを返すフィルターを作成することです。
[account_1234] host1 host2 state=shutdown [account_4321] host3 host4 state=shutdown [account_1234:vars] account_alias=product_dev [account_4321:vars] account_alias=sustaining
ここでの目標は、product_dev
と同等の account_alias
変数を持つグループ内に存在し、シャットダウンされているホストのみを返すことです。これには 2 つのアプローチがあり、どちらも YAML 形式で示されています。最初に提案する内容が推奨されます。
2 つのグループを構築して交差部分に限定します。
source_vars
:plugin: constructed strict: true groups: is_shutdown: state | default("running") == "shutdown" product_dev: account_alias == "product_dev"
limit
:is_shutdown:&product_dev
この構築されたインベントリーの入力は、両方のカテゴリーのグループを作成し、
limit
ホストパターン) を使用して、これら 2 つのグループの交差部分にあるホストのみを返します。これは、Patterns:targeting hosts and groups に文書化されています。変数が定義されている場合と定義されていない場合 (ホストに応じて)、デフォルトを指定できます。たとえば、定義されていない場合に対象の値がわかっている場合は、
| default("running")
を使用します。これは、デバッグのヒント で説明されているように、デバッグに役立ちます。1 つのグループを構築してグループに限定します。
source_vars
:plugin: constructed strict: true groups: shutdown_in_product_dev: state | default("running") == "shutdown" and account_alias == "product_dev"
limit
:shutdown_in_product_dev
この入力により、両方の基準に一致するホストのみを含む 1 つのグループが作成されます。この場合、制限はグループ名そのものとなり、host2 が返されます。前述の方法と同じです。
18.2.2. デバッグのヒント
テンプレートの問題をデバッグできるように、strict
パラメーターを true
に設定することが重要です。テンプレートのレンダリングに失敗すると、その構築されたインベントリーに関連するインベントリーの更新でエラーが発生します。
エラーが発生した場合は、詳細レベルを上げてさらなる情報を取得します。
Ansible の Jinja2 テンプレートでは、| default("running")
などでデフォルトを指定します。こうすることで、strict: true
を設定した場合にテンプレートで発生するエラーを回避できます。
strict: false
を設定して、テンプレートがエラーを生成できるようにすることもできます。その結果、ホストはそのグループに含まれなくなります。ただし、これを行うと、今後、テンプレートが継続して複雑化した場合、問題のデバッグが困難になります。
テンプレートが予期したインベントリーコンテンツを生成しない場合は、テンプレートで想定されている機能についてデバッグする必要がある場合があります。たとえば、groups
グループに複雑なフィルター (shutdown_in_product_dev
など) があるものの、結果として構築されたインベントリーにホストが含まれていない場合は、デバッグに役立つ compose
パラメーターを使用します。
以下に例を示します。
source_vars: plugin: constructed strict: true groups: shutdown_in_product_dev: state | default("running") == "shutdown" and account_alias == "product_dev" compose: resolved_state: state | default("running") is_in_product_dev: account_alias == "product_dev" limit: ``
limit
を空白にして実行すると、すべてのホストが返されます。これを使用して、特定のホスト上の特定の変数を検査し、groups
内のどこに問題があるかの見解を得ることができます。
18.2.3. ネストされたグループ
ネストされたグループは、一方が他方の子である 2 つのグループで構成されます。次の例では、子グループの内部に別のホストがあり、親グループには変数が定義されています。
親グループの変数は、Ansible Core が動作する方法により、playbook として対象の名前空間で利用でき、フィルタリングに使用できます。
次のインベントリーファイルの例、nested.yml
は YAML 形式です。
all: children: groupA: vars: filter_var: filter_val children: groupB: hosts: host1: {} ungrouped: hosts: host2: {}
host1
は groupB
に属しているため、groupA
にも属します。
ネストされたグループ名でのフィルタリング
ネストされたグループ名をフィルターするには、次の YAML 形式を使用します。
`source_vars`: plugin: constructed `limit`: `groupA`
ネストされたグループプロパティーでフィルタリングする
ホストが間接的にそのグループ二所属する場合でも、グループ変数でフィルタリングするには、次の YAML 形式を使用します。
インベントリーの内容では、host2
はどのグループにも属していないため、想定として変数 filter_var
は定義されない点に注意してください。strict: true
を使用しているため、その変数を持たないホストが定義されるようにデフォルト値を使用します。これを使用すると、host2
はエラーを生成するのではなく、式から false
を返します。host1
は、そのグループから変数を継承し、返されます。
source_vars: plugin: constructed strict: true groups: filter_var_is_filter_val: filter_var | default("") == "filter_val" limit: filter_var_is_filter_val
18.2.4. Ansible ファクト
Ansible fact を使用してインベントリーを作成するには、Gather_facts: true
という設定のインベントリーに対して Playbook を実行する必要があります。ファクトはシステムごとに異なります。次の例は、すべての既知のシナリオに対処することを目的としたものではありません。
18.2.4.1. 環境変数のフィルタリング
次の例には、YAML 形式を使用した環境変数のフィルタリングが含まれます。
source_vars: plugin: constructed strict: true groups: hosts_using_xterm: ansible_env.TERM == "xterm" limit: hosts_using_xterm
18.2.4.2. プロセッサーの種類ごとにホストをフィルタリングする
次の例では、YAML 形式を使用してプロセッサータイプ (Intel) ごとにホストをフィルタリングします。
source_vars: plugin: constructed strict: true groups: intel_hosts: "GenuineIntel" in ansible_processor limit: intel_hosts
構築されたインベントリー内のホストは、元のインベントリーホストを参照しているため、ライセンスの割り当てにはカウントされません。さらに、元のインベントリーで無効になっているホストは、構築されたインベントリーには含まれません。
ansible-inventory
を使用してインベントリー更新を実行すると、構築されたインベントリーのコンテンツが作成されます。
これは、常にジョブ実行前の起動時に更新されるように設定されていますが、この操作に時間がかかる場合に備え、キャッシュのタイムアウトを選択することもできます。
構築されたインベントリーを作成するとき、API で、このインベントリーに関連付けられているインベントリーソースが必ず 1 つとなるようにします。インベントリー更新にはすべて、関連するインベントリーソースがあり、構築されたインベントリーに必要なフィールド (source_vars
および limit
) は、インベントリーソースモデルにすでに存在します。