Basisdateien auf verwalteten Knoten bereitstellen

AnsibleBeginner
Jetzt üben

Einführung

Sobald das Inventory und der Zugriff konfiguriert sind, ist die Bereitstellung von Basisdateien (Baseline Files) eine häufige Aufgabe. Solche Basisdateien können Banner, Dienst-Snippets oder Compliance-Markierungen enthalten, die über alle Hosts hinweg konsistent sein, aber dennoch hostspezifische Werte aufweisen sollen.

In diesem Lab erstellen Sie ein kleines Multi-Host-Inventory, definieren Gruppenvariablen, schreiben eine Vorlage (Template), führen ein Playbook aus und überprüfen die hostspezifischen Basisdateien.

Das Projekt zur Basisbereitstellung erstellen

In diesem Schritt erstellen Sie ein Projekt mit Inventory, Vorlagen, Dateien und Playbooks. Die Struktur trennt wiederverwendbare Quellinhalte von der Playbook-Logik.

Erstellen Sie das Projektverzeichnis und wechseln Sie hinein.

cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars,playbooks,files,templates,managed}
cd rhce-ansible

Erstellen Sie die Datei ansible.cfg.

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

Die Verzeichnisse trennen die Rollen im Workflow: files enthält Inhalte, die unverändert kopiert werden; templates enthält Inhalte, die mit Variablen gerendert werden; playbooks enthält die Automatisierungslogik; und managed dient zur Ablage der finalen, hostspezifischen Ergebnisse.

Inventory und Basisvariablen erstellen

In diesem Schritt definieren Sie zwei verwaltete Host-Aliase und gemeinsame Basisvariablen. Die Variablen werden später in einer Vorlage verwendet.

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 das Inventory.

cat > inventory/hosts <<'EOF'
[managed]
node1 ansible_connection=local
node2 ansible_connection=local
EOF

Die beiden Aliase ermöglichen es einem einzigen Playbook, zwei separate verwaltete Ausgaben zu erzeugen. Obwohl beide Aliase auf derselben VM ausgeführt werden, rendert Ansible inventory_hostname für jeden Host unterschiedlich.

Erstellen Sie Gruppenvariablen für die verwalteten Hosts.

cat > inventory/group_vars/managed.yml <<'EOF'
baseline_owner: labex
baseline_environment: training
EOF

Diese Variablen gelten für jeden Host in der Gruppe managed. Sie repräsentieren Werte, die über die gesamte Basislinie hinweg geteilt werden sollen, während der Hostname hostspezifisch bleibt.

Quelldatei und Vorlage erstellen

In diesem Schritt erstellen Sie die Quellinhalte. Die einfache Datei wird unverändert kopiert. Die Jinja2-Vorlage verwendet Variablen wie inventory_hostname und baseline_environment, um eine hostspezifische Ausgabe zu rendern.

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 eine gemeinsame Banner-Datei.

cat > files/banner.txt <<'EOF'
Managed by RHCE Ansible Prep
EOF

Das Banner ist ein einfacher Quellinhalt. Es wird exakt so kopiert, wie es geschrieben wurde, und eignet sich daher für Texte, die nicht hostabhängig variieren sollen.

Erstellen Sie eine Vorlage.

cat > templates/baseline.conf.j2 <<'EOF'
host={{ inventory_hostname }}
environment={{ baseline_environment }}
owner={{ baseline_owner }}
EOF

Die Vorlage enthält Jinja2-Ausdrücke. Wenn Ansible sie rendert, wird inventory_hostname zu node1 oder node2, während die Basisvariablen aus der Datei inventory/group_vars/managed.yml stammen.

Das Playbook zur Basisbereitstellung schreiben

In diesem Schritt schreiben Sie ein Playbook, das pro Host-Alias ein Verzeichnis erstellt und sowohl das gemeinsame Banner als auch die gerenderte Vorlage bereitstellt. Da das Playbook im Verzeichnis playbooks gespeichert ist, verwenden die Quellpfade ../files und ../templates.

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/deploy-baseline.yml <<'EOF'
---
- name: Deploy baseline files to managed aliases
  hosts: managed
  gather_facts: false
  tasks:
    - name: Create per-host baseline directory
      ansible.builtin.file:
        path: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}"
        state: directory
        mode: '0755'

    - name: Copy shared banner
      ansible.builtin.copy:
        src: ../files/banner.txt
        dest: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}/banner.txt"
        mode: '0644'

    - name: Render baseline configuration
      ansible.builtin.template:
        src: ../templates/baseline.conf.j2
        dest: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}/baseline.conf"
        mode: '0644'
EOF

Betrachten Sie die drei Tasks als eine vollständige Bereitstellungssequenz. Zuerst wird das Zielverzeichnis für jeden Host-Alias erstellt, dann das statische Banner kopiert und schließlich die Vorlage in eine hostspezifische Konfigurationsdatei gerendert.

Führen Sie eine Syntaxprüfung durch.

ansible-playbook playbooks/deploy-baseline.yml --syntax-check

Die Syntaxprüfung sollte eine playbook:-Zeile ausgeben. Dies bestätigt, dass Ansible die relativen Quellpfade parsen kann, bevor das Playbook tatsächlich verwaltete Dateien schreibt.

Die Basisbereitstellung ausführen und überprüfen

In diesem Schritt führen Sie das Playbook aus und überprüfen die gerenderten Dateien. Die gerenderte Konfiguration sollte sich je nach Hostname unterscheiden, während die gemeinsamen Werte für Umgebung und Eigentümer beibehalten werden.

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

cd /home/labex/project/rhce-ansible

Führen Sie das Playbook aus.

ansible-playbook playbooks/deploy-baseline.yml

Der erste Durchlauf sollte Änderungen melden, da die verwalteten Verzeichnisse und Dateien noch nicht existieren. Ein erfolgreiches Recap mit failed=0 bedeutet, dass jeder Host-Alias die Basisdateien erhalten hat.

Überprüfen Sie die bereitgestellten Dateien.

find managed -maxdepth 3 -type f -print
cat managed/node1/banner.txt managed/node1/baseline.conf managed/node2/banner.txt managed/node2/baseline.conf

Die banner.txt-Dateien sollten exakt übereinstimmen. Die baseline.conf-Dateien sollten dieselben environment- und owner-Werte enthalten, sich jedoch in der Zeile host= unterscheiden.

Zusammenfassung

Sie haben Basisdateien mithilfe von Inventory-Variablen, einer gemeinsamen Quelldatei und einer Jinja2-Vorlage auf verwalteten Host-Aliasen bereitgestellt. Damit ist das Fundament für wiederholbare Zustandsänderungen auf verwalteten Knoten gelegt.