Ansible-Tutorial für Anfänger: Playbook, Befehle und Beispiele

Was ist Ansible?

Ansible ist ein Open-Source-Automatisierungs- und Orchestrierungstool für Softwarebereitstellung, Konfigurationsmanagement und Softwarebereitstellung. Ansible kann auch Unix-ähnliche Systeme problemlos ausführen und konfigurieren Windows Systeme zur Bereitstellung von Infrastruktur als Code. Es enthält eine eigene deklarative Programmiersprache für die Systemkonfiguration und -verwaltung.

Ansible ist beliebt für seine einfache Installation, seine Benutzerfreundlichkeit in Bezug auf die Konnektivität zu Clients, das Fehlen eines Agenten für Ansible-Clients und die Vielzahl an Fähigkeiten. Es funktioniert durch die Verbindung über SSH an die Clients, sodass kein spezieller Agent auf der Client-Seite erforderlich ist. Durch das Pushen von Modulen an die Clients werden die Module dann lokal auf der Client-Seite ausgeführt und die Ausgabe wird an den Ansible-Server zurückgesendet.

Da es SSH verwendet, kann es sehr einfach über SSH-Schlüssel eine Verbindung zu Clients herstellen, was den gesamten Prozess vereinfacht. Clientdetails wie Hostnamen oder IP-Adressen und SSH-Ports werden in Dateien gespeichert, die als Inventardateien bezeichnet werden. Sobald Sie eine Inventardatei erstellt und ausgefüllt haben, kann Ansible sie verwenden.

Warum Ansible verwenden?

Hier sind einige wichtige Vor- und Vorteile der Verwendung von Ansible

  • Einer der größten Vorteile von Ansible besteht darin, dass es für jedermann kostenlos nutzbar ist.
  • Für die Installation und Verwendung von Ansible sind keine besonderen Systemadministratorkenntnisse erforderlich, und die offizielle Dokumentation ist sehr umfassend.
  • Seine Modularität hinsichtlich Plugins, Modulen, Inventaren und Playbooks macht Ansible zum perfekten Begleiter für die Orchestrierung großer Umgebungen.
  • Ansible ist sehr leichtgewichtig und konsistent und es gibt keine Einschränkungen hinsichtlich des Betriebssystems oder der zugrunde liegenden Hardware.
  • Aufgrund seiner agentenlosen Funktionen und der Verwendung von OpenSSH-Sicherheitsfunktionen ist es außerdem sehr sicher.
  • Ein weiterer Vorteil, der die Einführung von Ansible begünstigt, ist die reibungslose Lernkurve, die durch die umfassende Dokumentation und die leicht zu erlernende Struktur und Konfiguration bestimmt wird.

Geschichte von Ansible

Hier sind wichtige Meilensteine ​​aus der Geschichte von Ansible:

  • Im Februar 2012 startete das Ansible-Projekt. Es wurde zuerst von Michael DeHaan, dem Schöpfer von Cobbler und Func, Fedora Unified Network Controller, entwickelt.
  • Das Unternehmen, das das Ansible-Tool finanzierte, hieß ursprünglich AnsibleWorks Inc. und wurde 2015 von RedHat übernommen. Später wurde es zusammen mit RedHat unter das Dach von IBM.
  • Derzeit ist Ansible in Distributionen wie Fedora Linux, RHEL, Centos und enthalten Oracle Linux.

Wichtige Begriffe, die in Ansible verwendet werden

  • Ansible-Server

    Der Computer, auf dem Ansible installiert ist und von dem aus alle Aufgaben und Playbooks ausgeführt werden

  • Modul

    Im Grunde ist ein Modul ein Befehl oder eine Reihe ähnlicher Ansible-Befehle, die auf der Clientseite ausgeführt werden sollen

  • Aufgabe

    Eine Aufgabe ist ein Abschnitt, der aus einem einzelnen Vorgang besteht, der abgeschlossen werden muss

  • Rollen

    Eine Möglichkeit zum Organisieren von Aufgaben und zugehörigen Dateien, die später in einem Playbook aufgerufen werden sollen

  • Tatsache

    Informationen, die vom Clientsystem aus den globalen Variablen mit der Funktion „Gather-Facts“ abgerufen werden

  • Maschinen

    Datei mit Daten über die Ansible-Client-Server. In späteren Beispielen als Hosts-Datei definiert

  • Play

    Ausführung eines Playbooks

  • Handler

    Aufgabe, die nur aufgerufen wird, wenn ein Notifier vorhanden ist

  • Notifier

    Abschnitt, der einer Aufgabe zugeordnet ist, die einen Handler aufruft, wenn die Ausgabe geändert wird

  • Etikett

    Einer Aufgabe wird ein Name zugewiesen, der später verwendet werden kann, um nur diese bestimmte Aufgabe oder Aufgabengruppe auszugeben.

