Configuration Management 101: Schreiben von Ansible Playbooks

Einführung

Kurz gesagt, das Serverkonfigurationsmanagement (im Volksmund auch als IT-Automatisierung bezeichnet) ist eine Lösung, mit der Sie Ihre Infrastrukturverwaltung in eine Codebasis verwandeln können. Es beschreibt alle für die Bereitstellung eines Servers erforderlichen Prozesse in einer Reihe von Bereitstellungsskripten, die versioniert und problemlos wiederverwendet werden können. Es kann die Integrität jeder Serverinfrastruktur im Laufe der Zeit erheblich verbessern.

In einem vorheriges Handbuch haben wir über die wichtigsten Vorteile der Implementierung einer Konfigurationsmanagementstrategie für Ihre Serverinfrastruktur gesprochen, wie das Konfigurationsmanagement Tools funktionieren und was diese Tools normalerweise gemeinsam haben.

Dieser Teil der Serie führt Sie durch den Prozess der Automatisierung der Serverbereitstellung mit Ansible, einem Konfigurationsverwaltungstool, das ein vollständiges Automatisierungsframework und Orchestrierungsfunktionen bietet und gleichzeitig das Ziel höchster Einfachheit und Minimalität verfolgt. Wir werden uns auf die Sprachterminologie, die Syntax und die Funktionen konzentrieren, die für die Erstellung eines vereinfachten Beispiels erforderlich sind, um die Bereitstellung eines Ubuntu 18.04-Webservers mit Apache vollständig zu automatisieren.

Die folgende Liste enthält alle Schritte, die wir automatisieren müssen, um unser Ziel zu erreichen:

  1. Aktualisiere den + apt + Cache

  2. Installieren Sie Apache

  3. Erstellen Sie ein benutzerdefiniertes Dokumentstammverzeichnis

  4. Platzieren Sie eine "+ index.html" -Datei im Stammverzeichnis des benutzerdefinierten Dokuments

  5. Wenden Sie eine Vorlage an, um unseren benutzerdefinierten virtuellen Host einzurichten

  6. Starten Sie Apache neu

Zunächst werfen wir einen Blick auf die von Ansible verwendete Terminologie, gefolgt von einem Überblick über die wichtigsten Sprachfunktionen, die zum Schreiben von Spielbüchern verwendet werden können. Am Ende des Handbuchs finden Sie den Inhalt eines vollständigen Bereitstellungsbeispiels zur Automatisierung der zum Einrichten von Apache unter Ubuntu 18.04 beschriebenen Schritte.

Anfangen

Bevor wir uns mit Ansible näher befassen können, ist es wichtig, dass wir uns mit wichtigen Begriffen und Konzepten vertraut machen, die mit diesem Tool eingeführt werden.

Terminologie

Die folgende Liste enthält einen schnellen Überblick über die wichtigsten von Ansible verwendeten Begriffe:

  • * Kontrollknoten *: Der Computer, auf dem Ansible installiert ist und der für die Bereitstellung auf den von Ihnen verwalteten Servern verantwortlich ist.

  • * Inventar *: Eine "+ INI +" - Datei, die Informationen zu den von Ihnen verwalteten Servern enthält.

  • * Playbook *: Eine + YAML + - Datei mit einer Reihe von Prozeduren, die automatisiert werden sollten.

  • * Task *: Ein Block, der eine einzelne auszuführende Prozedur definiert, z. B .: ein Paket installieren.

  • * Modul *: Ein Modul abstrahiert normalerweise eine Systemaufgabe, z. B. das Behandeln von Paketen oder das Erstellen und Ändern von Dateien. Ansible verfügt über eine Vielzahl integrierter Module, Sie können jedoch auch benutzerdefinierte Module erstellen.

  • * Rolle *: Eine Reihe zusammengehöriger Wiedergabebücher, Vorlagen und anderer Dateien, die in vordefinierter Weise organisiert sind, um die Wiederverwendung und den Austausch zu erleichtern.

  • * Play *: Eine von Anfang bis Ende ausgeführte Bereitstellung wird als play bezeichnet.

  • * Fakten *: Globale Variablen, die Informationen zum System enthalten, z. B. Netzwerkschnittstellen oder Betriebssystem.

  • * Handler *: Dient zum Auslösen von Dienststatusänderungen, z. B. Neustarten oder erneutes Laden eines Dienstes.

