Ansible-Variablentypen: Wie verwendet man Variablen in Ansible?
Ansible-Variablen sind nützlich, um Unterschiede zwischen verschiedenen Systemen zu verwalten. Diese Plattform ermöglicht die gleichzeitige Ausführung von Playbooks und Aufgaben auf mehreren Systemen mit einem einzigen Befehl. Unterschiede zwischen den Systemen lassen sich durch die Definition von Variablen in YAML-Syntax, einschließlich Listen und Wörterbüchern, ausdrücken.
Diese Variablen können an verschiedenen Stellen festgelegt werden, beispielsweise in Befehlszeilen, wiederverwendbaren Dateien oder Rollen, im Inventar oder in Playbooks. Darüber hinaus können während der Ausführung von Playbooks neue Variablen generiert werden, indem die Rückgabewerte von Aufgaben als Variablen zugewiesen werden.
In diesem Leitfaden werden wir die Konzepte der Ansible-Variablen durchgehen und deren Verwendung, Typen und Funktionalität im Detail untersuchen.
Welche Bedeutung haben Ansible-Variablen?
Ansible ist ein beliebtes Tool für das Konfigurationsmanagement, das häufig zur effizienten Verwaltung mehrerer Server eingesetzt wird. Es vereinfacht Aufgaben wie die Serverkonfiguration und die Installation von Anwendungen durch die Automatisierung von Prozessen. Mit Ansible können Sie problemlos eine große Anzahl von Remote-Servern verwalten und Aufgaben nacheinander von einem zentralen Kernknoten aus ausführen. Dies rationalisiert Verwaltungsaufgaben, steigert die Produktivität und gewährleistet Konsistenz in Ihrer gesamten Infrastruktur.
Variablen in Ansible dienen als leistungsstarke Werkzeuge zur Vereinfachung der Verwaltung dynamischer Werte im gesamten Projekt und verringern so die Wahrscheinlichkeit menschlicher Fehler. Sie bieten eine bequeme Möglichkeit, Abweichungen und Diskrepanzen zwischen verschiedenen Umgebungen und Systemen zu handhaben. Mit Variablen gewinnen wir die Flexibilität, diese an verschiedenen Stellen zu definieren, jeweils mit unterschiedlichen Prioritätsstufen, die auf unsere spezifischen Anforderungen zugeschnitten sind. Darüber hinaus ermöglicht uns Ansible, neue Variablen direkt in unseren Playbooks zu registrieren, indem wir die Ausgabe von Aufgaben erfassen, was die Anpassungsmöglichkeiten weiter verbessert. Eine bemerkenswerte Art von Variablen in Ansible sind Ansible-Facts, die wertvolle Informationen liefern, die von Remote-Hosts abgerufen werden. Diese Facts, auf die über die Variable `ansible_facts` zugegriffen werden kann, bieten Einblicke in verschiedene Aspekte der Zielsysteme.
So können wir beispielsweise Details zur Betriebssystemdistribution (ansible_distribution) und -version (ansible_version), Informationen zu Host-Geräten, die von Ansible verwendete Python-Version (ansible_python_version) sowie die Systemarchitektur abrufen. Die Nutzung von Ansible-Facts bereichert unsere Projekte, indem sie fundierte Entscheidungsfindung und effiziente Automatisierungsabläufe ermöglicht.
Regeln für Ansible-Variablennamen
Variablen in Ansible werden nach bestimmten Richtlinien vergeben, die die Namenskonventionen für Variablen vorschreiben.
- In Ansible muss der Variablenname entweder mit einem Groß- oder einem Kleinbuchstaben beginnen. Zum Beispiel username, Saleprice usw.
- Variablen in Ansible enthalten Buchstaben (entweder Groß- oder Kleinbuchstaben oder eine Kombination daraus), Unterstriche und Ziffern – zum Beispiel username, sale_price, foo23 usw.
- Bestimmte Zeichenfolgen oder Schlüsselwörter sind für spezielle Funktionen reserviert und können nicht als gültige Variablennamen verwendet werden. Dazu gehören Playbook-Schlüsselwörter und Python-Schlüsselwörter.
Obwohl nicht zwingend erforderlich, ist es ratsam, einfache und aussagekräftige Variablennamen zu verwenden. Diese Vorgehensweise vereinfacht Ihren Arbeitsablauf in Ansible.
Arten von Ansible-Variablen
Es gibt verschiedene Arten von Ansible-Variablen, die Sie in einem Playbook auf unterschiedliche Weise definieren und verwenden können.
- Einfache Variablen;
- Spezielle Variablen (Verbindungsvariablen, Magic-Variablen, Ansible-Facts);
- Register-Variablen.
Einfache Ansible-Variablen ()
Die grundlegendste Verwendung einfacher Variablen besteht darin, eine Variable mit einem einzelnen Wert in der YAML-Datei des Playbooks zu definieren.
Betrachten wir ein einfaches Beispiel für ein Playbook, das eine Meldung ausgibt.
--
- name: Example Playbook with Variables
hosts: all
gather_facts: false
vars:
greeting_message: "Hello, welcome to Ansible variables understanding!"
tasks:
- name: Display Greeting
debug:
msg: "{ greeting_message }"
In the playbook above, we demonstrated the use of simple Ansible variables:
name: Identifies the playbook and provides a description.
hosts: Specifies the target hosts where the tasks will be executed. In this case, we set all.
tasks: Contains a list of tasks to be executed on the specified hosts.
name: Describes the task.
greeting_message is a variable that contains the message "Hello, welcome to Ansible variables understanding!".
debug: Specifies a module to use that prints messages for debugging purposes. The debug task displays the value of the greeting_message variable.
msg: Defines the message to be printed.
Führen Sie das Playbook aus, und der Wert von `geeting_message` wird in einer `msg`-Anzeige angezeigt.
Ansible-Set-Variablen in Aufgaben
Ansible-Set-Variablen sind benutzerdefinierte Variablen, die Sie innerhalb von Playbooks oder Rollen definieren und mit Werten belegen können. Diese Variablen werden in der Regel verwendet, um Informationen zu speichern, die sich je nach Ihrer Umgebung oder Ihren Anforderungen ändern können. Sie können Variablen auf verschiedenen Ebenen festlegen, beispielsweise global, innerhalb eines Playbooks oder einer bestimmten Aufgabe. Sehen wir uns ein Beispiel an:
---
- name: Set variables
hosts: localhost
tasks:
- name: Set user role variables
set_fact:
user_name: "supervisor"
user_permissions: "rwx"
- name: Display user variables
debug:
msg: "The user '{ user_name }' has permissions '{ user_permissions }'"
Ansible-Variablen mit Arrays und Schleifen
In Ansible werden Arrays, genau wie in Programmiersprachen, verwendet, um Sammlungen miteinander in Zusammenhang stehender Elemente zu speichern. Diese Sammlungen, die als Arrays bezeichnet werden, können mehrere Werte desselben Datentyps enthalten.
Betrachten wir ein Beispiel für ein Ansible-Playbook, das Variablen mit Arrays/Listen verwendet und veranschaulicht, wie man diese in einer Schleife durchläuft:
---
- name: Example Playbook with Variable Arrays and Loops
hosts: all
gather_facts: false
vars:
fruits:
- apple
- banana
- orange
tasks:
- name: Display Fruits
debug:
msg: "The fruit is { item }"
loop: "{ fruits }"
Im obigen Playbook ist „fruits“ eine Variable, die ein Array/eine Liste von Früchten enthält. Die loop-Anweisung wird verwendet, um das fruits-Array zu durchlaufen. Innerhalb der Schleife zeigt die debug-Aufgabe jede Frucht mithilfe der item-Variablen an.
Ansible-Spezialvariablen
In Ansible sind Spezialvariablen vordefinierte Variablen, die wichtige Informationen über das System, das Inventar oder den Kontext der Playbook-Ausführung enthalten. Ansible-Spezialvariablen werden in verschiedene Typen unterteilt, wie z. B. Magic-Variablen, Verbindungsvariablen und Ansible-Facts. Ihre Namen sind reserviert, was bedeutet, dass Sie keine Variablen mit denselben Namen wie diese Spezialvariablen definieren können.
Ansible-Facts
Ansible-Facts sind Details, die während der Ausführung des Playbooks über die Hosts gesammelt werden. Dieser als „Gathering Facts“ bezeichnete Prozess umfasst das Erfassen von Informationen wie der IP-Adresse des Systems, dem aktuellen Datum und der Uhrzeit, BIOS-Spezifikationen, Festplattenpartitionen und anderen relevanten Hardware-Details.
In diesem Beispiel:
Wir setzen gather_facts auf true, wodurch Ansible angewiesen wird, Informationen über die Zielhosts zu erfassen. Anschließend verwenden wir das Debug-Modul, um einige der erfassten Fakten anzuzeigen, wie z. B. den Hostnamen (ansible_hostname), die Distribution (ansible_distribution) und deren Version (ansible_distribution_version) sowie den Gesamtspeicher (ansible_memtotal_mb). Wenn Sie dieses Playbook mit ansible-playbook ausführen, sammelt Ansible Fakten von allen in Ihrer Inventardatei angegebenen Hosts und zeigt die relevanten Informationen für jeden Host an. Hier sammeln wir Informationen nur für „localhost“.
Um die mit Ihrem lokalen System verbundenen Ansible-Facts anzuzeigen, führen Sie den folgenden Befehl aus:
$ sudo ansible -m setup localhost
Der obige Befehl verwendet das Modul „setup“, um Fakten über das „localhost“-System zu erfassen. Er gibt eine Ausgabe im JSON-Format aus, die eine Vielzahl von Informationen über das lokale System enthält, wie z. B. Hardware-Details, Netzwerkkonfiguration, Betriebssystem und mehr.
Ansible-Magic-Variablen
Ansible-Magic-Variablen sind vordefinierte Variablen, die Informationen über die Ausführungsumgebung, den aktuellen Host oder andere kontextbezogene Details liefern. Magic-Variablen in Ansible werden automatisch vom Tool generiert und sind unveränderlich, was bedeutet, dass Benutzer ihre Werte nicht ändern können. Diese Variablen repräsentieren stets den internen Zustand von Ansible und können von Benutzern nicht verändert werden. Daher sind sie nur in ihrer vordefinierten Form verwendbar und können nicht angepasst werden.
Hier ist ein Beispiel für die Verwendung von Ansible-Magievariablen in einem Playbook:
---
- hosts: all
tasks:
- debug:
var: ansible_version
Ansible-Verbindungsvariablen
Verbindungsvariablen in Ansible dienen als Konfigurationseinstellungen, die festlegen, wie Ansible während der Ausführung von Aufgaben und Playbooks Verbindungen zu Remote-Hosts herstellt. Sie bieten Flexibilität bei der Verwaltung verschiedener Verbindungstypen, Authentifizierungsmechanismen und host-spezifischer Konfigurationen.
Nehmen wir ein Beispiel, bei dem wir den Befehl „date“ auf dem lokalen Host ausführen.
---
- name: Run Command on Localhost
hosts: localhost
connection: local
gather_facts: no
vars:
command_to_run: "date"
Aufgaben:
- name: Execute Command
ansible.builtin.shell: "{ command_to_run }"
register: command_output
- name: Display Command Output
ansible.builtin.debug:
msg: "Command output: { command_output.stdout }"
Im obigen Beispiel:
name: Describes the name of the playbook, which is "Run Command on Localhost."
hosts: Specifies the target hosts for the playbook. Here, it's set to localhost, meaning the playbook will run on the local machine only.
connection: Indicates how Ansible connects to the target hosts. Setting it to local means that Ansible executes tasks directly on the control node, which is the local machine.
gather_facts: Controls whether Ansible should gather facts about the target hosts. It's set to no, indicating Ansible won't collect any facts.
vars: Defines variables specific to this playbook. It sets a variable named command_to_run with the value "date," representing a shell command to fetch the current date.
tasks: Contains the list of tasks that Ansible will execute.
name: Describes the purpose of the task, which is to execute a command and display its output.
ansible.builtin.shell: This task module executes shell commands on the target hosts. Here, it runs the command specified in the command_to_run variable.
register: Captures the output of the shell command for later use. The output is stored in command_output.
ansible.builtin.debug: This task module is used to print the debug messages. Here, it displays the output of the command captured in command_output.stdout.
Nach der Ausführung dieses Ansible-Playbooks sehen Sie die Ausführung des Befehls date auf dem lokalen Host und die Anzeige der Ausgabe, d. h. des aktuellen Datums und der aktuellen Uhrzeit.
Ansible-Registervariablen
Das Ansible-Registermodul dient dazu, die Ausgabe einer Aufgabe in einer Variablen zu speichern. In der Regel wird dabei eine Aufgabe auf einem Remote-Host mithilfe von Modulen wie „shell“ oder „command“ ausgeführt. Sobald das Registermodul die Ausgabe der Aufgabe erfasst hat, kann darauf in verschiedenen Kontexten Bezug genommen werden, beispielsweise in bedingten Anweisungen oder bei der Ausgabe der Ergebnisse.
Sehen wir uns an, wie das Registermodul eingesetzt wird, um die Ausgabe einer Aufgabe zu erfassen. Im bereitgestellten Playbook wird der Befehl „free“ auf einem lokalen Host ausgeführt. Das Register-Modul erfasst die Ausgabe des Befehls, die anschließend auf der Standardausgabe (stdout) angezeigt wird.
---
- name: Ansible Register Variable Example
hosts: localhost
tasks:
- name: Get Memory Usage
shell: "free"
register: memory_usage
- debug:
var: memory_usage.stdout
In diesem Beispiel:
Das „shell“-Modul wird verwendet, um den Befehl „free“ auszuführen, der Informationen zur Speicherauslastung anzeigt. Die Ausgabe des Befehls „free“ wird vom „register“-Modul erfasst und in der Variablen „memory_usage“ gespeichert. Das „debug“-Modul zeigt dann die erfasste Ausgabe des Befehls „free“ mithilfe des Attributs „stdout“ der Variablen „memory_usage“ an. Dieses Playbook führt den Befehl „free“ auf dem lokalen Host aus, Sie können ihn jedoch für alle Hosts in der Inventardatei angeben und die von jedem Host erfassten Informationen zur Speicherauslastung anzeigen.
Fazit
In diesem Leitfaden haben wir uns eingehend mit Ansible-Variablen befasst und untersucht, wie man sie in verschiedenen Szenarien definiert und referenziert. Durch den Einsatz von Variablen erhalten Sie die Möglichkeit, Ihre Playbooks anzupassen und zu parametrisieren, was die Flexibilität und Anpassungsfähigkeit erhöht.
Darüber hinaus haben wir wichtige Best Practices zur Optimierung der Variablennutzung in Playbooks vorgestellt, um reibungslosere Automatisierungsabläufe zu gewährleisten und die Komplexität zu reduzieren. Wir haben gezeigt, wie Sie verschiedene Ansible-Variablentypen in einem Playbook verwenden und auf Ihrem System ausführen können. Wenn Sie ein Remote-Hosting oder einen VPS-Linux-Server nutzen, können Sie die oben genannten Richtlinien anwenden und die Ansible-Variablen auf Ihrem Linux-Server einsetzen.
Um mehr über Ansible-Variablen zu erfahren und weitere Möglichkeiten zu erkunden, empfehlen wir Ihnen, die offizielle Ansible-Dokumentation zu konsultieren. Dort finden Sie umfassende Ressourcen und zusätzliche Einblicke in Ansible-Variablen, die es Ihnen ermöglichen, das volle Potenzial dieser leistungsstarken Funktion auszuschöpfen. Nutzen Sie die Vielseitigkeit von Ansible-Variablen, um Ihre Automatisierungsstrategien zu optimieren und die Effizienz Ihrer gesamten Infrastruktur zu steigern.
Blog