Ansible-Installation unter Linux

Nachdem Sie Ihre Optionen verglichen und abgewogen haben und sich für Ansible entschieden haben, besteht der nächste Schritt darin, es auf Ihrem System zu installieren. Wir werden die Installationsschritte auf verschiedene Weise durchgehen Linux Distributionen, die beliebtesten, im nächsten kleinen Tutorial.

Installieren Sie Ansible auf Centos/RedHat-Systemen

Schritt 1) Installieren Sie das EPEL-Repo

[root@ansible-server ~]# sudo yum install epel-release

Schritt 2) Installieren Sie das Ansible-Paket

[root@ansible-server ~]# sudo  yum install -y ansible

Installieren Sie Ansible auf Centos/RedHat-Systemen

Installieren Sie ansible auf Ubuntu/Debian-Systeme

Schritt 1) Führen Sie ein Update der Pakete durch

$ sudo apt update

Schritt 2) Installieren Sie das Software-Properties-Common-Paket

$ sudo apt install software-properties-common

Schritt 3) Installieren Sie das persönliche Ansible-Paketarchiv

$ sudo apt-add-repository ppa:ansible/ansible

Schritt 4) Ansible installieren

$ sudo apt update
$ sudo apt install ansible

Ansible-Ad-hoc-Befehle

Eine der einfachsten Möglichkeiten, Ansible zu nutzen, ist die Verwendung von Ad-hoc-Befehlen. Diese können verwendet werden, wenn Sie einige Befehle auf einem Server oder einer Reihe von Servern erteilen möchten. Ad-hoc-Befehle werden nicht für zukünftige Verwendungen gespeichert, sondern stellen eine schnelle Möglichkeit zur Interaktion mit den gewünschten Servern dar.

Für dieses Ansible-Tutorial wird eine einfache Hostdatei für zwei Server konfiguriert, die host1 und host2 enthält.

Sie können sicherstellen, dass die Hosts vom Ansible-Server aus erreichbar sind, indem Sie auf allen Hosts einen Ping-Befehl ausgeben.

[root@ansible-server test_ansible]# ansible -i hosts all -m ping
host1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Ansible Ad-hoc-Befehle

Erläuterung:

  1. Status des Befehls, in diesem Fall ERFOLGREICH
  2. Host, auf dem der Befehl ausgeführt wurde
  3. Der über den Parameter -m ausgegebene Befehl, in diesem Fall ping
  4. Mit dem Parameter -i können Sie auf die Hosts-Datei verweisen.


Sie können denselben Befehl bei Bedarf nur auf einem bestimmten Host ausführen.

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Ansible Ad-hoc-Befehle

Erläuterung:

  1. Der Limit-Parameter kann verwendet werden, um Befehle nur auf bestimmten Hosts in der Hostdatei auszugeben
  2. Name des Hosts, wie in der Inventardatei definiert

Wenn Sie eine Datei schnell an mehrere Ziele kopieren müssen, können Sie das Kopiermodul in Ansible verwenden, das SCP verwendet. Der Befehl und seine Ausgabe sehen also wie folgt aus:

[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"
host1 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.43-256741011164877/source",
    "state": "file",
    "uid": 0
}
host2 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.6-280302911361278/source",
    "state": "file",
    "uid": 0
}

Ansible Ad-hoc-Befehle

