Website-Suche

So erstellen Sie Ansible Plays und Playbooks – Teil 5


In diesem Teil 5 der Ansible-Reihe erklären wir, wie Sie Ansible Plays und Playbooks mithilfe von Ansible-Modulen erstellen.

Ansible wird mit eigenständigen Skripten, sogenannten Modulen, geliefert, die in Playbooks für die Ausführung spezieller Aufgaben auf Remote-Knoten verwendet werden.

Module sind praktisch, um Aufgaben wie Paketverwaltung, Archivierung und Kopieren von Dateien zu automatisieren, um nur einige zu nennen. Sie ermöglichen Ihnen, Änderungen an Konfigurationsdateien vorzunehmen und Geräte wie Router, Switches, Load Balancer, Firewalls und eine Vielzahl anderer Geräte zu verwalten.

Ziel dieses Unterthemas ist es, Ihnen einen Überblick über verschiedene Aufgaben zu geben, die von Ansible-Modulen erledigt werden können:

Paketverwaltung unter Linux

Die Paketverwaltung ist eine der wichtigsten und häufigsten Aufgaben von Systemadministratoren. Ansible wird mit Modulen geliefert, die Sie bei der Ausführung von Paketverwaltungsaufgaben sowohl in RedHat- als auch Debian-basierten Systemen unterstützen.

Sie sind relativ leicht zu erraten. Es gibt das apt-Modul für die APT-Paketverwaltung auf Debian-Basis, das alte yum-Modul für die YUM-Paketverwaltung und das dnf-Modul für neuere RHEL-Distributionen .

Nachfolgend finden Sie einige Beispiele, wie die Module in einem Playbook verwendet werden können:

Beispiel 1: Installation des Apache Webservers auf RHEL 8

---
- name: install Apache webserver
  hosts: webservers

  tasks:
       - name: install httpd
         dnf:  
          name: httpd  
          State: latest

Beispiel 2: Installation 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: Apache Webserver starten

---
- 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 Remote-Computer an einen anderen Speicherort auf demselben Computer.

Beispiel 1: Kopieren von Dateien vom lokalen zum 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 aus dem Verzeichnis /etc/files/ in das Verzeichnis /srv/ als tecmint > Benutzer mit 0644-Berechtigungen.

Berechtigungen können auch symbolisch dargestellt werden, wie in der letzten Zeile gezeigt.

Beispiel 2: Kopieren von Dateien vom lokalen zum 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 dargestellt dargestellt werden: Dem Benutzer werden Lese- und Schreibberechtigungen zugewiesen, der Gruppe werden Schreibberechtigungen zugewiesen und so weiter Der Welt werden Leserechte zugewiesen.

Dateimodul

Das Dateimodul wird für viele Dateivorgänge verwendet, darunter das Erstellen von Dateien und Verzeichnissen, das Zuweisen von Dateiberechtigungen und das Festlegen von Symlinks.

Beispiel 1: Linux-Dateiberechtigungen ausführen

---
- 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 im Verzeichnis /etc und setzt die Berechtigungen auf 0644.

Beispiel 2: Linux-Datei löschen

---
- name: Remove file (delete file)
  file:
    path: /etc/tecmint.conf
    state: absent

Dadurch wird die Datei tecmint.conf entfernt oder gelöscht.

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 im Verzeichnis /etc erstellt, in dem die Berechtigungen auf 0777 festgelegt werden.

Beispiel 4: Rekursives Löschen eines Verzeichnisses

---
- name: Recursively deleting a  directory
  file:
    path: /etc/tecmint.conf
    state: absent

Das obige Spiel löscht rekursiv ein Verzeichnis.

Lineinfile-Modul

Das Modul lineinfile ist hilfreich, wenn Sie eine einzelne Zeile in einer Datei ändern möchten. Es kann eine bestehende Leitung ersetzen.

Beispiel 1: Dateien unter Linux bearbeiten

---
 - name: Ensure SELinux is set to enforcing mode
  lineinfile:
    path: /etc/selinux/config
    regexp: '^SELINUX='
    line: SELINUX=disabled

