Gruppenvariablen, Hostvariablen und Fakten verwalten

AnsibleBeginner
Jetzt üben

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.