Aufgabenformat

Eine Aufgabe definiert einen einzelnen automatisierten Schritt, der von Ansible ausgeführt werden soll. Dies beinhaltet normalerweise die Verwendung eines Moduls oder die Ausführung eines Rohbefehls. So sieht eine Aufgabe aus:

- name: This is a task
 apt: name=vim state=latest

Der Teil "+ name " ist eigentlich optional, wird jedoch empfohlen, da er in der Ausgabe der Bereitstellung angezeigt wird, wenn die Aufgabe ausgeführt wird. Der ` apt ` - Teil ist ein integriertes Ansible-Modul, das die Verwaltung von Paketen auf Debian-basierten Distributionen zusammenfasst. Diese Beispielaufgabe teilt Ansible mit, dass der Status des Pakets " vim " in " latest +" geändert werden soll, wodurch der Paketmanager dieses Paket installiert, falls es noch nicht installiert ist.

Playbook-Format

Playbooks sind + YAML + - Dateien, die eine Reihe von Anweisungen enthalten, um die Bereitstellung eines Servers zu automatisieren. Das folgende Beispiel ist ein einfaches Wiedergabebuch, das zwei Aufgaben ausführt: Aktualisiert den "+ apt " - Cache und installiert anschließend " vim +":

---
- hosts: all
 become: true
 tasks:
    - name: Update apt-cache
      apt: update_cache=yes

    - name: Install Vim
      apt: name=vim state=latest

+ YAML + verwendet Einrückungen, um Datenstrukturen zu serialisieren. Aus diesem Grund müssen Sie beim Schreiben von Spielbüchern und insbesondere beim Kopieren von Beispielen besonders vorsichtig sein, um den richtigen Einzug beizubehalten.

Vor dem Ende dieses Handbuchs sehen wir ein realistischeres Beispiel eines Spielbuchs, das im Detail erklärt wird. Der nächste Abschnitt gibt Ihnen einen Überblick über die wichtigsten Elemente und Funktionen, die zum Schreiben von Ansible-Playbooks verwendet werden können.

Spielbücher schreiben

Nachdem Sie mit der grundlegenden Terminologie und dem allgemeinen Format von Playbooks und Aufgaben in Ansible vertraut sind, lernen Sie einige Playbook-Funktionen kennen, mit denen wir vielseitigere Automatisierungen erstellen können.

Mit Variablen arbeiten

Es gibt verschiedene Möglichkeiten, wie Sie Variablen in Ansible definieren können. Der einfachste Weg ist die Verwendung des Abschnitts "+ vars " eines Playbooks. Das folgende Beispiel definiert eine Variable " package +", die später in einer Aufgabe verwendet wird:

---
- hosts: all
 become: true
 vars:
    package: vim
 tasks:
    - name: Install Package
      apt: name={{ package }} state=latest

Die Variable + package + hat einen globalen Gültigkeitsbereich, was bedeutet, dass von jedem Punkt der Bereitstellung aus auf sie zugegriffen werden kann, auch von eingeschlossenen Dateien und Vorlagen.

Verwenden von Loops

Schleifen werden normalerweise verwendet, um eine Aufgabe mit unterschiedlichen Eingabewerten zu wiederholen. Anstatt beispielsweise 10 Aufgaben für die Installation von 10 verschiedenen Paketen zu erstellen, können Sie eine einzelne Aufgabe erstellen und eine Schleife verwenden, um die Aufgabe mit allen verschiedenen Paketen zu wiederholen, die Sie installieren möchten.

