はじめに
同じ変数が複数の場所で定義されている場合、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 がどの値を適用したかを証明しました。


