グループと変数を使用した静的インベントリの構築

AnsibleBeginner
オンラインで実践に進む

はじめに

インベントリは、Ansible が管理できるホストと、それらのホストが属するグループを記述するものです。適切なインベントリ構造を構築することで、ターゲットとするホストを明確にし、適切なスコープで変数を適用できるようになります。

この実験では、ホストエイリアス、グループ、子グループ、グループ変数、ホスト変数を含む静的インベントリを構築し、変数が期待通りに解決されることを確認する短いプレイブックを作成します。

インベントリプロジェクトの作成

このステップでは、インベントリの練習に使用するプロジェクトディレクトリを作成します。この実験では、1 台の RHEL 10 VM 内で安全にインベントリの動作を学習できるよう、ローカルホストのエイリアスを使用します。

プロジェクトを作成し、そのディレクトリに移動します。

cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars,inventory/host_vars,playbooks,reports}
cd rhce-ansible

Ansible がデフォルトで作成したインベントリを使用するように ansible.cfg を作成します。

cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
retry_files_enabled = False
interpreter_python = auto_silent
EOF

この実験では、変数ファイルを inventory/group_vars および inventory/host_vars 配下に配置します。このレイアウトにより、インベントリデータを一元管理でき、変数が inventory/hosts で定義されたホストに属していることが明確になります。

ホスト、グループ、子グループの定義

このステップでは、静的インベントリを作成します。各ホストエイリアスには ansible_connection=local を使用するため、コマンドはこの VM 上で実行されつつ、管理対象ホストのように振る舞います。子グループを使用すると、あるグループの中に別のグループを含めることができます。

このステップでコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。これにより、LabEx が各ステップを個別に実行する場合でもコマンドが安定します。

cd /home/labex/project/rhce-ansible

inventory/hosts を作成します。

cat > inventory/hosts <<'EOF'
[web]
web1 ansible_connection=local
web2 ansible_connection=local

[db]
db1 ansible_connection=local

[prod:children]
web
db
EOF

グループの構成を確認します。

ansible-inventory --graph

web および db セクションは通常のグループを定義しています。[prod:children] セクションは親グループを定義しているため、グラフには prod が両方のグループと 3 つのホストエイリアスすべてを含んでいる様子が表示されるはずです。

グループ変数とホスト変数の追加

このステップでは、グループおよび個々のホストに変数を付与します。グループ変数はそのグループ内のすべてのホストに適用されます。ホスト変数は、特定のホストの値を上書きまたは補完します。

このステップでコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。

cd /home/labex/project/rhce-ansible

Web ホスト用の変数を作成します。

cat > inventory/group_vars/web.yml <<'EOF'
service_role: web
service_port: 8080
EOF

これらの値は web グループ内のすべてのホストに適用されます。このインベントリでは、web1 と web2 の両方が Web ロールとポートを継承します。

データベースホスト用の変数を作成します。

cat > inventory/group_vars/db.yml <<'EOF'
service_role: database
service_port: 5432
EOF

データベースホストは通常異なるサービス設定を必要とするため、データベースグループには異なる値が設定されます。グループごとにファイルを分けることで、すべてのプレイブックのタスクに条件分岐を記述する必要がなくなります。

web2 用のホスト固有の変数を作成します。

cat > inventory/host_vars/web2.yml <<'EOF'
rack: rack-b
EOF

ホスト変数は、この実験で使用する最も狭いスコープです。web2 だけが rack 値を持つことになり、グループ全体に適用されるデータとホスト固有のデータの違いを容易に確認できます。

解決されたホスト変数の確認

このステップでは、Ansible を使用して、選択したホストに対して解決された変数を表示します。これは、プレイブックを作成する前にインベントリをデバッグするための安全な方法です。

このステップでコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。

cd /home/labex/project/rhce-ansible

web1 を確認します。

ansible-inventory --host web1

web1 には Web ロールとポートが表示されますが、rack 変数は表示されません。この欠如は、web2 用のホスト固有ファイルが誤ってグループ全体に適用されていないことを示す有用な証拠となります。

web2 を確認し、ホスト固有の rack 値を探します。

ansible-inventory --host web2 | grep -E 'service_role|service_port|rack'

db1 を確認します。

ansible-inventory --host db1 | grep -E 'service_role|service_port'

プレイブックを作成する前に、これら 3 つのホストすべてを比較してください。これが標準的なインベントリのデバッグフローです。まず継承されたグループ値を確認し、次にホスト固有の値が存在するかどうかを確認します。

変数レポートプレイブックの作成

このステップでは、インベントリホストごとに 1 つのレポートファイルを作成する短いプレイブックを作成します。タスクでは inventory_hostname を使用するため、すべてのエイリアスがローカルで実行されていても、各エイリアスが独自のファイルを取得します。

このステップでコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。

cd /home/labex/project/rhce-ansible

プレイブックを作成します。

cat > playbooks/write-inventory-report.yml <<'EOF'
---
- name: Write inventory variable reports
  hosts: prod
  gather_facts: false
  tasks:
    - name: Write report for each inventory host
      ansible.builtin.copy:
        dest: "/home/labex/project/rhce-ansible/reports/{{ inventory_hostname }}.txt"
        content: "{{ inventory_hostname }} role={{ service_role }} port={{ service_port }} rack={{ rack | default('none') }}\n"
        mode: '0644'
EOF

{{ inventory_hostname }} という式は現在のホストエイリアスに展開されるため、1 つのタスクで web1、web2、db1 それぞれのレポートファイルを個別に作成できます。default('none') フィルタは、rack が定義されていないホストでエラーが発生するのを防ぎます。

プレイブックを実行し、レポートを確認します。

ansible-playbook playbooks/write-inventory-report.yml

このプレイは、Web ホストとデータベースホストの両方を含む親グループである prod をターゲットにしています。結果の要約には 3 つのエイリアスすべてが含まれ、failed=0 で終了するはずです。

cat reports/*.txt

レポートファイルは、インベントリ変数が正しく解決されたことの最終的な証明です。web2.txt には rack-b が含まれ、他のホストには rack=none と表示されるはずです。

まとめ

グループ、子グループ、グループ変数、ホスト変数を使用して静的インベントリを構築しました。また、ansible-inventory と小さなプレイブックを使用して変数の解決を検証しました。