グループ変数、ホスト変数、およびファクトの管理

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

はじめに

変数は、タスクのロジックからデータを分離して管理するために使用します。グループ変数は共有値を提供し、ホスト変数は個々のホストの設定を上書きし、ファクトはシステムから自動的に収集されたデータを追加します。

この実験では、グループ変数とホスト変数の定義、RHEL ファクトの収集、そしてホストエイリアスごとにレポートを作成する方法を学びます。

変数練習用プロジェクトの作成

このステップでは、Web ホストのエイリアスと変数を格納するディレクトリを備えたプロジェクトを作成します。

cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars,inventory/host_vars,playbooks,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[web]
web1 ansible_connection=local
web2 ansible_connection=local
EOF

どちらのホストもローカルのエイリアスですが、Ansible はインベントリ内の名前ごとに変数を個別に解決します。これにより、追加の仮想マシンを用意することなく、ホスト固有の上書き設定を練習できます。

共有グループ変数の設定

このステップでは、webグループ内のすべてのホストに適用される値を定義します。 このステップでコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。これにより、LabEx が各ステップを個別に実行する場合でもコマンドが安定して動作します。

cd /home/labex/project/rhce-ansible
cat > inventory/group_vars/web.yml <<'EOF'
service_name: demo-web
service_port: 8080
EOF

これらの値はwebグループ内のすべてのホストに適用されます。現時点では、web1とweb2の両方がポート8080を使用することになります。

cat inventory/group_vars/web.yml

ホスト変数の上書き

このステップでは、web2のみに対してservice_portを上書きします。ホスト変数はグループ変数よりも優先順位が高くなります。 このステップでコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。

cd /home/labex/project/rhce-ansible
cat > inventory/host_vars/web2.yml <<'EOF'
service_port: 9090
EOF

このファイルはgroup_vars/web.ymlよりも優先されるため、web2のみが9090を使用するようになります。web1は引き続きグループの値を使用します。

ansible-inventory --host web2

解決されたホストの出力を確認し、service_portを探してください。このコマンドは、Playbook が実行される前に Ansible が使用する最終的な値を表示します。

ファクトを活用したレポート用 Playbook の作成

このステップでは、インベントリ変数と収集したファクトを組み合わせる Playbook を作成します。ファクトansible_distribution_major_versionは、管理対象ホストから取得されます。 このステップでコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。

cd /home/labex/project/rhce-ansible
cat > playbooks/report-vars.yml <<'EOF'
---
- name: Render variable and fact reports
  hosts: web
  gather_facts: true
  tasks:
    - name: Write per-host variable report
      ansible.builtin.copy:
        dest: "/home/labex/project/rhce-ansible/reports/{{ inventory_hostname }}.txt"
        content: |
          host={{ inventory_hostname }}
          service={{ service_name }}
          port={{ service_port }}
          rhel_major={{ ansible_distribution_major_version }}
        mode: '0644'
EOF

このレポートは、service_portのようなインベントリ変数と、ansible_distribution_major_versionのような収集されたファクトという 2 つのデータソースを組み合わせています。これは、設定が宣言された意図とシステムから検出された詳細情報の両方に依存する場合の一般的なパターンです。

ansible-playbook playbooks/report-vars.yml --syntax-check

変数レポートの実行

このステップでは、Playbook を実行してレポートを比較します。共有値は一致し、web2のポートのみが異なるはずです。 このステップでコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/report-vars.yml | tee reports/report-run.txt

実行すると、まずファクトが収集され、次に各ホストのレポートが書き込まれます。failed=0で終了すれば、両方のホストエイリアスでレポートが正常に作成されたことを意味します。

cat reports/web1.txt reports/web2.txt

port=の行を比較してください。web1は8080、web2は9090となっているはずです。共有されているservice=の値は、両方のレポートで一致しているはずです。

まとめ

グループ変数の定義、ホスト変数による値の上書き、ファクトの収集、そして Ansible が各値をどのように解決したかを証明するレポートの作成を行いました。