Das obige Spiel setzt den SELINUX-Wert auf deaktiviert.

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 linux-console.net
    create: yes

Dadurch wird der Eintrag 10.200.50.51 linux-console.net zur Datei /etc/hosts hinzugefügt.

Archivmodul

Ein Archive-Modul wird für die Erstellung eines komprimierten Archivs einer einzelnen oder mehrerer Dateien verwendet. Dabei wird davon ausgegangen, dass die Komprimierungsquelle am Ziel vorhanden ist. Nach der Archivierung kann die Quelldatei später mit der Anweisung remove=True gelöscht oder entfernt werden.

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 wird die Quelldatei /path/to/tecmint gelöscht, nachdem die Archivierung abgeschlossen ist.

Beispiel 3: Erstellen Sie eine Archivdatei

- name: Create a bz2 archive of /path/to/tecmint
  archive:
    path: /path/to/tecmint
    format: bz2

Dadurch wird aus der Datei /path/to/tecmint eine komprimierte Datei im bz2-Format erstellt.

Git-Modul

Das Modul verwaltet Git-Checkouts von Software-Repositorys.

Beispiel 1: Überprüfen Sie Git-Repositorys

- git:
    repo: 'https://foosball.example.org/path/to/repo.git'
    dest: /srv/checkout
    version: release-0.22

Befehlsmodul

Als eines der am häufigsten verwendeten Module nimmt das Modul Befehl den Befehlsnamen und später eine Liste von Argumenten an. Der Befehl wird auf die gleiche Weise übergeben, wie Sie ihn in einer 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 Betriebszeit von Remote-Servern ab.

Variablen zum Abrufen der Ergebnisse ausgeführter Befehle

Normalerweise werden Ansible-Playbooks verwendet, um Aufgaben auf verwalteten Hosts auszuführen, ohne die Ausgabe in der Befehlszeile anzuzeigen. Es gibt jedoch Fälle, in denen Sie möglicherweise aufgefordert werden, die Ausgabe oder Ergebnisse zu erfassen. 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 zum Erfassen der Ausgabe einer Aufgabe und zum Speichern als Variable verwendet. Die Variable enthält danach die Standardausgabe der Aufgabe.

Nehmen wir beispielsweise an, dass Sie die Festplattennutzung verwalteter Knoten in den jeweiligen Stammverzeichnissen mithilfe des Befehls df -Th / überprüfen möchten. Sie werden das Modul ‘command’ verwenden, um den Befehl zu definieren, und ‘register’, um die Standardausgabe in einer Variablen zu speichern.

Um den Befehl anzuzeigen, verwenden Sie das Modul ‘debug’ neben dem stdout-Rückgabewert.

---

 - 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 Playbook check_disk_space.yml genannt.

ansible-playbook check_disk_space.yml

Wie Sie gesehen haben, ist die Ausgabe völlig durcheinander und macht es schwierig, mitzumachen.

Um die Ausgabe auszurichten und die Lesbarkeit zu verbessern, ersetzen Sie den Rückgabewert stdout durch 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 Wiedergabeausführung zu steuern

Genau wie in Programmiersprachen werden bedingte Anweisungen verwendet, wenn mehr als ein Ergebnis möglich ist. Werfen wir einen Blick auf einige der häufig verwendeten bedingten Anweisungen in Ansible-Playbooks.

When-Anweisung

Manchmal möchten Sie möglicherweise Aufgaben auf bestimmten Knoten ausführen und auf anderen nicht. Die bedingte Anweisung 'when' ist recht einfach zu verwenden und in einem Playbook zu implementieren. Wenn Sie die 'when'-Klausel verwenden, deklarieren Sie einfach die Bedingung neben der Klausel wie gezeigt:

when: condition

Wenn die Bedingung erfüllt ist, wird die Aufgabe auf dem Remote-System ausgeführt.

Schauen wir uns ein paar Beispiele an:

Beispiel 1: Verwendung des When-Operators

---
- hosts: all

  tasks:
  - name: Install Nginx on Debian
     apt: name=nginx state=present
     when: ansible_os_family == “Debian”

Das obige Spiel installiert den Nginx-Webserver auf Hosts, auf denen die Debian-Distributionsfamilie läuft.