Erläuterung:

  1. Kopiermodul definiert
  2. Modulargumente sind in diesem Fall der absolute Quellpfad und der absolute Zielpfad.
  3. Ansible-Befehlsausgabe, die den Erfolg des Kopierbefehls und andere Details wie die SHA1- oder MD5-Prüfsummen zur Dateiintegritätsprüfung und Metadaten wie Eigentümer, Größe oder Berechtigungen widerspiegelt. Es ist mühelos, ein Paket auf mehreren Servern zu installieren. Ansible verfügt über mehrere Module, die mit verwendeten Installationsprogrammen wie Yum, Apt, DNF usw. interagieren.

Im nächsten Beispiel erfahren Sie, wie Sie ein Paket über das yum-Modul auf zwei Centos-Hosts installieren.

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [


"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.xservers.ro\n * epel: fedora.mirrors.telekom.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: remi.schlundtech.de\n * remi-safe: remi.schlundtech.de\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version                Repository       Size\n================================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.leadhosts.com\n * epel: mirrors.nav.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: mirrors.uni-ruse.bg\n * remi-safe: mirrors.uni-ruse.bg\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version                Repository       Size\n================================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}

Ansible Ad-hoc-Befehle

Erläuterung:

  1. In diesem Beispiel wird das Yum-Modul verwendet
  2. Es definiert die Modulargumente und in diesem Fall wählen Sie den Namen des Pakets und seinen Status. Fehlt beispielsweise der Status, wird das Paket durchsucht und, falls gefunden, entfernt
  3. Bei gelber Farbe sehen Sie die Ausgabe des Ansible-Befehls mit geändertem Status, was in diesem Fall bedeutet, dass das Paket gefunden und installiert wurde.
  4. Status des über Ansible ausgegebenen Yum-Installationsbefehls. In diesem Fall wurde das Paket ncdu.x86_64 0:1.14-1.el7 installiert.

Natürlich können alle Optionen des Yum-Installationsprogramms über Ansible verwendet werden, einschließlich Aktualisieren, Installieren, Neueste Version oder Entfernen.

Im folgenden Beispiel wurde derselbe Befehl ausgegeben, um das zuvor installierte ncdu-Paket zu entfernen.

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version               Repository        Size\n================================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n================================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version               Repository        Size\n================================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n================================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}

Ansible Ad-hoc-Befehle

Erläuterung:

  1. Die Ausgabe des Befehls yum zeigt, dass das Paket entfernt wurde.

Eine weitere nützliche und wichtige Funktion, die Ansible zur Interaktion mit dem Server des Clients verwendet, ist das Sammeln einiger Fakten über das System. Dazu ruft es Hardware-, Software- und Versionsinformationen vom System ab und speichert jeden Wert in einer Variablen, die später verwendet werden kann.

Wenn Sie detaillierte Informationen zu den Systemen benötigen, die über Ansible geändert werden sollen, können Sie den nächsten Befehl verwenden. Das Setup-Modul sammelt Fakten aus den Systemvariablen.

Ansible Ad-hoc-Befehle

Ansible-Playbooks

Ansible-Playbooks sind die Möglichkeit, Befehle über Skripte an Remote-Systeme zu senden. Ansible-Playbooks werden verwendet, um komplexe Systemumgebungen zu konfigurieren und die Flexibilität durch die Ausführung eines Skripts auf einem oder mehreren Systemen zu erhöhen. Ansible-Playbooks sind eher eine Konfigurationssprache als eine Programmiersprache.

Ansible-Playbook-Befehle verwenden das YAML-Format, daher ist nicht viel Syntax erforderlich, aber die Einrückung muss beachtet werden. Wie der Name schon sagt, ist ein Spielbuch eine Sammlung von Theaterstücken. Über ein Playbook können Sie einigen Hosts bestimmte Rollen und anderen Hosts andere Rollen zuweisen. Auf diese Weise können Sie mehrere Server in sehr unterschiedlichen Szenarien orchestrieren, alles in einem Playbook.

Um alle Details genau zu kennen, bevor wir mit den Ansible-Playbook-Beispielen fortfahren, müssen wir zuerst eine Aufgabe definieren. Diese sind die Schnittstelle zu Ansible-Modulen für Rollen und Playbooks.

