So erstellen Sie Ansible-Spiele und Playbooks – Teil 5
Ansible Schiffe mit eigenständigen Skripten werden aufgerufen Module die in verwendet werden Spielbücher zur Ausführung spezialisierter Aufgaben auf Remote-Knoten.
Module Dies ist praktisch, um Aufgaben wie Paketverwaltung, Archivierung und Kopieren von Dateien zu automatisieren, um nur einige zu nennen. Mit ihnen können Sie Konfigurationsdateien optimieren und Geräte wie Router, Switches, Load Balancer, Firewalls und eine Vielzahl anderer Geräte verwalten.
Ziel dieses Unterthemas ist es, Ihnen einen Überblick über verschiedene Aufgaben zu geben, die von ausgeführt werden können Ansible Module::
Paketverwaltung unter Linux
Die Paketverwaltung ist eine der wichtigsten und häufigsten Aufgaben von Systemadministratoren. Ansible wird mit Modulen geliefert, mit denen Sie Paketverwaltungsaufgaben ausführen können Roter Hut und Debian basierte Systeme.
Sie sind relativ leicht zu erraten. Dort ist der passendes Modul für die APT-Paketverwaltung für Debian basiert das alte yum Modul für YUM Paketverwaltung und DNS-Modul im Zusammenhang mit neueren RHEL-Distributionen.
Nachfolgend einige Beispiele, wie die Module in einem verwendet werden können Spielbuch::
Beispiel 1: Installieren des Apache Webservers auf RHEL 8
--- - name: install Apache webserver hosts: webservers tasks: - name: install httpd dnf: name: httpd State: latest
Beispiel 2: Installieren des Apache Webservers unter Debian 10
--- - name: install Apache webserver hosts: databases tasks: - name: install Apache webserver apt: name: apache2 State: latest
Servicemodul
Mit dem Servicemodul können Systemadministratoren Dienste auf dem System starten, stoppen, aktualisieren, aktualisieren und neu laden.
Beispiel 1: Starten von Apache Webserver
--- - name: Start service httpd, if not started service: name: httpd state: started
Beispiel 2: Stoppen des Apache-Webservers
--- - name: Stop service httpd service: name: httpd state: stopped
Beispiel 3: Neustart einer Netzwerkschnittstelle enp2s0
--- - name: Restart network service for interface eth0 service: name: network state: restarted args: enp2s0
Modul kopieren
Wie der Name schon sagt, kopiert das Kopiermodul Dateien von einem Speicherort auf dem Remotecomputer an einen anderen Speicherort auf demselben Computer.
Beispiel 1: Kopieren von Dateien von lokal nach Remote Linux
--- - name: Copy file with owner and permissions copy: src: /etc/files/tecmint.conf dest: /srv/tecmint.conf owner: tecmint group: tecmint mode: '0644'
Das Playbook kopiert die Konfigurationsdatei tecmint.conf von / etc / files / Verzeichnis zu / srv / Verzeichnis als tecmint Benutzer mit 0644 Berechtigungen.
Berechtigungen können auch durch symbolische Darstellung dargestellt werden, wie in der letzten Zeile gezeigt.
Beispiel 2: Kopieren von Dateien von lokal nach Remote Linux
--- - name: Copy file with owner and permissions copy: src: /etc/files/tecmint.conf dest: /srv/tecmint.conf owner: tecmint group: tecmint mode: u=rw, g=r, o=r
Die Berechtigungen im vorherigen Beispiel können wie in der letzten Zeile gezeigt dargestellt werden. Der Benutzer wird zugewiesen lesen und schreiben Berechtigungen, der Gruppe werden Schreibberechtigungen zugewiesen, und dem Rest der Welt werden Leseberechtigungen zugewiesen.
Dateimodul
Das Dateimodul wird verwendet, um viele Dateivorgänge auszuführen, einschließlich Erstellen von Dateien und Verzeichnissen, Zuweisen von Dateiberechtigungen und Festlegen von Symlinks.
Beispiel 1: Führen Sie Linux-Dateiberechtigungen aus
--- - name: Change file ownership, group, and permissions file: path: /etc/tecmint.conf owner: tecmint group: tecmint mode: '0644'
Das obige Spiel erstellt eine Datei namens tecmint.conf in dem /etc Verzeichniseinstellungsberechtigungen für 0644.
Beispiel 2: Linux-Datei löschen
--- - name: Remove file (delete file) file: path: /etc/tecmint.conf state: absent
Dadurch wird die Datei entfernt oder gelöscht tecmint.conf.
Beispiel 3: Erstellen Sie ein Verzeichnis
--- - name: create a directory if it doesn’t exist file: path: /etc/mydirectory State: directory mode: '0777'
Dadurch wird ein Verzeichnis in der erstellt /etc Verzeichniseinstellungsberechtigungen für 0777.
Beispiel 4: Ein Verzeichnis rekursiv löschen
--- - name: Recursively deleting a directory file: path: /etc/tecmint.conf state: absent
Das obige Spiel löscht rekursiv ein Verzeichnis.
Lineinfile-Modul
Das lineinfile Das Modul ist hilfreich, wenn Sie eine einzelne Zeile in einer Datei ändern möchten. Es kann eine vorhandene Leitung ersetzen.
Beispiel 1: Bearbeiten von Dateien unter Linux
--- - name: Ensure SELinux is set to enforcing mode lineinfile: path: /etc/selinux/config regexp: '^SELINUX=' line: SELINUX=disabled
Das obige Spiel setzt SELINUX Wert zu behindert.
SELINUX=disabled
Beispiel 2: Dateien unter Linux ändern
--- - name: Add a line to a file if the file does not exist, without passing regexp lineinfile: path: /etc/hosts line: 10.200.50.51 tecmint.com create: yes
Dies fügt den Eintrag hinzu 10.200.50.51 tecmint.com zum / etc / hosts Datei.
Archivmodul
Ein Archiv Das Modul wird zum Erstellen eines komprimierten Archivs einer einzelnen oder mehrerer Dateien verwendet. Es wird davon ausgegangen, dass die vorhandene Komprimierungsquelle auf dem Ziel vorhanden ist. Nach der Archivierung kann die Quelldatei später mithilfe der Anweisung gelöscht oder entfernt werden remove=True
.
Beispiel 1: Erstellen Sie eine Archivdatei
- name: Compress directory /path/to/tecmint_dir/ into /path/to/tecmint.tgz archive: path: /path/to/tecmint_dir dest: /path/to/tecmint.tgz This compresses the /path/to/tecmint_dir directory to /path/to/tecmint.tgz
Beispiel 2: Erstellen Sie eine Archivdatei und entfernen Sie sie
- name: Compress regular file /path/to/tecmint into /path/to/foo.gz and remove it archive: path: /path/to/tecmint dest: /path/to/tecmint.tgz remove: yes
Im obigen Spiel die Quelldatei / path / to / tecmint wird nach Abschluss der Archivierung gelöscht.
Beispiel 3: Erstellen Sie eine Archivdatei
- name: Create a bz2 archive of /path/to/tecmint archive: path: /path/to/tecmint format: bz2
Dadurch wird eine komprimierte Datei in erstellt bz2 Format aus dem / path / to / tecmint Datei.
Git-Modul
Das Modul verwaltet Git-Checkouts von Software-Repositorys.
Beispiel 1: Überprüfen Sie Git Repositoires
- git: repo: 'https://foosball.example.org/path/to/repo.git' dest: /srv/checkout version: release-0.22
Befehlsmodul
Eines der am häufigsten verwendeten Module, das Befehl Modul nimmt den Befehlsnamen und später eine Liste von Argumenten. Der Befehl wird genauso übergeben, wie Sie eine Linux-Shell eingeben würden.
Beispiel 1: Führen Sie einen Befehl aus
- name: Executing a command using the command module command: cat helloworld.txt
Beispiel 2: Überprüfen Sie die Betriebszeit von Remote Linux
--- - name: Check the remote host uptime hosts: servers tasks: - name: Execute the Uptime command over Command module register: uptimeoutput command: "uptime" - debug: var: uptimeoutput.stdout_lines
Das Befehlsmodul ruft die Verfügbarkeit von Remote-Servern ab.
Variablen zum Abrufen der Ergebnisse laufender Befehle
Normalerweise, Ansible Playbooks werden verwendet, um Aufgaben auf verwalteten Hosts auszuführen, ohne die Ausgabe in der Befehlszeile anzuzeigen. Es kann jedoch vorkommen, dass Sie die Ausgabe oder Ergebnisse erfassen müssen. In diesem Abschnitt zeigen wir Ihnen, wie Sie die Ausgabe eines Playbooks in einer Variablen erfassen und später anzeigen können.
Ein ansible-Register wird verwendet, um die Ausgabe einer Aufgabe zu erfassen und als Variable zu speichern. Die Variable enthält danach die Standardausgabe der Aufgabe.
Angenommen, Sie möchten die Festplattennutzung verwalteter Knoten in den jeweiligen Stammverzeichnissen mithilfe von überprüfen df -Th /
Befehl. Sie werden die verwenden ‘command’
Modul zur Definition des Befehls und ‘register’
um die Standardausgabe in einer Variablen zu speichern.
Um den Befehl anzuzeigen, verwenden Sie die ‘debug’
Modul neben dem Rückgabewert stdout.
--- - hosts: all become: yes tasks: - name: Execute /boot usage on Hosts command: 'df -Th /' register: df - debug: var=df.stdout
Lassen Sie uns nun das Playbook ausführen. In diesem Fall haben wir unser Spielbuch benannt check_disk_space.yml.
# ansible-playbook check_disk_space.yml
Wie Sie gesehen haben, ist die Ausgabe durcheinander und macht es schwierig, mitzumachen.
Ersetzen Sie die, um die Ausgabe auszurichten und das Lesen zu erleichtern stdout Rückgabewert mit stdout_lines.
--- - hosts: all become: yes tasks: - name: Execute /boot usage on Hosts command: 'df -Th /' register: df - debug: var=df.stdout_lines
Verwenden Sie Bedingungen, um die Spielausführung zu steuern
Genau wie in Programmiersprachen, bedingte Anweisungen werden verwendet, wenn mehr als ein Ergebnis möglich ist. Schauen wir uns einige der häufig verwendeten bedingten Anweisungen in Ansible-Playbooks an.
Wann-Anweisung
Manchmal möchten Sie möglicherweise Aufgaben auf bestimmten Knoten ausführen und nicht auf anderen. Das 'when'
Die bedingte Anweisung ist recht einfach zu verwenden und in ein Playbook zu implementieren. Bei Verwendung der 'when'
Klausel deklarieren Sie einfach die Bedingung neben der Klausel wie folgt:
when: condition
Wenn die Bedingung erfüllt ist, wird die Aufgabe auf dem Remote-System ausgeführt.
Schauen wir uns einige Beispiele an:
Beispiel 1: Verwenden von When Operator
--- - hosts: all tasks: - name: Install Nginx on Debian apt: name=nginx state=present when: ansible_os_family == “Debian”
Das obige Spiel wird installiert Nginx Webserver auf Hosts, auf denen die Debian-Familie von Distributionen ausgeführt wird.
Sie können auch die verwenden OR
und AND
Operator neben dem Zeitpunkt der bedingten Anweisung.
Beispiel 2: Verwenden des Operators AND mit When
--- - hosts: all tasks: - name: Install Nginx on Debian apt: name=nginx state=present when: ansible_os_family == “Debian” and ansible_distribution_version == “18.04”
Bei Verwendung der AND
Operator müssen beide Anweisungen erfüllt sein, damit die Aufgabe ausgeführt werden kann.
Das obige Spiel installiert Nginx auf Knoten, auf denen eine Debian-Betriebssystemfamilie der Version 18.04 ausgeführt wird. Dies wird natürlich Ubuntu 18.04 sein.
Beispiel 3: Verwenden des ODER-Operators mit Wann
Mit OR
Operator wird die Aufgabe ausgeführt, wenn eine der Bedingungen erfüllt ist.
--- - hosts: all tasks: - name: Install Nginx on Debian apt: name=nginx state=present when: ansible_os_family == “Debian” or Ansible_os_family == “SUSE”
Das obige Spiel installiert Nginx-Webserver entweder auf der Debian- oder der SUSE-Betriebssystemfamilie oder auf beiden.
HINWEIS: Stellen Sie immer sicher, dass Sie das doppelte Gleichheitszeichen verwenden ==
beim Testen einer Bedingung.
Bedingungen in Schleifen
Bedingungen können auch in einer Schleife verwendet werden. Angenommen, Sie haben eine Liste mit mehreren Paketen, die auf Remote-Knoten installiert werden müssen.
Im Playbook unten haben wir ein Array namens Pakete enthält eine Liste der Pakete, die installiert werden müssen. Diese Aufgaben werden nacheinander ausgeführt, wenn die erforderlich Klausel ist auf gesetzt Wahr.
--- - name: Install Software packages hosts: all vars: packages: • name: nginx required: True • name: mysql required: True • name: apache required: False tasks: • name: Install “{{ item.name }}”on Debian apt: name: “{{ item.name }}” state: present When: item.required == True loop: “{{ packages }}”
Konfigurieren Sie die Fehlerbehandlung
Manchmal schlagen Aufgaben beim Ausführen von Playbooks fehl. Nehmen wir an, Sie führen 5 Aufgaben auf 3 Servern aus, wie im folgenden Playbook gezeigt. Wenn bei Task 3 (Starten von MySQL) auf Server 2 ein Fehler auftritt, beendet Ansible die Ausführung der verbleibenden Tasks auf Server 2 und versucht, die verbleibenden Tasks auf den restlichen Servern auszuführen.
--- - name: Install Software packages hosts: server1, server2, server3 tasks: - name: Install dependencies << some code >> - name: Install MySQL database << some code >> - name: Start MySQL << some code >> - name: Install Nginx << some code >> - name: Start Nginx << some code >>
Wenn Sie beispielsweise eine konsistente Ausführung des Playbooks wünschen, beenden Sie die Ausführung eines Playbooks. Wenn einer der Server ausfällt, fügen Sie die Option hinzu.
--- - name: Install Software packages hosts: server1, server2, server3 any_errors_fatal: true tasks:
Auf diese Weise stoppt Ansible die Ausführung des gesamten Playbooks auf allen Servern und beendet das Programm, wenn eine Aufgabe auf einem Server fehlschlägt.
Wenn Sie möchten, dass das Playbook die Fehler ignoriert und die verbleibenden Aufgaben ausführt, verwenden Sie die ignore_errors: True Option.
--- - name: Install Software packages hosts: server1, server2, server3 tasks: - name: Install dependencies << some code >> ignore_errors: True
Erstellen Sie Playbooks, um Systeme für einen bestimmten Status zu konfigurieren
In diesem Abschnitt werden einige zusätzliche Optionen vorgestellt, die beim Ausführen eines Playbooks verfügbar sind.
Beginnen wir mit dem Prüfen Modus oder Probelauf Möglichkeit. Die Option Trockenlauf oder Überprüfungsmodus wird beim Ausführen eines Playbooks verwendet, um zu überprüfen, ob Fehler auftreten und ob auf den verwalteten Hosts Änderungen vorgenommen werden. Es werden jedoch keine Änderungen an den Remote-Knoten vorgenommen.
Zum Beispiel, um ein Playbook namens trocken laufen zu lassen httpd.yml
das installiert und startet den Apache-Webserver-Lauf:
# ansible-playbook httpd.yml --check
Die andere Option, die wir uns ansehen müssen, ist die --start-at-task
Möglichkeit. Dies wird verwendet, wenn der Name der Aufgabe angegeben wird, mit der das Playbook beginnen oder beginnen soll.
Nehmen wir ein Beispiel: Das folgende Playbook beschreibt zwei Aufgaben: Das erste Spiel installiert den Apache-Webserver und das zweite das Dienstprogramm htop.
--- - name: Install httpd hosts: all tasks: yum: name: httpd state: Installed - name: Install htop yum: name: htop state: started
Wenn Sie die Installation des Apache-Webservers überspringen und stattdessen das Dienstprogramm htop installieren möchten, führen Sie Folgendes aus:
# ansible-playbook playbook.yml --start-at-task “Install htop”
Zuletzt können Sie Ihre Aufgaben oder Spiele markieren, indem Sie die hinzufügen Stichworte Option zu Ihrem Playbook wie gezeigt. Dies ist praktisch, wenn Sie ein ziemlich großes Spielbuch haben und bestimmte Aufgaben aus dem gesamten Spielbuch ausführen möchten.
--- - name: Install httpd tags: Install and start hosts: all tasks: yum: name: httpd state: Installed tags: Install • service: name: httpd state: started
# ansible-playbook playbook.yml -tags "Install"
Um die Tags wegzulassen, verwenden Sie die --skip-tags
Optionen wie gezeigt.
# ansible-playbook playbook.yml --skip-tags "Install"
Fazit
In diesem Thema haben wir Sie durch die häufig verwendeten Module in geführt Ansible, wie man stdout aus der Ausführung eines Playbooks zur Analyse abruft, Bedingungen im Playbook verwendet und wie man Fehler verwaltet, die beim Ausführen von Aufgaben auftreten können. Zuletzt haben wir die Konfiguration von Playbooks zusammengefasst und erläutert, wie Sie mithilfe zusätzlicher Optionen entscheiden können, welche Aufgaben ausgeführt werden sollen, wenn Sie nicht beabsichtigen, das gesamte Playbook auszuführen.