Website-Suche

So arbeiten Sie mit Ansible-Variablen und -Fakten – Teil 8


Wir haben Variablen in dieser Ansible-Serie erwähnt, nur um Sie ein wenig anzuregen. Eine Variable ist, wie in vielen Programmiersprachen, im Wesentlichen ein Schlüssel, der einen Wert darstellt.

Was macht einen gültigen Variablennamen aus?

Ein Variablenname enthält Buchstaben, Zahlen, Unterstriche oder eine Mischung aus zwei oder allen davon. Beachten Sie jedoch, dass ein Variablenname immer mit einem Buchstaben beginnen muss und keine Leerzeichen enthalten darf.

Schauen wir uns ein paar Beispiele für gültige und inakzeptable Variablennamen an:

Beispiele für gültige Variablennamen:

football 
foot_ball
football20 
foot_ball20

Beispiele für ungültige Variablennamen:

foot ball
20 
foot-ball

Lassen Sie uns die Variablentypen besprechen:

1. Playbook-Variablen

Playbook-Variablen sind recht einfach und unkompliziert. Um eine Variable in einem Playbook zu definieren, verwenden Sie einfach das Schlüsselwort vars, bevor Sie Ihre Variablen mit Einrückung schreiben.

Um auf den Wert der Variablen zuzugreifen, platzieren Sie ihn zwischen den doppelten geschweiften Klammern in Anführungszeichen.

Hier ist ein einfaches Playbook-Beispiel:

- hosts: all
  vars:
    greeting: Hello world! 

  tasks:
  - name: Ansible Basic Variable Example
    debug:
      msg: "{{ greeting }}"

Im obigen Playbook wird die Variable greeting durch den Wert Hello world! ersetzt, wenn das Playbook ausgeführt wird. Das Playbook gibt bei der Ausführung einfach die Meldung Hallo Welt! aus.

Darüber hinaus können Sie eine Liste oder ein Array von Variablen haben, wie gezeigt:

Das Playbook unten zeigt eine Variable namens Kontinente. Die Variable enthält 5 verschiedene Werte – Kontinentnamen. Auf jeden dieser Werte kann leicht zugegriffen werden, indem Index 0 als erste Variable verwendet wird.

Das folgende Beispiel des Playbooks ruft Asien (Index 1) ab und zeigt es an.

- hosts: all
  vars:
    continents:
      - Africa
      - Asia
      - South America
      - North America
      - Europe
      
  tasks:
  - name: Ansible List variable Example
    debug:
      msg: "{{ continents [1] }}"

Die Variablenliste kann ähnlich wie folgt aufgebaut sein:

vars:
    Continents: [Africa, Asia, South America, North America, Europe]

Um alle Elemente in der Liste aufzulisten, verwenden Sie das Modul with_items. Dadurch werden alle Werte im Array durchlaufen.

- hosts: all
  vars:
    continents: [Africa, Asia, South America, North America, Europe]

  tasks:
  - name: Ansible array variables example
    debug: 
      msg: "{{ item }}"
    with_items:
      - "{{ continents }}"

Eine andere Art von Ansible-Variablen ist die dictionary-Variable.

Dictionary-Variablen werden im Playbook zusätzlich unterstützt. Um die Wörterbuchvariable zu definieren, identifizieren Sie einfach das Schlüssel-Wert-Paar direkt unter dem Namen der Wörterbuchvariablen.

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 10.200.50.1
   vlans:
       id: 10
       port: 2

Im obigen Beispiel ist vlans die Wörterbuchvariable, während id und port die Schlüssel-Wert-Paare sind.

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 
   vlans:
      id: 10
      port: 20

 tasks:
   name: Configure default gateway
   system_configs:
   default_gateway_ip: “{{ default_gateway  }}“


   name: Label port on vlan 10
   vlan_config:
	vlan_id: “{{ vlans[‘id’]  }}“
     port_id: 1/1/ {{ vlans[‘port’]  }}

Da wir für port_id den Wert mit Text und nicht mit der Variablen beginnen, sind Anführungszeichen zum Einschließen der geschweiften Klammern nicht erforderlich.

2. Spezielle Variablen

Ansible stellt eine Liste vordefinierter Variablen bereit, auf die in Jinja2-Vorlagen und Playbooks verwiesen werden kann, die jedoch vom Benutzer nicht geändert oder definiert werden können.

Zusammenfassend wird die Liste der vordefinierten Ansible-Variablen als Ansible-Fakten bezeichnet und diese werden gesammelt, wenn ein Playbook ausgeführt wird.

Um eine Liste aller Ansible-Variablen zu erhalten, verwenden Sie das Modul setup im Ansible-Ad-hoc-Befehl wie unten gezeigt:

ansible -m setup hostname

Dadurch wird die Ausgabe im JSON-Format wie folgt angezeigt:

ansible -m setup localhost

Aus der Ausgabe können wir ersehen, dass einige Beispiele für Ansible-Spezialvariablen Folgendes umfassen:

ansible_architecture
ansible_bios_date
ansible_bios_version
ansible_date_time
ansible_machine
ansible_memefree_mb
ansible_os_family
ansible_selinux

