Variablen und Facts über mehrere Inventare hinweg verwenden

AnsibleBeginner
Jetzt üben

Einführung

Ein wiederverwendbares Playbook sollte Umgebungsdaten verwenden, statt separate Entwicklungs- und Produktionsantworten fest zu codieren. Inventarauswahl, Variablengeltungsbereich und Ziel-Facts bestimmen, was jeder Knoten erhält.

Sie verwenden zwei Inventare, die unterschiedliche SSH-Knoten auswählen, speichern Gruppen- und Hostdaten neben der jeweiligen Quelle und erzeugen Einstellungen mit einem einzigen Playbook. Außerdem wenden Sie eine temporäre Überschreibung durch eine zusätzliche Variable an und stellen eine stabile Ausgangskonfiguration wieder her.

Inventardaten nach Umgebung trennen

In diesem Schritt geben Sie Entwicklung und Produktion separate Inventarquellen und Gruppenvariablenwerte.

Wechseln Sie ins Projekt:

cd /home/labex/project

Die Übung stellt zwei kleine Inventare bereit. Lesen Sie jedes, bevor Sie Automatisierung ausführen:

cat inventories/dev/hosts.ini
cat inventories/prod/hosts.ini

Die app-Gruppe von dev enthält web1; die app-Gruppe von prod enthält web2. Ihre Adressen und SSH-Einstellungen sind vorbereitet. Dies sind tatsächlich eigenständige Knoten, keine zwei Namen für localhost.

-i wählt für diesen Aufruf eine Inventarquelle aus und überschreibt das Standardinventar des Projekts. Zeigen Sie jede Umgebung separat vorab an:

ansible app -i inventories/dev/hosts.ini --list-hosts
ansible app -i inventories/prod/hosts.ini --list-hosts

Erwarten Sie web1 für dev und web2 für prod. Kombinieren Sie diese beiden Quellen nicht, um isolierte Umgebungen zu simulieren: Quellen können zusammengeführt werden, und derselbe Inventarhostname identifiziert weiterhin einen Host. Halten Sie den Aufruf jeder Umgebung ausdrücklich getrennt.

Eine Variable ist ein benannter Wert, den die Automatisierung verwendet. Eine YAML-Zuordnung verwendet Zeilen der Form name: value. Ansible lädt group_vars/app.yml neben einem Inventar für dessen app-Gruppe. Erstellen Sie für denselben Gruppennamen in jeder Umgebung unterschiedliche Daten:

cat > inventories/dev/group_vars/app.yml <<'EOF'
environment_label: development
release_channel: preview
EOF
cat > inventories/prod/group_vars/app.yml <<'EOF'
environment_label: production
release_channel: stable
EOF

Untersuchen Sie die aufgelösten Inventardaten. --list gibt JSON zurück, einschließlich eines Objekts _meta.hostvars für Hostwerte:

ansible-inventory -i inventories/dev/hosts.ini --list
ansible-inventory -i inventories/prod/hosts.ini --list

Der dev-Host sollte development/preview auflösen; der prod-Host production/stable. Eine Variablendatei ist nur wirksam, wenn das vorgesehene Inventar und die vorgesehene Gruppe sie tatsächlich laden.

Hostvariablen und tatsächliche Facts verwenden

In diesem Schritt überschreiben Sie den Gruppenwert eines Hosts und erzeugen aus Umgebungsdaten tatsächliche verwaltete Einstellungen.

Eine Datei unter host_vars wird nach einem Inventarhost benannt. Für denselben Host und Schlüssel überschreibt dessen Hostvariable die hier verwendete Gruppenvariable. Geben Sie dem Entwicklungs-Canary einen hostspezifischen Veröffentlichungskanal:

cat > inventories/dev/host_vars/web1.yml <<'EOF'
release_channel: canary
EOF

Entwicklung hat weiterhin environment_label development, aber web1 löst release_channel nun zu canary auf. Produktion bleibt stable. Bestätigen Sie die dev-Auflösung:

ansible-inventory -i inventories/dev/hosts.ini --list

Schreiben Sie ein wiederverwendbares Playbook für beide Inventare:

