Statische Inventare mit Gruppen und Variablen erstellen

AnsibleBeginner
Jetzt üben

Einführung

Inventare beschreiben die Hosts, die Ansible verwalten kann, sowie die Gruppen, denen diese Hosts angehören. Eine gute Inventarstruktur ermöglicht es Ihnen, Hosts gezielt anzusprechen und Variablen im richtigen Gültigkeitsbereich (Scope) zuzuweisen.

In diesem Lab erstellen Sie ein statisches Inventar mit Host-Aliasen, Gruppen, untergeordneten Gruppen, Gruppenvariablen, Host-Variablen sowie ein kurzes Playbook, das die korrekte Auflösung der Variablen überprüft.

Ein Inventar-Projekt erstellen

In diesem Schritt erstellen Sie die Projektverzeichnisse für die Arbeit mit dem Inventar. Dieses Lab verwendet lokale Host-Aliase, damit Sie das Verhalten des Inventars sicher innerhalb einer einzelnen RHEL 10 VM erlernen können.

Erstellen Sie das Projektverzeichnis und wechseln Sie hinein.

cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars,inventory/host_vars,playbooks,reports}
cd rhce-ansible

Erstellen Sie die Datei ansible.cfg, damit Ansible standardmäßig Ihr Inventar verwendet.

cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
retry_files_enabled = False
interpreter_python = auto_silent
EOF

In diesem Lab werden Variablendateien unter inventory/group_vars und inventory/host_vars abgelegt. Dieses Layout hält die Inventardaten zusammen und verdeutlicht, dass die Variablen zu den in inventory/hosts definierten Hosts gehören.

Hosts, Gruppen und untergeordnete Gruppen definieren

In diesem Schritt erstellen Sie ein statisches Inventar. Jeder Host-Alias verwendet ansible_connection=local, sodass sich die Aliase wie verwaltete Hosts verhalten, während die Befehle weiterhin auf dieser VM ausgeführt werden. Untergeordnete Gruppen (Child Groups) ermöglichen es, dass eine Gruppe andere Gruppen enthält.

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

Erstellen Sie die Datei inventory/hosts.

cat > inventory/hosts <<'EOF'
[web]
web1 ansible_connection=local
web2 ansible_connection=local

[db]
db1 ansible_connection=local

[prod:children]
web
db
EOF

Überprüfen Sie den Gruppen-Graphen.

ansible-inventory --graph

Die Abschnitte web und db definieren gewöhnliche Gruppen. Der Abschnitt [prod:children] definiert eine übergeordnete Gruppe. Der Graph sollte daher prod anzeigen, das beide Gruppen sowie alle drei Host-Aliase enthält.

Gruppen- und Host-Variablen hinzufügen

In diesem Schritt weisen Sie Gruppen und einzelnen Hosts Variablen zu. Eine Gruppenvariable gilt für alle Hosts innerhalb dieser Gruppe. Eine Host-Variable überschreibt oder ergänzt Werte für einen einzelnen Host.

Bevor Sie die Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück.

cd /home/labex/project/rhce-ansible

Erstellen Sie Variablen für die Web-Hosts.

cat > inventory/group_vars/web.yml <<'EOF'
service_role: web
service_port: 8080
EOF

Diese Werte gelten für jeden Host in der Gruppe web. In diesem Inventar sollten sowohl web1 als auch web2 die Web-Rolle und den Port erben.

Erstellen Sie Variablen für die Datenbank-Hosts.

cat > inventory/group_vars/db.yml <<'EOF'
service_role: database
service_port: 5432
EOF

Die Datenbankgruppe erhält andere Werte, da Datenbank-Hosts in der Regel andere Dienstkonfigurationen benötigen. Durch die Trennung der Gruppendateien vermeiden Sie es, bedingte Anweisungen (Conditionals) in jede Playbook-Aufgabe einfügen zu müssen.

Erstellen Sie eine host-spezifische Variable für web2.

cat > inventory/host_vars/web2.yml <<'EOF'
rack: rack-b
EOF

Host-Variablen haben den engsten Gültigkeitsbereich in diesem Lab. Nur web2 sollte den Wert rack besitzen, was den Unterschied zwischen gruppenweiten und host-spezifischen Daten verdeutlicht.

Aufgelöste Host-Variablen überprüfen

In diesem Schritt lassen Sie sich von Ansible die aufgelösten Variablen für ausgewählte Hosts anzeigen. Dies ist eine sichere Methode, um das Inventar zu debuggen, bevor Sie Playbooks schreiben.

Bevor Sie die Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück.

cd /home/labex/project/rhce-ansible

Überprüfen Sie web1.

ansible-inventory --host web1

web1 sollte die Web-Rolle und den Port anzeigen, aber keine rack-Variable. Das Fehlen dieser Variable ist ein nützlicher Beleg dafür, dass die host-spezifische Datei für web2 nicht versehentlich auf die gesamte Gruppe angewendet wurde.

Überprüfen Sie web2 und suchen Sie nach dem host-spezifischen Rack-Wert.

ansible-inventory --host web2 | grep -E 'service_role|service_port|rack'

Überprüfen Sie db1.

ansible-inventory --host db1 | grep -E 'service_role|service_port'

Vergleichen Sie alle drei Hosts, bevor Sie das Playbook schreiben. Dies ist der übliche Ablauf beim Debuggen von Inventaren: Bestätigen Sie zuerst die geerbten Gruppenwerte und prüfen Sie anschließend, ob ein host-spezifischer Wert existiert.

Ein Playbook für Variablenberichte schreiben

In diesem Schritt erstellen Sie ein kurzes Playbook, das für jeden Inventar-Host eine Berichtsdatei schreibt. Die Aufgabe verwendet inventory_hostname, sodass jeder Alias seine eigene Datei erhält, obwohl alle Aliase lokal ausgeführt werden.

Bevor Sie die Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück.

cd /home/labex/project/rhce-ansible

Erstellen Sie das Playbook.

cat > playbooks/write-inventory-report.yml <<'EOF'
---
- name: Write inventory variable reports
  hosts: prod
  gather_facts: false
  tasks:
    - name: Write report for each inventory host
      ansible.builtin.copy:
        dest: "/home/labex/project/rhce-ansible/reports/{{ inventory_hostname }}.txt"
        content: "{{ inventory_hostname }} role={{ service_role }} port={{ service_port }} rack={{ rack | default('none') }}\n"
        mode: '0644'
EOF

Der Ausdruck {{ inventory_hostname }} wird durch den aktuellen Host-Alias ersetzt, sodass eine einzige Aufgabe separate Berichtsdateien für web1, web2 und db1 erstellen kann. Der Filter default('none') verhindert einen Fehler bei Hosts, für die rack nicht definiert ist.

Führen Sie das Playbook aus und überprüfen Sie die Berichte.

ansible-playbook playbooks/write-inventory-report.yml

Das Playbook zielt auf prod ab, die übergeordnete Gruppe, die sowohl Web- als auch Datenbank-Hosts enthält. Die Zusammenfassung sollte alle drei Aliase enthalten und mit failed=0 abschließen.

cat reports/*.txt

Die Berichtsdateien sind der endgültige Beweis dafür, dass die Inventarvariablen korrekt aufgelöst wurden. web2.txt sollte rack-b enthalten, während die anderen Hosts rack=none anzeigen sollten.

Zusammenfassung

Sie haben ein statisches Inventar mit Gruppen, untergeordneten Gruppen, Gruppenvariablen und Host-Variablen erstellt. Zudem haben Sie die Variablenauflösung mit ansible-inventory und einem kleinen Playbook validiert.