Es gibt viele andere spezielle Ansible-Variablen. Dies sind nur einige Beispiele.

Diese Variablen können wie gezeigt in einer Jinja2-Vorlage verwendet werden:

<html>
<center>
   <h1> The hostname of this webserver is {{ ansible_hostname }}</h1>
   <h3> It is running on {{ ansible_os_family}}system </h3>
</center>
</html>

3. Inventarvariablen

Schließlich haben wir auf der Liste Ansible-Inventarvariablen. Ein Inventar ist eine Datei im INI-Format, die alle von Ansible zu verwaltenden Hosts enthält.

In Inventaren können Sie eine Variable einem Hostsystem zuweisen und diese später in einem Playbook verwenden.

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=ubuntu http_port=8080

Das Obige kann wie folgt in einer Playbook-YAML-Datei dargestellt werden:

---
   web_servers:
     web_server_1:
        ansible_user=centos
	   http_port=80

web_server_2:
        ansible_user=ubuntu
	   http_port=8080

Wenn die Hostsysteme dieselben Variablen verwenden, können Sie in der Inventardatei eine andere Gruppe definieren, um den Aufwand zu verringern und unnötige Wiederholungen zu vermeiden.

Zum Beispiel:

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=centos http_port=80

Das Obige kann wie folgt strukturiert werden:

[web_servers]
web_server_1
web_server_2


[web_servers:vars]
ansible_user=centos
http_port=80

Und in der Playbook-YAML-Datei wird dies wie gezeigt definiert:

---
   web_servers:
    
     hosts: 
       web_server_1:
	  web_server_2:

     vars: 
        ansible_user=centos
   http_port=80

Ansible Fakten

Beim Ausführen von Playbooks ist die erste Aufgabe, die Ansible ausführt, die Ausführung der Setup-Aufgabe. Ich bin mir ziemlich sicher, dass Sie auf die Ausgabe gestoßen sein müssen:

TASK:  [Gathering facts] *********

Ansible-Fakten sind nichts anderes als Systemeigenschaften oder Informationen über entfernte Knoten, mit denen Sie verbunden sind. Zu diesen Informationen gehören die Systemarchitektur, die Betriebssystemversion, BIOS-Informationen, Systemzeit und -datum, Systembetriebszeit, IP-Adresse und Hardwareinformationen, um nur einige zu nennen.

Um die Fakten über ein beliebiges System zu erhalten, verwenden Sie einfach das Modul setup, wie im folgenden Befehl gezeigt:

ansible -m setup hostname

Zum Beispiel:

ansible -m setup database_server

Dadurch wird ein großer Datensatz im JSON-Format ausgedruckt, wie hier gezeigt:

Ansible Facts sind hilfreich, um den Systemadministratoren dabei zu helfen, welche Vorgänge sie ausführen müssen. Je nach Betriebssystem können sie beispielsweise wissen, welche Softwarepakete installiert werden müssen und wie sie konfiguriert werden müssen usw.

Benutzerdefinierte Fakten

Wussten Sie auch, dass Sie Ihre eigenen benutzerdefinierten Fakten erstellen können, die von Ansible gesammelt werden können? Ja, du kannst. Wie gehen Sie also vor? Lassen Sie uns den Gang wechseln und sehen, wie.

Der erste Schritt besteht darin, ein Verzeichnis /etc/ansible/facts.d auf dem verwalteten oder Remote-Knoten zu erstellen.

Erstellen Sie in diesem Verzeichnis eine oder mehrere Dateien mit der Erweiterung .fact. Diese Datei(en) geben JSON-Daten zurück, wenn das Playbook auf dem Ansible-Kontrollknoten ausgeführt wird, einschließlich der anderen Fakten, die Ansible nach einer Playbook-Ausführung abruft.

Hier ist ein Beispiel für eine benutzerdefinierte Faktendatei namens date_time.fact, die Datum und Uhrzeit abruft.

mkdir -p /etc/ansible/facts.d
vim /etc/ansible/facts.d/date_time.fact

Fügen Sie die folgenden Zeilen hinzu.

#!/bin/bash
DATE=`date`
echo "{\"date\" : \"${DATE}\"}"

Speichern und beenden Sie die Datei.

Vergeben Sie nun die Ausführungsrechte:

chmod +x /etc/ansible/facts.d/date_time.fact

Jetzt habe ich ein Playbook auf dem Ansible-Kontrollknoten mit dem Namen check_date.yml erstellt.

---

- hosts: webservers

  tasks:
   - name: Get custom facts
     debug:
      msg: The custom fact is {{ansible_local.date_time}}

Hängen Sie die Faktendatei an die Variable ansible_local an. Das ansible_local speichert alle benutzerdefinierten Fakten.

Führen Sie nun das Playbook aus und beobachten Sie, wie Ansible die in der Faktendatei gespeicherten Informationen abruft:

ansible_playbook check_date.yml

Abschluss

Damit sind wir am Ende dieses Tutorials zum Arbeiten mit Ansible-Variablen und -Fakten angelangt.