So verwenden Sie Ansible: Ein Referenzhandbuch

Einführung

Ansible ist ein modernes Konfigurationsverwaltungstool, das die Aufgabe erleichtert, entfernte Server einzurichten und zu warten.

Dieser Leitfaden im Spickzettelstil bietet eine schnelle Referenz für Befehle und Praktiken, die häufig bei der Arbeit mit Ansible verwendet werden. Für einen Überblick über Ansible und Anleitungen zur Installation und Konfiguration empfehlen wir unseren Leitfaden „So installieren und konfigurieren Sie Ansible unter Ubuntu 20.04“.

So verwenden Sie diesen Leitfaden:

  • Dieser Leitfaden ist im Spickzettel-Format mit eigenständigen Befehlszeilen-Schnipseln.
  • Springen Sie zu dem Abschnitt, der für die Aufgabe relevant ist, die Sie abschließen möchten.
  • Wenn Sie hervorgehobenen Text in den Befehlen dieses Leitfadens sehen, beachten Sie bitte, dass sich dieser Text auf Hosts, Benutzernamen und IP-Adressen aus Ihrer eigenen Bestandsliste beziehen sollte.

Ansible-Glossar

Die folgenden spezifischen Ansible-Begriffe werden in diesem Leitfaden weitgehend verwendet:

  • Steuerungsrechner / -knoten: Ein System, auf dem Ansible installiert und konfiguriert ist, um Verbindungen herzustellen und Befehle auf Knoten auszuführen.
  • Knoten: Ein von Ansible gesteuerter Server.
  • Inventardatei: Eine Datei, die Informationen über die von Ansible gesteuerten Server enthält, normalerweise unter /etc/ansible/hosts zu finden.
  • Playbook: Eine Datei, die eine Reihe von Aufgaben enthält, die auf einem entfernten Server ausgeführt werden sollen.
  • Rolle: Eine Sammlung von Playbooks und anderen Dateien, die für ein Ziel wie die Installation eines Webservers relevant sind.
  • Spiel: Ein vollständiger Ansible-Durchlauf. Ein Spiel kann mehrere Playbooks und Rollen haben, die aus einem einzelnen Playbook eingefügt werden, das als Einstiegspunkt fungiert.

Wenn Sie ein Beispiel für diese Befehle in der Praxis sehen möchten, lesen Sie unseren Leitfaden Wie man Ansible verwendet, um die initiale Servereinrichtung unter Ubuntu 20.04 zu automatisieren. Sie benötigen mindestens einen entfernten Server, der als Knoten verwendet wird.

Testen der Konnektivität zu Knoten

Um zu testen, ob Ansible in der Lage ist, Befehle und Playbooks auf Ihren Knoten auszuführen, können Sie den folgenden Befehl verwenden:

  1. ansible all -m ping

Das ping-Modul wird testen, ob Sie gültige Anmeldeinformationen zum Verbinden mit den in Ihrer Inventardatei definierten Knoten haben, zusätzlich wird getestet, ob Ansible Python-Skripte auf dem entfernten Server ausführen kann. Eine Antwort mit Pong bedeutet, dass Ansible bereit ist, Befehle und Playbooks auf diesem Knoten auszuführen.

Verbindung als anderer Benutzer

Standardmäßig versucht Ansible, sich als Ihr aktueller Systembenutzer mit dem entsprechenden SSH-Schlüsselpaar mit den Knoten zu verbinden. Um sich als anderer Benutzer zu verbinden, fügen Sie dem Befehl die Option -u und den Namen des beabsichtigten Benutzers hinzu:

  1. ansible all -m ping -u sammy

Dasselbe gilt für ansible-playbook:

  1. ansible-playbook myplaybook.yml -u sammy

Verwendung eines benutzerdefinierten SSH-Schlüssels

Wenn Sie einen benutzerdefinierten SSH-Schlüssel verwenden, um sich mit den entfernten Servern zu verbinden, können Sie ihn zur Ausführungszeit mit der Option --private-key angeben:

  1. ansible all -m ping --private-key=~/.ssh/custom_id

Diese Option ist auch für ansible-playbook gültig:

  1. ansible-playbook myplaybook.yml --private-key=~/.ssh/custom_id

