Probleme bei der Variablenrangfolge debuggen

AnsibleBeginner
Jetzt üben

Einführung

Wenn dieselbe Variable an mehreren Stellen definiert ist, wendet Ansible Rangfolgeregeln (Precedence Rules) an. Das Debuggen des endgültigen Werts ist unerlässlich, bevor Sie ein Playbook ändern.

In diesem Lab definieren Sie dieselben Variablen auf den Ebenen all, group, host und extra-var und erstellen anschließend Berichte, die belegen, welche Ebene Vorrang hat.

Ein Projekt zur Übung der Rangfolge erstellen

In diesem Schritt erstellen Sie ein Projekt mit Verzeichnissen für all-, group- und host-Variablen.

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

Dieses Lab definiert absichtlich dieselbe Variable an mehreren Stellen. Die Berichte zeigen den endgültigen Wert, den Ansible auswählt, anstatt dass Sie die Rangfolge nur aus den Dateinamen ableiten müssen.

All- und Group-Variablen definieren

In diesem Schritt definieren Sie Basiswerte in group_vars/all.yml und überschreiben diese anschließend für die web-Gruppe. Bevor Sie Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück. Dies sorgt für stabile Befehle, auch wenn LabEx jeden Schritt separat ausführt.

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 gilt für jeden Host, während group_vars/web.yml nur für die web-Gruppe gilt. Da web1 und web2 beide Web-Hosts sind, sollten die Gruppenwerte die Basiswerte für alle Hosts überschreiben.

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

Eine Host-Variablen-Überschreibung definieren

In diesem Schritt überschreiben Sie dieselben Variablen nur für web2. Host-Variablen sind spezifischer als Gruppenvariablen. Bevor Sie Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück.

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

Diese Datei gilt nur für web2, daher sollte sie die Web-Gruppenwerte für diesen Host überschreiben. web1 sollte weiterhin die Gruppenwerte verwenden.

ansible-inventory --host web2

Verwenden Sie die Ausgabe des Inventars, um den aufgelösten Wert zu bestätigen, bevor Sie ein Playbook ausführen. Für web2 sollte app_port als 9090 angezeigt werden.

Die aufgelösten Variablenwerte rendern

In diesem Schritt schreiben und führen Sie ein Playbook aus, das die endgültigen Werte aufzeichnet, die Ansible für jeden Host ausgewählt hat. Bevor Sie Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück.

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

Das Playbook schreibt die endgültig aufgelösten Werte in Dateien. Dies macht die Rangfolge sichtbar: Jeder Bericht zeichnet sowohl den gewählten Port als auch ein Quell-Label auf, das Ihnen zeigt, welche Ebene gewonnen hat.

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

web1 sollte app_source=group anzeigen und web2 sollte app_source=host anzeigen. Das beweist, dass Host-Variablen spezifischer sind als Gruppenvariablen.

Mit Extra-Variablen überschreiben

In diesem Schritt übergeben Sie Extra-Variablen mit -e. Extra-Variablen haben eine sehr hohe Priorität und überschreiben für diesen Durchlauf sowohl Gruppen- als auch Host-Variablen. Bevor Sie Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück.

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

Extra-Variablen sind absichtlich sehr mächtig. Sie überschreiben für diesen Durchlauf sowohl Gruppen- als auch Host-Variablen, bearbeiten jedoch nicht die Variablendateien auf der Festplatte.

cat reports/web1.txt reports/web2.txt

Beide Berichte sollten nun die Werte der Extra-Variablen anzeigen. Wenn sich nur ein Host geändert hat, überprüfen Sie erneut, wie die -e-Optionen eingegeben wurden.

Zusammenfassung

Sie haben all-, group-, host- und extra-Variablen verglichen und anschließend mithilfe von Berichten nachgewiesen, welcher Wert von Ansible auf der jeweiligen Rangfolgenebene angewendet wurde.