cat > deploy-info.yml <<'EOF'
- name: Configure environment-specific application settings
  hosts: app
  gather_facts: true
  vars:
    banner_prefix: Managed environment
  tasks:
    - name: Write settings from variables and facts
      ansible.builtin.copy:
        dest: /home/automation/app-settings.conf
        content: |
          [application]
          environment={{ environment_label }}
          channel={{ release_channel }}
          host={{ inventory_hostname }}
          distribution={{ ansible_facts.distribution }}
          label={{ banner_prefix }}
        mode: "0640"
EOF

vars definiert den Wert banner_prefix auf Play-Ebene. Innerhalb des copy-Inhalts fügt {{ variable_name }} zur Ausführungszeit einen Wert ein. Dies ist einfache Wertersetzung; eine spätere Übung verwaltet eigenständige Jinja-Vorlagen.

Das YAML-Zeichen | erhält den folgenden eingerückten Inhalt als mehrzeiligen Text einschließlich seines abschließenden Zeilenumbruchs. inventory_hostname ist der aktuelle Inventarname. Mit gather_facts true sammelt Ansible vor den Aufgaben Zieldaten; ansible_facts.distribution liefert die tatsächliche Betriebssystemdistribution. Dies sind Zieldaten, kein Fact über den Controller.

Prüfen Sie die Syntax und führen Sie dasselbe Playbook anschließend separat für jede Umgebung aus:

ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml --syntax-check
ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml
ansible-playbook -i inventories/prod/hosts.ini deploy-info.yml

Lesen Sie beide tatsächlichen Dateien über ihr jeweiliges Inventar:

ansible app -i inventories/dev/hosts.ini -m ansible.builtin.command -a 'cat /home/automation/app-settings.conf'
ansible app -i inventories/prod/hosts.ini -m ansible.builtin.command -a 'cat /home/automation/app-settings.conf'

Entwicklung sollte environment=development, channel=canary und host=web1 enthalten. Produktion sollte environment=production, channel=stable und host=web2 enthalten. Beide sollten distribution=Ubuntu und label=Managed environment enthalten. Das gemeinsame Playbook hat durch die Verwendung unterschiedlicher Daten unterschiedliche Zielinhalte erzeugt.

Einen Aufruf überschreiben und die Ausgangskonfiguration wiederherstellen

In diesem Schritt verwenden Sie eine zusätzliche Variable, ohne die gespeicherten Inventardaten zu bearbeiten, und kehren anschließend zu einer konvergierten Ausgangskonfiguration zurück.

-e übergibt für diese Ausführung eine zusätzliche Variable. Sie überschreibt die hier gezeigten Gruppen- und Hostwerte. Wählen Sie ausschließlich in der Entwicklung vorübergehend einen Hotfix-Kanal:

ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml -e release_channel=hotfix

Lesen Sie die daraus entstandene dev-Konfiguration:

ansible app -i inventories/dev/hosts.ini -m ansible.builtin.command -a 'cat /home/automation/app-settings.conf'

Ihr Kanal sollte hotfix sein. Die Quelldateien group_vars und host_vars wurden von -e nicht bearbeitet, und Produktion wurde nicht ausgewählt.

Führen Sie den Aufruf ohne zusätzliche Variable aus, um den gespeicherten canary-Kanal von web1 wiederherzustellen:

ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml

Zeigen Sie nun eine Vorschau beider Ausgangsumgebungen an:

ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml --check
ansible-playbook -i inventories/prod/hosts.ini deploy-info.yml --check

Jeder ausgewählte Host sollte null ausstehende Änderungen und keine Fehler/unerreichbaren Ergebnisse melden. Die hier geübten begrenzten Prioritätsbeziehungen sind Gruppendaten, eine Hostüberschreibung und eine Überschreibung durch eine zusätzliche Variable. Komplexere Prioritätsregeln gehören nicht zu dieser Übung.

Zusammenfassung

Sie haben unterschiedliche Umgebungsinventare ausgewählt, Gruppendaten geladen, eine hostspezifische Überschreibung angewendet und mit einem gemeinsamen Playbook tatsächliche Ziel-Facts ausgegeben. Eine temporäre zusätzliche Variable änderte einen Aufruf, und anschließende Ausführungen mit den Ausgangsdaten brachten beide Umgebungen zu stabilen deklarierten Einstellungen zurück.