Lassen Sie uns nun das Ansible-Playbook anhand eines Beispiels mit einem Playbook und einem Play erlernen, das mehrere Aufgaben wie folgt enthält:

---

- hosts: group1
  tasks:
  - name: Install lldpad package
    yum:
      name: lldpad
      state: latest
  - name: check lldpad service status
    service:
      name: lldpad
      state: started

Ansible-Playbooks

Im obigen Ansible-Playbook-Beispiel ist die Gruppe1 von Hosts in der Hostdatei für die Installation des lldpad-Pakets mithilfe des Yum-Moduls vorgesehen. Anschließend wird der nach der Installation erstellte Dienst lldpad mithilfe des Dienstmoduls gestartet, das hauptsächlich für die Interaktion mit dem Systemd-Ensemble verwendet wird.

Erläuterung:

  1. Gruppe von Hosts, auf denen das Playbook ausgeführt wird
  2. Das Yum-Modul wird in dieser Aufgabe für die lldpad-Installation verwendet
  3. Mit dem Servicemodul wird überprüft, ob der Dienst nach der Installation betriebsbereit ist

Jedes Ansible-Playbook arbeitet mit einer Inventardatei. Die Inventardatei enthält eine Liste von Servern, die in Gruppen unterteilt sind, um eine bessere Kontrolle über Details wie IP Address und SSH-Port für jeden Host.

Die Inventardatei, die Sie für dieses Ansible-Playbook-Beispiel verwenden können, sieht wie folgt aus. Es gibt zwei Gruppen mit den Namen Gruppe1 und Gruppe2, die jeweils Host1 und Host2 enthalten.

[group1]
host1 ansible_host=192.168.100.2 ansible_ssh_port=22
[group2]
host2 ansible_host=192.168.100.3 ansible_ssh_port=22

Ansible-Playbooks

Erläuterung:

  1. Gruppenname
  2. Hostname mit IP-Adresse und SSH-Port, in diesem Fall der Standardport 22.

Ein weiteres nützliches Ansible-Playbook-Beispiel, das dieses Mal zwei Plays für zwei Hosts enthält, ist das nächste. Für die erste Gruppe von Hosts, Gruppe1, wird Selinux aktiviert. Wenn es aktiviert ist, erscheint eine Meldung auf dem Bildschirm des Hosts.

Für die zweite Gruppe von Hosts wird das httpd-Paket nur installiert, wenn ansible_os_family RedHat und ansible_system_vendor HP ist.

Ansible_os_family und ansible_system_vendor sind Variablen, die mit der Option „gather_facts“ erfasst werden und wie in diesem bedingten Beispiel verwendet werden können.

---

- hosts: group1
  tasks:
  - name: Enable SELinux
    selinux:
      state: enabled
    when: ansible_os_family == 'Debian'
    register: enable_selinux

  - debug:
      Imsg: "Selinux Enabled. Please restart the server to apply changes."
    when: enable_selinux.changed == true

- hosts: group2
  tasks:
  - name: Install apache
    yum:
      name: httpd
      state: present
    when: ansible_system_vendor == 'HP' and ansible_os_family == 'RedHat'

Ansible-Playbooks

Erläuterung:

  1. Beispiel für die when-Klausel. In diesem Fall ist der Betriebssystemtyp Debian. Die Variable „ansible_os_family“ wird über die Funktion „gather_facts“ erfasst.
  2. Die Aufgabenausgabe wird für die zukünftige Verwendung unter dem Namen „enable_selinux“ registriert
  3. Ein weiteres Beispiel für die „when“-Klausel. In diesem Fall wird dem Host-Benutzer eine Meldung angezeigt, ob SELinux zuvor tatsächlich aktiviert wurde.
  4. Ein weiteres Beispiel für die when-Klausel, die aus zwei Regeln besteht

Neben Aufgaben gibt es auch einige besondere Aufgaben, sogenannte Handler. Handler müssen im gesamten Playbook einen eindeutigen Namen haben. Diese funktionieren auf die gleiche Weise wie eine reguläre Aufgabe, jedoch kann ein Handler über einen Notifier benachrichtigt werden.

