検索

18.2. 構築されたインベントリー

download PDF

入力インベントリーのリストから新しいインベントリー (構築されたインベントリーと呼ばれる) を作成できます。

構築されたインベントリーには、入力インベントリー内のホストとグループのコピーが含まれており、ジョブが複数のインベントリーにわたるサーバーのグループを対象にできます。グループとホスト変数をインベントリーのコンテンツに追加したり、ホストをフィルタリングして構築されたインベントリーのサイズを制限したりできます。

構築されたインベントリーは、ansible.builtin.constructed インベントリー モデルを使用します。

構築されたインベントリーは、主に次のような要素が含まれます。

  • 通常の Ansible hostvars 名前空間が利用可能である
  • グループがある

構築されたインベントリーは、source_varslimit を入力として受け取り、その input_inventories をグループを備えた新しいインベントリーに変換します。グループ (既存または構築された) を limit フィールドで参照して、生成されるホストの数を減らすことができます。

次のホストプロパティーに基づいてグループを構築できます。

  • RHEL のメジャーバージョンまたはマイナーバージョン
  • Windows ホスト
  • 特定のリージョンでタグ付けされたクラウドベースのインスタンス
  • その他

以下は、構築されたインベントリー詳細ビューの例です。

Constructed inventory details

後続のセクションで説明する例は、入力インベントリーの構造別に整理されています。

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 形式で示されています。最初に提案する内容が推奨されます。

  1. 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") を使用します。これは、デバッグのヒント で説明されているように、デバッグに役立ちます。

  2. 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: {}

host1groupB に属しているため、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) は、インベントリーソースモデルにすでに存在します。

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.