Verwendung der authentifizierungsbasierten Passwortmethode

Wenn Sie die Authentifizierung auf der Basis von Passwörtern verwenden müssen, um sich mit den Knoten zu verbinden, müssen Sie dem Ansible-Befehl die Option --ask-pass hinzufügen.

Dadurch fordert Ansible Sie auf, das Passwort des Benutzers auf dem entfernten Server einzugeben, mit dem Sie versuchen, sich zu verbinden:

  1. ansible all -m ping --ask-pass

Diese Option ist auch für ansible-playbook gültig:

  1. ansible-playbook myplaybook.yml --ask-pass

Bereitstellung des sudo-Passworts

Wenn der Remote-Benutzer ein Passwort angeben muss, um sudo-Befehle auszuführen, können Sie die Option --ask-become-pass zu Ihrem Ansible-Befehl hinzufügen. Dadurch werden Sie aufgefordert, das Passwort des Remote-Benutzers für sudo einzugeben:

  1. ansible all -m ping --ask-become-pass

Diese Option ist auch für ansible-playbook gültig:

  1. ansible-playbook myplaybook.yml --ask-become-pass

Verwendung einer benutzerdefinierten Inventardatei

Die Standard-Inventardatei befindet sich normalerweise unter /etc/ansible/hosts, aber Sie können auch die Option -i verwenden, um beim Ausführen von Ansible-Befehlen und Playbooks auf benutzerdefinierte Inventardateien zu verweisen. Ansible unterstützt auch Inventarskripte zum Erstellen dynamischer Inventardateien, für den Fall, dass sich Ihr Inventar ändert, wenn Server häufig erstellt und gelöscht werden. Benutzerdefinierte Inventardateien sind nützlich, um projektbezogene Inventare einzurichten, die in Versionskontrollsystemen wie Git enthalten sein können:

  1. ansible all -m ping -i my_custom_inventory

Dieselbe Option ist für ansible-playbook gültig:

  1. ansible-playbook myplaybook.yml -i my_custom_inventory

Ausführen von Ad-hoc-Befehlen

Um einen Befehl auf einem Knoten auszuführen, verwenden Sie die Option -a gefolgt vom Befehl, den Sie ausführen möchten, in Anführungszeichen.

Dies führt uname -a auf allen Knoten in Ihrem Inventar aus:

  1. ansible all -a "uname -a"

Es ist auch möglich, Ansible-Module mit der Option -m auszuführen. Der folgende Befehl würde das Paket vim auf server1 aus Ihrem Inventar installieren:

  1. ansible server1 -m apt -a "name=vim"

Vor dem Ändern Ihrer Knoten können Sie eine Trockenübung durchführen, um vorherzusagen, wie die Server von Ihrem Befehl betroffen wären. Dies kann durch Hinzufügen der Option --check erfolgen:

  1. ansible server1 -m apt -a "name=vim" --check

Ausführen von Playbooks

Um ein Playbook auszuführen und alle darin definierten Aufgaben auszuführen, verwenden Sie den Befehl ansible-playbook:

  1. ansible-playbook myplaybook.yml

Um die Standardoption hosts im Playbook zu überschreiben und die Ausführung auf eine bestimmte Gruppe oder einen bestimmten Host zu beschränken, fügen Sie die Option -l Ihrem Befehl hinzu:

  1. ansible-playbook -l server1 myplaybook.yml

Informationen über ein Play erhalten

Die Option --list-tasks wird verwendet, um alle Aufgaben aufzulisten, die von einem Play ausgeführt würden, ohne Änderungen an den entfernten Servern vorzunehmen:

  1. ansible-playbook myplaybook.yml --list-tasks

Ebenso ist es möglich, alle Hosts aufzulisten, die von einem Play betroffen wären, ohne Aufgaben auf den entfernten Servern auszuführen:

  1. ansible-playbook myplaybook.yml --list-hosts

Sie können Tags verwenden, um die Ausführung eines Plays zu beschränken. Um alle verfügbaren Tags in einem Play aufzulisten, verwenden Sie die Option --list-tags:

  1. ansible-playbook myplaybook.yml --list-tags

Ausführung des Playbooks steuern