Wenn ein Handler während der Ausführung des Playbooks nicht benachrichtigt wird, wird es nicht ausgeführt. Wenn jedoch mehr als eine Aufgabe einen Handler benachrichtigt, wird dieser nur einmal ausgeführt, nachdem alle Aufgaben abgeschlossen sind.

Im unten gezeigten Beispiel können Sie sehen, dass eine bestimmte Aufgabe über einen Benachrichtigungsabschnitt verfügt, der eine andere Aufgabe aufruft. Wenn die Ausgabe der ersten Aufgabe geändert wird, wird eine Handler-Aufgabe aufgerufen. Das beste Beispiel ist die Änderung einer Konfigurationsdatei und der anschließende Neustart dieses bestimmten Dienstes.

---

- hosts: group2
  tasks:
  - name: sshd config file modify port
    lineinfile:
     path: /etc/ssh/sshd_config
     regexp: 'Port 28675'
     line: '#Port 22'
    notify:
       - restart sshd
handlers
    - name: restart sshd
      service: sshd
        name: sshd
        state: restarted

Wenn in diesem Fall die erste Aufgabe „SSHD-Konfigurationsdatei ändern Port“ geändert wird, bedeutet dies, dass, wenn der Port zunächst nicht 28675 ist, er geändert wird und die Aufgabe den Handler mit demselben Namen zur Ausführung benachrichtigt , und der SSHD-Dienst wird neu gestartet.

Ansible-Playbooks

Erläuterung:

  1. Beispiel für einen Melder
  2. Beispiel für einen Handler

Ansible-Rollen

Bei umfangreichen Playbooks ist es einfacher, die Aufgaben in Rollen aufzuteilen. Dies hilft auch bei der Wiederverwendung der Rollen in der Zukunft. Rollen sind eine Sammlung von Aufgaben, die von einem Playbook in ein anderes verschoben und unabhängig voneinander ausgeführt werden können, jedoch nur über eine Playbook-Datei.

Rollen werden in separaten Verzeichnissen gespeichert und haben eine bestimmte Verzeichnisstruktur.

[root@ansible-server test2]# tree
.
`-- role1
    |-- defaults
    |   `-- main.yml
    |-- handlers
    |   `-- main.yml
    |-- meta
    |   `-- main.yml
    |-- README.md
    |-- tasks
    |   `-- main.yml
    |-- tests
    |   |-- inventory
    |   `-- test.yml
    `-- vars
        `-- main.yml

7 directories, 8 files

Die YAML-Datei im Standardverzeichnis enthält eine Liste von Standardvariablen, die zusammen mit dem Playbook verwendet werden sollen. Das Handler-Verzeichnis wird zum Speichern von Handlern verwendet. Das Metaverzeichnis soll Informationen über den Autor und Rollenabhängigkeiten enthalten. Im Aufgabenverzeichnis befindet sich die Haupt-YAML-Datei für die Rolle.

Das Testverzeichnis enthält eine Beispiel-Yaml-Playbook-Datei und eine Beispiel-Inventardatei und wird hauptsächlich zu Testzwecken vor dem Erstellen der eigentlichen Rolle verwendet.

Das Verzeichnis vars enthält die Yaml-Datei, in der alle von der Rolle verwendeten Variablen definiert werden. Die Verzeichnisvorlagen und Verzeichnisdateien sollten Dateien und Vorlagen enthalten, die von den Aufgaben in der Rolle verwendet werden.

Um den Verzeichnisbaum für eine Rolle zu erstellen, sollten Sie den folgenden Befehl mit dem Rollennamen als letzten Parameter verwenden:

[root@ansible-server test2]# ansible-galaxy init role1

Ansible funktioniert auch gut mit Vorlagen. Als Vorlagesprache wird Jinja2 verwendet.

Im nächsten Beispiel erfahren Sie, wie ein grundlegendes Jinja2-Template aussieht und können es in einer Rolle verwenden.

