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 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" }
Erläuterung:
- Status des Befehls, in diesem Fall ERFOLGREICH
- Host, auf dem der Befehl ausgeführt wurde
- Der über den Parameter -m ausgegebene Befehl, in diesem Fall ping
- 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" }
Erläuterung:
- Der Limit-Parameter kann verwendet werden, um Befehle nur auf bestimmten Hosts in der Hostdatei auszugeben
- 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 }
Erläuterung:
- Kopiermodul definiert
- Modulargumente sind in diesem Fall der absolute Quellpfad und der absolute Zielpfad.
- 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" ] }
Erläuterung:
- In diesem Beispiel wird das Yum-Modul verwendet
- 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
- 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.
- 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" ] }
Erläuterung:
- 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-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
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:
- Gruppe von Hosts, auf denen das Playbook ausgeführt wird
- Das Yum-Modul wird in dieser Aufgabe für die lldpad-Installation verwendet
- 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
Erläuterung:
- Gruppenname
- 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'
Erläuterung:
- 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.
- Die Aufgabenausgabe wird für die zukünftige Verwendung unter dem Namen „enable_selinux“ registriert
- 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.
- 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.
Erläuterung:
- Beispiel für einen Melder
- 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
Erläuterung:
- Name der zu verwendenden Vorlage. Die Vorlage befindet sich im Vorlagenverzeichnis im Rollenpfad
- Zielpfad des Dateinamens, der clientseitig durch die Vorlage ersetzt werden soll.
- 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:
Httpd-Rolle, main.yml-Aufgabe:
Selinux-Rolle, main.yml-Aufgabe:
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.
Erläuterung:
- Ansible-playbook-Befehl, der p4.yml ausführt
- Playbook überspringt die SELinux-Rolle, da sie bereits aktiviert ist.
- Ansible hat festgestellt, dass das httpd-Paket bereits installiert ist, daher wird „OK“ zurückgegeben.
- 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.