Um eine Schleife innerhalb einer Aufgabe zu erstellen, fügen Sie die Option "+ with_items " mit einem Array von Werten ein. Auf den Inhalt kann über die Schleifenvariable " item +" zugegriffen werden, wie im folgenden Beispiel gezeigt:

- name: Install Packages
 apt: name={{ item }} state=latest
 with_items:
    - vim
    - git
    - curl

Sie können auch eine * Array-Variable * verwenden, um Ihre Elemente zu definieren:

---
- hosts: all
 become: true
 vars:
    packages: [ 'vim', 'git', 'curl' ]
 tasks:
    - name: Install Package
      apt: name={{ item }} state=latest
      with_items: "{{ packages }}"

Bedingungen verwenden

Mit Hilfe von Bedingungen kann dynamisch entschieden werden, ob eine Aufgabe ausgeführt werden soll oder nicht, beispielsweise basierend auf einer Variablen oder einer Ausgabe eines Befehls.

Das folgende Beispiel wird nur Debian-basierte Systeme herunterfahren:

- name: Shutdown Debian Based Systems
 command: /sbin/shutdown -t now
 when: ansible_os_family == "Debian"

Das bedingte "+ when " erhält als Argument einen auszuwertenden Ausdruck. Die Aufgabe wird nur ausgeführt, wenn der Ausdruck mit ` true +` ausgewertet wird. In unserem Beispiel haben wir eine * Tatsache * getestet, um zu überprüfen, ob das Betriebssystem aus der Debian-Familie stammt.

Ein häufiger Anwendungsfall für Bedingungen in der IT-Automatisierung ist, wenn die Ausführung einer Aufgabe von der Ausgabe eines Befehls abhängt. Bei Ansible implementieren wir dies, indem wir eine Variable registrieren, die die Ergebnisse einer Befehlsausführung enthält, und diese Variable dann in einer nachfolgenden Task testen. Wir können den Beendigungsstatus des Befehls testen (falls fehlgeschlagen oder erfolgreich). Wir können auch nach bestimmten Inhalten in der Ausgabe suchen, obwohl dies möglicherweise die Verwendung von Regex-Ausdrücken und Befehlen zum Parsen von Zeichenfolgen erfordert.

Das nächste Beispiel zeigt zwei bedingte Tasks, die auf der Ausgabe eines Befehls + php -v + basieren. Wir werden den Exit-Status des Befehls testen, da wir wissen, dass er nicht ausgeführt werden kann, falls PHP nicht auf diesem Server installiert ist. Der Teil "+ ignore_errors +" der Task ist wichtig, um sicherzustellen, dass die Bereitstellung auch dann fortgesetzt wird, wenn die Ausführung des Befehls fehlschlägt.

- name: Check if PHP is installed
 register: php_installed
 command: php -v
 ignore_errors: true

- name: This task is only executed if PHP is installed
 debug: var=php_install
 when: php_installed|success

- name: This task is only executed if PHP is NOT installed
 debug: msg='PHP is NOT installed'
 when: php_installed|failed

Das hier verwendete + debug + Modul ist ein nützliches Modul zum Anzeigen von Inhalten von Variablen oder Debug-Meldungen. Es kann entweder einen String drucken (wenn das Argument "+ msg " verwendet wird) oder den Inhalt einer Variablen drucken (wenn das Argument " var +" verwendet wird).

Mit Vorlagen arbeiten

Vorlagen werden normalerweise zum Einrichten von Konfigurationsdateien verwendet, wobei Variablen und andere Funktionen verwendet werden können, um diese Dateien vielseitiger und wiederverwendbarer zu machen. Ansible verwendet die Vorlagen-Engine Jinja2.

Das folgende Beispiel ist eine Vorlage zum Einrichten eines virtuellen Apache-Hosts unter Verwendung einer Variablen zum Einrichten des Dokumentstamms für diesen Host:

<VirtualHost *:80>
   ServerAdmin webmaster@localhost
   DocumentRoot {{ doc_root }}

   <Directory {{ doc_root }}>
       AllowOverride All
       Require all granted
   </Directory>