Zur Laufzeit können Sie mithilfe der Variablen „resolver_ip_addresses“, je nachdem, in welchem ​​Rechenzentrum sich Ihr Server beispielsweise befindet, aus mehreren Nameservern auswählen, die jeweils einem Rechenzentrum entsprechen.

{% for resolver in resolver_ip_addresses %}
nameserver {{ resolver }}
{% endfor %}

options timeout:1
options attempts:5
options rotate

In diesem Beispiel sind im Playbook-Verzeichnis einige Variablen definiert, darunter eine Variable namens „resolver_ip_addresses“ mit unterschiedlichen Werten je nach Datencenter.

- name: Set resolver for server
  template:
    src: dns.j2
    dest: /etc/resolv.conf
    group: root
    owner: root
    mode: "0644"
    tag: resolver	

Ansible-Rollen

Erläuterung:

  1. Name der zu verwendenden Vorlage. Die Vorlage befindet sich im Vorlagenverzeichnis im Rollenpfad
  2. Zielpfad des Dateinamens, der clientseitig durch die Vorlage ersetzt werden soll.
  3. Berechtigungen der Zieldatei

Die Rollenaufgaben können auch über ein Tag-Feld verfügen, dem ein Name zugeordnet ist. Mehrere Aufgaben können dasselbe Tag verwenden. Wenn Sie ein Ansible-Playbook ausführen, können Sie auch das Tag angeben, damit diese Aufgaben ausgeführt werden.

Ansible-Fallstudie

In diesem Abschnitt analysieren wir eine Fallstudie eines wesentlichen Ansible-Playbooks, das drei Rollen hat. Der Zweck besteht darin, ein praktisches Beispiel für das zu geben, worüber wir zuvor gesprochen haben. Einige der zuvor in diesem Ansible-Playbook-Tutorial verwendeten Beispiele werden in diesem Playbook angepasst und verwendet.

Nachfolgend finden Sie die Verzeichnisstruktur des Playbooks. Die verwendete Yaml-Datei ist p4.yml.

[root@ansible-server test_ansible]# ls -lrth
total 16K
-rw-r--r--. 1 root root   0 Jul  3 10:13 testfile
-rw-r--r--. 1 root root 203 Jul  3 13:30 p1.yml
-rw-r--r--. 1 root root 125 Jul  3 15:00 hosts
-rw-r--r--. 1 root root 488 Jul  3 16:40 p2.yml
-rw-r--r--. 1 root root 188 Jul  4 17:33 p4.yml
drwxr-xr-x. 5 root root  47 Jul  4 17:35 roles
[root@ansible-server test_ansible]# cd roles
[root@ansible-server roles]# ls -lrth
total 12K
drwxr-xr-x. 9 root root 4.0K Jul  4 12:52 httpd
drwxr-xr-x. 9 root root 4.0K Jul  4 13:55 selinux
drwxr-xr-x. 9 root root 4.0K Jul  4 16:54 resolver

Das Playbook hat drei Rollen, eine sogenannte Resolver, die einen bestimmten Nameserver auf den Servern festlegt, indem sie eine Datei vom Server in das Ziel /etc/resolv.conf kopiert. Ein anderer heißt httpd und installiert das httpd-Paket mit dem Yum-Modul. Der dritte aktiviert SELinux und benachrichtigt den angemeldeten Benutzer, das System neu zu starten. Jede Rolle wurde mit dem Befehl „ansible-galaxy“ erstellt.

Resolver-Rolle, main.yml-Aufgabe:

Ansible-Fallstudie

Httpd-Rolle, main.yml-Aufgabe:

Ansible-Fallstudie

Selinux-Rolle, main.yml-Aufgabe:

Ansible-Fallstudie

Unten ist das p4.yml-Playbook definiert. Es wird auf allen Hosts ausgeführt, sofern in der Befehlszeile nichts anderes angegeben ist, es wird als Root-Benutzer auf Port 22 (SSH) ausgeführt, es sammelt Fakten, bevor es die Rollen ausführt, und es führt alle drei zuvor genannten Rollen aus. Jede Rolle kann unabhängig ausgeführt werden, indem das Tag in der Ansible-Playbook-Befehlszeile mit dem Parameter –t angegeben wird.

---

