Einführung
Variablen ermöglichen es Ihnen, Daten außerhalb der Aufgabenlogik zu halten. Gruppenvariablen bieten gemeinsam genutzte Werte, Hostvariablen überschreiben diese für einzelne Hosts, und Fakten fügen erkannte Systemdaten hinzu.
In diesem Lab definieren Sie Gruppen- und Hostvariablen, sammeln RHEL-Fakten und erstellen einen Bericht pro Host-Alias.
Ein Projekt für Variablenübungen erstellen
In diesem Schritt erstellen Sie ein Projekt mit Web-Host-Aliasen und Verzeichnissen für 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
Beide Hosts sind lokale Aliase, aber Ansible löst die Variablen für jeden Inventarnamen separat auf. Dies ermöglicht es Ihnen, hostspezifische Überschreibungen ohne zusätzliche VMs zu üben.
Gemeinsame Gruppenvariablen festlegen
In diesem Schritt definieren Sie Werte, die für jeden Host in der Gruppe web gelten.
Bevor Sie die Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück. Dies stellt sicher, dass die Befehle stabil bleiben, auch wenn LabEx jeden Schritt separat ausführt.
cd /home/labex/project/rhce-ansible
cat > inventory/group_vars/web.yml <<'EOF'
service_name: demo-web
service_port: 8080
EOF
Diese Werte gelten für jeden Host in der Gruppe web. An diesem Punkt würden sowohl web1 als auch web2 den Port 8080 verwenden.
cat inventory/group_vars/web.yml
Eine Hostvariable überschreiben
In diesem Schritt überschreiben Sie service_port nur für web2. Hostvariablen sind spezifischer als Gruppenvariablen.
Bevor Sie die 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'
service_port: 9090
EOF
Diese Datei ist spezifischer als group_vars/web.yml, daher sollte nur web2 den Port 9090 verwenden. web1 sollte weiterhin den Gruppenwert verwenden.
ansible-inventory --host web2
Überprüfen Sie die aufgelöste Host-Ausgabe und suchen Sie nach service_port. Dieser Befehl zeigt den endgültigen Wert an, den Ansible vor der Ausführung eines Playbooks verwenden wird.
Ein Playbook für faktenbasierte Berichte schreiben
In diesem Schritt schreiben Sie ein Playbook, das Inventarvariablen mit gesammelten Fakten kombiniert. Das Fakt ansible_distribution_major_version stammt vom verwalteten Host.
Bevor Sie die Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück.
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
Der Bericht kombiniert zwei Datenquellen: Inventarvariablen wie service_port und gesammelte Fakten wie ansible_distribution_major_version. Dies ist ein gängiges Muster, wenn die Konfiguration sowohl von beabsichtigten Einstellungen als auch von erkannten Systemdetails abhängt.
ansible-playbook playbooks/report-vars.yml --syntax-check
Den Variablenbericht ausführen
In diesem Schritt führen Sie das Playbook aus und vergleichen die Berichte. Die gemeinsamen Werte sollten übereinstimmen, während sich der Port für web2 unterscheidet.
Bevor Sie die Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück.
cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/report-vars.yml | tee reports/report-run.txt
Der Durchlauf sollte zuerst die Fakten sammeln und dann einen Bericht für jeden Host schreiben. Eine erfolgreiche Zusammenfassung mit failed=0 bedeutet, dass beide Host-Aliase ihre Berichte erstellt haben.
cat reports/web1.txt reports/web2.txt
Vergleichen Sie die port=-Zeilen: web1 sollte 8080 anzeigen, während web2 9090 anzeigen sollte. Der gemeinsame service=-Wert sollte in beiden Berichten identisch sein.
Zusammenfassung
Sie haben Gruppenvariablen definiert, einen Wert mit Hostvariablen überschrieben, Fakten gesammelt und Berichte erstellt, die belegen, wie Ansible jeden Wert aufgelöst hat.