</VirtualHost>

Das eingebaute Modul "+ template " wird verwendet, um die Vorlage aus einer Aufgabe anzuwenden. Wenn Sie die Vorlagendatei über " vhost.tpl +" benannt und im selben Verzeichnis wie Ihr Playbook abgelegt hätten, würden Sie die Vorlage folgendermaßen anwenden, um den virtuellen Apache-Standardhost zu ersetzen:

- name: Change default Apache virtual host
 template:
   src: vhost.tpl
   dest: /etc/apache2/sites-available/000-default.conf

Definieren und Auslösen von Handlern

Handler werden verwendet, um eine Statusänderung in einem Dienst auszulösen, z. B. einen Neustart oder einen Stopp. Auch wenn sie normalen Aufgaben ziemlich ähnlich sehen, werden Handler nur ausgeführt, wenn sie zuvor von einer Direktive "+ notify " in einer Aufgabe ausgelöst wurden. Sie werden in der Regel als Array in einem Abschnitt " handlers +" des Playbooks definiert, können jedoch auch in separaten Dateien gespeichert werden.

Betrachten wir unser vorheriges Beispiel für die Verwendung von Vorlagen, in dem wir einen virtuellen Apache-Host einrichten. Wenn Sie sicherstellen möchten, dass Apache nach einer Änderung des virtuellen Hosts neu gestartet wird, müssen Sie zunächst einen Handler für den Apache-Dienst erstellen. So werden Handler in einem Playbook definiert:

handlers:
   - name: restart apache
     service: name=apache2 state=restarted

   - name: other handler
     service: name=other state=restarted

Die Direktive "+ name " ist hier wichtig, da sie die eindeutige Kennung dieses Handlers ist. Um diesen Handler aus einer Aufgabe auszulösen, sollten Sie die Option ` notify +` verwenden:

- name: Change default Apache virtual host
 template:
   src: vhost.tpl
   dest: /etc/apache2/sites-available/000-default.conf
 notify: restart apache

Wir haben einige der wichtigsten Funktionen kennengelernt, mit denen Sie mit dem Schreiben von Ansible-Playbooks beginnen können. Im nächsten Abschnitt werden wir uns mit einem realistischeren Beispiel eines Playbooks befassen, das die Installation und Konfiguration von Apache unter Ubuntu automatisiert.

Beispiel Playbook

Schauen wir uns nun ein Playbook an, das die Installation eines Apache-Webservers in einem Ubuntu 18.04-System automatisiert, wie in der Einführung dieses Handbuchs beschrieben.

Das vollständige Beispiel, einschließlich der Vorlagendatei zum Einrichten von Apache und einer vom Webserver bereitgestellten HTML-Datei, finden Sie unter on Github. Der Ordner enthält auch eine Vagrant-Datei, mit der Sie das Playbook in einem vereinfachten Setup mit einer virtuellen Maschine testen können, die von https://vagrantup.com [Vagrant] verwaltet wird.

Playbook-Inhalt

Der vollständige Inhalt des Spielbuchs steht hier zur Verfügung:

playbook.yml

---
- hosts: all
 become: true
 vars:
   doc_root: /var/www/example
 tasks:
   - name: Update apt
     apt: update_cache=yes

   - name: Install Apache
     apt: name=apache2 state=latest

   - name: Create custom document root
     file: path={{ doc_root }} state=directory owner=www-data group=www-data

   - name: Set up HTML file
     copy: src=index.html dest={{ doc_root }}/index.html owner=www-data group=www-data mode=0644

   - name: Set up Apache virtual host file
     template: src=vhost.tpl dest=/etc/apache2/sites-available/000-default.conf
     notify: restart apache
 handlers:
   - name: restart apache
     service: name=apache2 state=restarted