Sie können die Option --start-at-task verwenden, um einen neuen Einstiegspunkt für Ihr Playbook festzulegen. Ansible überspringt dann alles, was vor der angegebenen Aufgabe kommt, und führt den Rest des Plays ab diesem Punkt aus. Diese Option erfordert einen gültigen Aufgabennamen als Argument:

  1. ansible-playbook myplaybook.yml --start-at-task="Set Up Nginx"

Um nur Aufgaben auszuführen, die bestimmten Tags zugeordnet sind, können Sie die Option --tags verwenden. Wenn Sie beispielsweise nur Aufgaben ausführen möchten, die als nginx oder mysql getaggt sind, können Sie Folgendes verwenden:

  1. ansible-playbook myplaybook.yml --tags=mysql,nginx

Wenn Sie alle Aufgaben überspringen möchten, die unter bestimmten Tags stehen, verwenden Sie --skip-tags. Der folgende Befehl würde myplaybook.yml ausführen und alle Aufgaben überspringen, die als mysql getaggt sind:

  1. ansible-playbook myplaybook.yml --skip-tags=mysql

Verwendung von Ansible Vault zum Speichern sensibler Daten

Wenn Ihre Ansible-Playbooks sensible Daten wie Passwörter, API-Schlüssel und Anmeldeinformationen verarbeiten, ist es wichtig, diese Daten durch Verwendung eines Verschlüsselungsmechanismus sicher aufzubewahren. Ansible stellt ansible-vault bereit, um Dateien und Variablen zu verschlüsseln.

Auch wenn es möglich ist, jede Ansible-Datendatei sowie Binärdateien zu verschlüsseln, ist es üblicher, ansible-vault zum Verschlüsseln von Variablendateien zu verwenden, die sensible Daten enthalten. Nach dem Verschlüsseln einer Datei mit diesem Tool können Sie deren Inhalt nur ausführen, bearbeiten oder anzeigen, indem Sie das relevante Passwort angeben, das beim ersten Verschlüsseln der Datei definiert wurde.

Erstellen einer neuen verschlüsselten Datei

Sie können eine neue verschlüsselte Ansible-Datei erstellen mit:

  1. ansible-vault create credentials.yml

Dieser Befehl führt die folgenden Aktionen aus:

  • Zuerst werden Sie aufgefordert, ein neues Passwort einzugeben. Sie müssen dieses Passwort immer angeben, wenn Sie auf die Dateiinhalte zugreifen, sei es zum Bearbeiten, Anzeigen oder einfach zum Ausführen von Playbooks oder Befehlen unter Verwendung dieser Werte.
  • Als nächstes öffnet es Ihren Standard-Befehlszeileneditor, damit Sie die Datei mit den gewünschten Inhalten füllen können.
  • Zum Schluss, wenn Sie mit der Bearbeitung fertig sind, speichert ansible-vault die Datei als verschlüsselte Daten.

Verschlüsseln einer vorhandenen Ansible-Datei

Um eine vorhandene Ansible-Datei zu verschlüsseln, können Sie die folgende Syntax verwenden:

  1. ansible-vault encrypt credentials.yml

Dies fordert Sie auf, ein Passwort einzugeben, das Sie immer angeben müssen, wenn Sie auf die Datei credentials.yml zugreifen.

Anzeigen des Inhalts einer verschlüsselten Datei

Wenn Sie den Inhalt einer Datei anzeigen möchten, die zuvor mit ansible-vault verschlüsselt wurde und deren Inhalt Sie nicht ändern müssen, können Sie Folgendes verwenden:

  1. ansible-vault view credentials.yml

Dies fordert Sie auf, das Passwort einzugeben, das Sie bei der ersten Verschlüsselung der Datei mit ansible-vault ausgewählt haben.

Bearbeiten einer verschlüsselten Datei

Um den Inhalt einer Datei zu bearbeiten, die zuvor mit Ansible Vault verschlüsselt wurde, führen Sie Folgendes aus:

  1. ansible-vault edit credentials.yml

Dies fordert Sie auf, das Passwort einzugeben, das Sie beim ersten Verschlüsseln der Datei credentials.yml mit ansible-vault gewählt haben. Nach der Passwortprüfung wird Ihr Standard-Befehlszeilen-Editor mit dem unverschlüsselten Inhalt der Datei geöffnet, sodass Sie Ihre Änderungen vornehmen können. Wenn Sie fertig sind, können Sie die Datei wie gewohnt speichern und schließen, und die aktualisierten Inhalte werden als verschlüsselte Daten gespeichert.

