変数の優先順位に関する問題のデバッグ

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

はじめに

同じ変数が複数の場所で定義されている場合、Ansible は優先順位のルールを適用します。Playbook を変更する前に、最終的な値がどうなるかをデバッグすることは非常に重要です。

この実験では、all、group、host、および extra-var(追加変数)の各レベルで同じ変数を定義し、どのレベルの値が優先されるかをレポートに出力して確認します。

優先順位確認用プロジェクトの作成

このステップでは、all、group、および host 変数のディレクトリを含むプロジェクトを作成します。

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 が実際に選択した最終的な値を確認できます。

All 変数と Group 変数の定義

このステップでは、group_vars/all.yml にベースラインとなる値を定義し、web グループに対してそれを上書きします。 このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。これにより、LabEx が各ステップを個別に実行する場合でもコマンドが安定します。

cd /home/labex/project/rhce-ansible
cat > inventory/group_vars/all.yml <<'EOF'
app_port: 8000
app_source: all
EOF
cat > inventory/group_vars/web.yml <<'EOF'
app_port: 8080
app_source: group
EOF

group_vars/all.yml はすべてのホストに適用され、group_vars/web.yml は web グループのみに適用されます。web1 と web2 はどちらも Web ホストであるため、グループの値がすべてのホストのベースラインを上書きするはずです。

cat inventory/group_vars/all.yml inventory/group_vars/web.yml

ホスト変数の上書き定義

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

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

このファイルは web2 にのみ適用されるため、そのホストに対しては Web グループの値を上書きするはずです。web1 は引き続きグループの値を使用します。

ansible-inventory --host web2

Playbook を実行する前に、インベントリの出力を使用して解決された値を確認してください。web2 の app_port が 9090 と表示されるはずです。

解決された変数値のレンダリング

このステップでは、各ホストに対して Ansible が選択した最終的な値を記録する Playbook を作成し、実行します。 このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。

cd /home/labex/project/rhce-ansible
cat > playbooks/show-precedence.yml <<'EOF'
---
- name: Show resolved variable precedence
  hosts: web
  gather_facts: false
  tasks:
    - name: Write resolved variable report
      ansible.builtin.copy:
        dest: "/home/labex/project/rhce-ansible/reports/{{ inventory_hostname }}.txt"
        content: |
          host={{ inventory_hostname }}
          app_port={{ app_port }}
          app_source={{ app_source }}
        mode: '0644'
EOF

この Playbook は、最終的に解決された値をファイルに書き出します。これにより優先順位が可視化されます。各レポートには、選択されたポートと、どのレイヤーが優先されたかを示すソースラベルの両方が記録されます。

ansible-playbook playbooks/show-precedence.yml | tee reports/normal-run.txt
cat reports/web1.txt reports/web2.txt

web1 は app_source=group を示し、web2 は app_source=host を示すはずです。これにより、ホスト変数がグループ変数よりも優先されることが証明されます。

追加変数(Extra Variables)による上書き

このステップでは、-e オプションを使用して追加変数を渡します。追加変数は非常に高い優先順位を持ち、今回の実行においてはグループ変数とホスト変数の両方を上書きします。 このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/show-precedence.yml -e app_port=10080 -e app_source=extra | tee reports/extra-run.txt

追加変数は意図的に強力に設定されています。今回の実行ではグループ変数とホスト変数の両方を上書きしますが、ディスク上の変数ファイル自体は編集されません。

cat reports/web1.txt reports/web2.txt

両方のレポートで、追加変数の値が表示されるはずです。もし片方のホストしか変更されていない場合は、-e オプションの入力内容を再確認してください。

まとめ

all、group、host、および extra 変数を比較し、レンダリングされたレポートを使用して、各優先順位レベルで Ansible がどの値を適用したかを証明しました。