Sie können neben der Bedingungsanweisung auch die Operatoren OR und AND verwenden.

Beispiel 2: Verwendung des AND-Operators 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 des Operators AND 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 mit der Version 18.04 ausgeführt wird. Offensichtlich wird dies Ubuntu 18.04 sein.

Beispiel 3: Verwendung des OR-Operators mit When

Mit dem Operator OR 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 SUSE-Betriebssystemfamilie oder auf beiden.

HINWEIS: Stellen Sie immer sicher, dass Sie beim Testen einer Bedingung das doppelte Gleichheitszeichen == verwenden.

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 folgenden Playbook haben wir ein Array namens packages, das eine Liste der Pakete enthält, die installiert werden müssen. Diese Aufgaben werden nacheinander ausgeführt, wenn die required-Klausel auf True gesetzt ist.

---
 - 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 Playbook unten gezeigt. Wenn bei Aufgabe 3 (Starten von MySQL) auf Server 2 ein Fehler auftritt, stoppt Ansible die Ausführung der verbleibenden Aufgaben auf Server 2 und versucht, die verbleibenden Aufgaben auf den übrigen Servern abzuschließen.

---
 - 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 Konsistenz bei der Ausführung des Playbooks wünschen und beispielsweise die Ausführung eines Playbooks stoppen möchten, falls einer der Server ausfällt, fügen Sie die Option hinzu.

---
 - name: Install Software packages
   hosts: server1, server2, server3
   any_errors_fatal:  true
   tasks:

Wenn eine Aufgabe auf einem Server fehlschlägt, stoppt Ansible auf diese Weise die Ausführung des gesamten Playbooks auf allen Servern und wird beendet.

Wenn Sie möchten, dass das Playbook die Fehler ignoriert und mit der Ausführung der verbleibenden Aufgaben fortfährt, verwenden Sie die Option ignore_errors: True.

---
 - name: Install Software packages
   hosts: server1, server2, server3
   tasks:
- name: Install dependencies
<< some code >>
     ignore_errors: True

Erstellen Sie Playbooks, um Systeme in einen bestimmten Zustand zu versetzen

In diesem Abschnitt betrachten wir einige zusätzliche Optionen, die beim Ausführen eines Playbooks verfügbar sind.

Beginnen wir mit dem Check-Modus oder der Probelauf-Option. Die Option „Probelauf“ oder „Prüfmodus“ 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 entfernten Knoten vorgenommen.

Um beispielsweise ein Playbook namens httpd.yml, das den Apache-Webserver installiert und startet, trocken auszuführen, führen Sie Folgendes aus:

ansible-playbook httpd.yml --check

Die andere Option, die wir uns ansehen müssen, ist die Option --start-at-task. Dies wird verwendet, wenn der Name der Aufgabe angegeben wird, mit der das Playbook beginnen oder starten soll.

Nehmen wir ein Beispiel: Das folgende Spielbuch beschreibt zwei Aufgaben: Das erste Spiel installiert den Apache-Webserver und das zweite installiert das HTOP-Dienstprogramm.

---
 - 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 mit Tags versehen, indem Sie die Option Tags wie gezeigt zu Ihrem Playbook hinzufügen. Dies ist praktisch, wenn Sie über ein recht großes Playbook verfügen und bestimmte Aufgaben aus dem gesamten Playbook 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 Optionen --skip-tags wie gezeigt.

ansible-playbook playbook.yml --skip-tags "Install"
Abschluss

In diesem Thema haben wir Sie durch die häufig verwendeten Module in Ansible geführt, wie Sie stdout aus der Ausführung eines Playbooks zur Analyse abrufen, wie Sie Bedingungen im Playbook verwenden und wie Sie Fehler verwalten, die bei der Ausführung auftreten können Aufgaben. Abschließend haben wir noch einmal die Konfiguration von Playbooks zusammengefasst und erklärt, wie Sie mithilfe zusätzlicher Optionen entscheiden können, welche Aufgaben ausgeführt werden sollen, wenn Sie nicht beabsichtigen, das gesamte Playbook auszuführen.