Verschlüsselte Dateien entschlüsseln

Wenn Sie eine Datei dauerhaft in ihre unverschlüsselte Version zurücksetzen möchten, die zuvor mit ansible-vault verschlüsselt wurde, können Sie dies mit dieser Syntax tun:

  1. ansible-vault decrypt credentials.yml

Dies fordert Sie auf, dasselbe Passwort einzugeben, das Sie verwendet haben, als Sie die Datei credentials.yml zum ersten Mal mit ansible-vault verschlüsselt haben. Nach der Passwortprüfung werden die Dateiinhalte als unverschlüsselte Daten auf die Festplatte gespeichert.

Die Verwendung mehrerer Tresorkennwörter

Ansible unterstützt mehrere Tresorkennwörter, die nach verschiedenen Tresor-IDs gruppiert sind. Dies ist nützlich, wenn Sie dedizierte Tresorkennwörter für verschiedene Umgebungen wie Entwicklung, Testen und Produktionsumgebungen haben möchten.

Um eine neue verschlüsselte Datei unter Verwendung einer benutzerdefinierten Tresor-ID zu erstellen, verwenden Sie die Option --vault-id zusammen mit einem Label und dem Speicherort, an dem ansible-vault das Kennwort für diesen Tresor finden kann. Das Label kann ein beliebiger Bezeichner sein, und der Speicherort kann entweder Prompt sein, was bedeutet, dass der Befehl Sie auffordert, ein Kennwort einzugeben, oder ein gültiger Pfad zu einer Kennwortdatei.

  1. ansible-vault create --vault-id dev@prompt credentials_dev.yml

Dies erstellt eine neue Tresor-ID mit dem Namen dev, die Prompt als Passwortquelle verwendet. Durch Kombinieren dieser Methode mit Gruppenvariablen können Sie separate Ansible-Tresore für jede Anwendungsumgebung haben:

  1. ansible-vault create --vault-id prod@prompt credentials_prod.yml

Wir haben dev und prod als Tresor-IDs verwendet, um zu demonstrieren, wie Sie separate Tresore pro Umgebung erstellen können, aber Sie können beliebig viele Tresore erstellen und jede beliebige Kennung als Tresor-ID verwenden.

Um diese Dateien anzuzeigen, zu bearbeiten oder zu entschlüsseln, müssen Sie dieselbe Tresor-ID und Quelle für das Kennwort zusammen mit dem ansible-vault-Befehl angeben:

  1. ansible-vault edit credentials_dev.yml --vault-id dev@prompt

Verwendung einer Passwortdatei

Wenn Sie den Prozess der Bereitstellung von Servern mit Ansible mithilfe eines Tools eines Drittanbieters automatisieren müssen, benötigen Sie eine Möglichkeit, das Tresorpasswort bereitzustellen, ohne dazu aufgefordert zu werden. Dies können Sie durch Verwendung einer Passwortdatei mit ansible-vault tun.

A password file can be a plain text file or an executable script. If the file is an executable script, the output produced by this script will be used as the vault password. Otherwise, the raw contents of the file will be used as vault password.

Um eine Passwortdatei mit ansible-vault zu verwenden, müssen Sie den Pfad zu einer Passwortdatei angeben, wenn Sie eines der Tresor-Befehle ausführen:

  1. ansible-vault create --vault-id dev@path/to/passfile credentials_dev.yml

Ansible macht keinen Unterschied zwischen Inhalten, die mit Prompt oder einer Passwortdatei als Passwortquelle verschlüsselt wurden, solange das Eingabepasswort dasselbe ist. Dies bedeutet praktisch, dass es in Ordnung ist, eine Datei mit Prompt zu verschlüsseln und später eine Passwortdatei zu verwenden, um dasselbe Passwort zu speichern, das mit der Methode Prompt verwendet wurde. Das Gegenteil ist ebenfalls wahr: Sie können Inhalte mit einer Passwortdatei verschlüsseln und später die Methode Prompt verwenden, indem Sie dasselbe Passwort angeben, wenn Sie von Ansible dazu aufgefordert werden.