Sehen wir uns jeden Teil dieses Spielbuchs genauer an:

  • hosts: all * + Das Playbook beginnt mit der Angabe, dass es auf "+ all " Hosts in Ihrem Inventar angewendet werden soll (" hosts: all +"). Es ist möglich, die Ausführung des Playbooks auf einen bestimmten Host oder eine Gruppe von Hosts zu beschränken. Diese Option kann zur Ausführungszeit überschrieben werden.

  • become: true * + Der Teil + become: true + weist Ansible an, die Rechteerweiterung (sudo) zum Ausführen aller Aufgaben in diesem Playbook zu verwenden. Diese Option kann aufgabenweise überschrieben werden.

  • vars * + Definiert eine Variable, + doc_root +, die später in einer Aufgabe verwendet wird. Dieser Abschnitt kann mehrere Variablen enthalten.

  • aufgaben * + Der Abschnitt, in dem die eigentlichen Aufgaben definiert sind. Die erste Task aktualisiert den "+ apt " - Cache und die zweite Task installiert das Paket " apache2 +".

Die dritte Aufgabe verwendet das eingebaute Modul * file *, um ein Verzeichnis zu erstellen, das als unser Dokumentenstamm dient. Mit diesem Modul können Dateien und Verzeichnisse verwaltet werden.

Die vierte Aufgabe verwendet das Modul * copy *, um eine lokale Datei auf den Remote-Server zu kopieren. Wir kopieren eine einfache HTML-Datei, die als von Apache gehostete Website bereitgestellt werden soll.

  • handlers * + Schließlich haben wir den Abschnitt "+ handlers ", in dem die Services deklariert werden. Wir definieren den ' restart apache'-Handler, der von der vierten Task benachrichtigt wird, bei der die Apache-Vorlage angewendet wird.

Ein Playbook ausführen

Sobald Sie den Inhalt dieses Playbooks auf Ihren Ansible-Kontrollknoten heruntergeladen haben, können Sie es mit "+ ansible-playbook +" auf einem oder mehreren Knoten aus Ihrem Inventar ausführen. Der folgende Befehl führt das Playbook auf * allen * Hosts aus Ihrer Standardinventardatei aus und verwendet die SSH-Schlüsselpaarauthentifizierung, um als aktueller Systembenutzer eine Verbindung herzustellen:

ansible-playbook playbook.yml

Sie können auch "+ -l +" verwenden, um die Ausführung auf einen einzelnen Host oder eine Gruppe von Hosts aus Ihrem Inventar zu beschränken:

ansible-playbook -l  playbook.yml

Wenn Sie einen anderen SSH-Benutzer angeben müssen, um eine Verbindung zum Remote-Server herzustellen, können Sie dem Befehl das Argument "+ -u +" hinzufügen:

ansible-playbook -l  playbook.yml -u

Weitere Informationen zum Ausführen von Ansible-Befehlen und -Wiedergabebüchern finden Sie in unserem Handbuch unter https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-ansible-on-ubuntu-18-. 04 [Installieren und Konfigurieren von Ansible unter Ubuntu 18.04].

Fazit

Ansible ist ein minimalistisches IT-Automatisierungstool mit einem geringen Lernaufwand, das für seine Bereitstellungsskripten "+ YAML +" verwendet. Es verfügt über eine große Anzahl integrierter Module, mit denen Sie Aufgaben wie das Installieren von Paketen und das Arbeiten mit Vorlagen abstrahieren können. Die vereinfachten Infrastrukturanforderungen und die einfache Sprache eignen sich gut für diejenigen, die mit dem Konfigurationsmanagement beginnen. Es fehlen jedoch möglicherweise einige erweiterte Funktionen, die Sie mit komplexeren Tools wie Puppet und Chef finden können.

Im Abschnitt next part of this series finden Sie einen praktischen Überblick über Puppet, eine beliebte und gut eingeführte Konfiguration Verwaltungstool, das ein aussagekräftiges und leistungsfähiges benutzerdefiniertes DSL auf Ruby-Basis zum Schreiben von Bereitstellungsskripten verwendet.