- hosts: all
  user: root
  port: 22
  gather_facts: True
  roles:
    - { role: selinux, tags: selinux }
    - { role: httpd, tags: httpd }
    - { role: resolver, tags: resolver }

Ausführen des p4.yml-Playbooks auf zwei Hosts und Interpretieren der Ausgabe. Derselbe Befehl kann mit dem Parameter –check für einen Probelauf ausgeführt werden. Wenn Sie die Passwortauthentifizierung verwenden möchten, verwenden Sie den Parameter -k.

Ansible-Fallstudie

Erläuterung:

  1. Ansible-playbook-Befehl, der p4.yml ausführt
  2. Playbook überspringt die SELinux-Rolle, da sie bereits aktiviert ist.
  3. Ansible hat festgestellt, dass das httpd-Paket bereits installiert ist, daher wird „OK“ zurückgegeben.
  4. Der Resolver wurde festgelegt und der Status des Rollenresolvers wurde geändert.

Spickzettel für Ansible-Befehle

Installieren Sie das EPEL-Repo auf Centos/RHEL-Systemen

[root@ansible-server ~]# sudo yum install epel-release

Installieren Sie das Ansible-Paket auf Centos/RHEL-Systemen

[root@ansible-server ~]# sudo  yum install -y ansible

Führen Sie ein Update der Pakete unter Debian/ durch.Ubuntu Systeme

$ sudo apt update

Installieren Sie das Software-Properties-Common-Paket unter Debian/Ubuntu Systeme

$ sudo apt install software-properties-common

Installieren Sie das persönliche Ansible-Paketarchiv auf Debian/Ubuntu Systeme

$ sudo apt-add-repository ppa:ansible/ansible

Ansible unter Debian/ installierenUbuntu Systeme

$ sudo apt update
$ sudo apt install ansible

Geben Sie einen Ping-Befehl auf allen Servern aus, die in der Inventardatei mit dem Namen „hosts“ definiert sind

 
[root@ansible-server test_ansible]# ansible -i hosts all -m ping

Geben Sie einen Ping-Befehl nur auf Host2 aus

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2

Kopieren Sie die Datei „testfile“ auf allen Hosts in die Inventardatei

[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"

Installieren Sie das ncdu-Paket auf allen Hosts

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'

Entfernen Sie das ncdu-Paket auf allen Hosts

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'

Erstellen Sie die Verzeichnisstruktur für die Rolle mit dem Namen „role1“.

[root@ansible-server test2]# ansible-galaxy init role1

Führen Sie das p4.yml-Playbook trocken aus

[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml --check

Führen Sie das p4.yml-Playbook mit Passwortauthentifizierung für alle Hosts aus

[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml -k

Zusammenfassung

In einer Welt, in der sich die Technologie ständig und rasant verändert und gleichzeitig unglaublich schnell wächst, müssen sich Systemadministratoren und DevOps-Ingenieure unterschiedliche Ansätze für die Automatisierung von Routineaufgaben und die Orchestrierung großer Serverpools überlegen.

Während es viele gibt Alternative zu Ansible (Chef, Puppet) gibt es, die das Gleiche mit einigen Unterschieden tun. Ansible hat es geschafft, sich durch seine Einfachheit, verbesserte Sicherheit und vor allem durch seine reibungslose Lernkurve von allen abzuheben. Aufgrund dieser Eigenschaften und der schnellen Einführung von Ansible haben wir ein Tutorial voller Beispiele erstellt, damit Sie noch reibungslosere erste Erfahrungen mit der Arbeit mit Ansible machen können.

In diesem Tutorial zu den Grundlagen von Ansible haben wir Ansible beschrieben und ein wenig über seine Geschichte gesprochen. Wir haben die Stärken von Ansible und die Vorteile erwähnt, die Ansible für die Automatisierung und Orchestrierung von Infrastrukturen unterschiedlicher Größe bieten kann. Wir haben die wesentlichen in Ansible verwendeten Begriffe definiert und die Struktur von Ansible-Playbooks beschrieben. Ausführliche Beispiele begleiteten alle Informationen mit detaillierten Erklärungen.