Für erweiterte Flexibilität und Sicherheit können Sie anstelle Ihres Tresorpassworts, das in einer Klartextdatei gespeichert ist, ein Python-Skript verwenden, um das Passwort aus anderen Quellen zu erhalten. Das offizielle Ansible-Repository enthält ein paar Beispiele für Tresorskripte, die Sie als Referenz verwenden können, wenn Sie ein benutzerdefiniertes Skript erstellen, das den speziellen Anforderungen Ihres Projekts entspricht.

Ausführen eines Playbooks mit Daten, die über Ansible Vault verschlüsselt sind

Immer wenn Sie ein Playbook ausführen, das Daten verwendet, die zuvor über ansible-vault verschlüsselt wurden, müssen Sie dem Playbook-Befehl das Vault-Passwort bereitstellen.

Wenn Sie die Standardoptionen verwendet haben und die Option prompt als Passwortquelle beim Verschlüsseln der in diesem Playbook verwendeten Daten verwendet haben, können Sie die Option --ask-vault-pass verwenden, um Ansible dazu zu veranlassen, Sie nach dem Passwort zu fragen:

  1. ansible-playbook myplaybook.yml --ask-vault-pass

Wenn Sie anstelle der Eingabeaufforderung für das Passwort eine Passwortdatei verwendet haben, sollten Sie stattdessen die Option --vault-password-file verwenden:

  1. ansible-playbook myplaybook.yml --vault-password-file my_vault_password.py

Wenn Sie Daten verwenden, die unter einer Vault-ID verschlüsselt sind, müssen Sie dieselbe Vault-ID und dieselbe Passwortquelle angeben, die Sie beim ersten Verschlüsseln der Daten verwendet haben:

  1. ansible-playbook myplaybook.yml --vault-id dev@prompt

Wenn Sie eine Passwortdatei mit Ihrer Vault-ID verwenden, sollten Sie das Label gefolgt vom vollständigen Pfad zur Passwortdatei als Passwortquelle angeben:

  1. ansible-playbook myplaybook.yml --vault-id dev@vault_password.py

Wenn Ihr Play mehrere Vaults verwendet, sollten Sie für jeden von ihnen einen --vault-id-Parameter angeben, in keiner bestimmten Reihenfolge:

  1. ansible-playbook myplaybook.yml --vault-id dev@vault_password.py --vault-id test@prompt --vault-id ci@prompt

Fehlerbehebung

Wenn Sie beim Ausführen von Ansible-Befehlen und Playbooks auf Fehler stoßen, ist es eine gute Idee, die Ausgabeverbosity zu erhöhen, um mehr Informationen über das Problem zu erhalten. Sie können dies tun, indem Sie die Option -v zum Befehl hinzufügen:

  1. ansible-playbook myplaybook.yml -v

Wenn Sie mehr Details benötigen, können Sie -vvv verwenden, um die Ausgabeverbosity zu erhöhen. Wenn Sie keine Verbindung zu den Remote-Knoten über Ansible herstellen können, verwenden Sie -vvvv, um Verbindungsdebugging-Informationen zu erhalten:

  1. ansible-playbook myplaybook.yml -vvvv

Fazit

Dieser Leitfaden behandelt einige der häufigsten Ansible-Befehle, die Sie beim Bereitstellen von Servern verwenden können, wie z. B. das Ausführen von Remote-Befehlen auf Ihren Knoten und das Ausführen von Playbooks mit verschiedenen benutzerdefinierten Einstellungen.

Es gibt andere Befehlsvariationen und Flags, die für Ihren Ansible-Workflow nützlich sein können. Um einen Überblick über alle verfügbaren Optionen zu erhalten, können Sie den hilfe-Befehl verwenden:

  1. ansible --help

Wenn Sie eine umfassendere Ansicht von Ansible und allen verfügbaren Befehlen und Funktionen wünschen, lesen Sie bitte die offizielle Ansible-Dokumentation.

Wenn Sie ein weiteres praktisches Beispiel für Ansible sehen möchten, lesen Sie unseren Leitfaden zur Verwendung von Ansible zur Installation und Einrichtung von Docker unter Ubuntu 20.04.

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-ansible-cheat-sheet-guide