Wie man das Ansible lineinfile-Modul zum Verwalten von Textdateien verwendet

Ansible ist ein weit verbreitetes Automatisierungstool, das Hunderte von Knoten auf einmal verwalten kann. Ansible verfügt über viele großartige Funktionen, eine davon ist die Möglichkeit, eine einzelne Zeile innerhalb einer Datei auf entfernten Knoten mithilfe des Ansible lineinfile-Moduls zu verwalten.

Das Ansible lineinfile-Modul ist ein Modul, das verschiedene Aktionen auf einer einzelnen Zeile in einer Datei ausführt, wie das Ersetzen einer Zeile, das Aktualisieren einer Zeile oder das Hinzufügen einer bestimmten Zeile.

In diesem Tutorial lernen Sie, was das Ansible lineinfile-Modul ist, wie es funktioniert und wie Sie es verwenden können, um Textdateien zu verwalten.

Voraussetzungen

Dieser Beitrag wird ein schrittweises Tutorial zum Ansible lineinfile-Modul sein. Wenn Sie mitmachen möchten, stellen Sie sicher, dass Sie folgendes bereit haben:

  • Einen Ansible-Controller-Host – Dieses Tutorial verwendet Ansible v2.9.24 auf einem Ubuntu 18.04.5 LTS-Rechner.
  • A remote computer to run commands. You’ll need an inventory file set up and one or more hosts already configured to run Ansible command and playbooks on. The remote Linux computer will be called myserver, and the tutorial will use an inventory group called web.
  • Apache sollte bereits auf dem entfernten Computer installiert sein, wenn Sie genau dem Tutorial folgen möchten.

Modifizieren einer Textdatei mit dem Ansible lineinfile-Modul.

Beginnen wir dieses Tutorial, indem wir das Ansible lineinfile-Modul mit Ad-hoc-Befehlen ausführen. Ad-hoc-Befehle sind eine schnelle Möglichkeit, einen einzelnen Befehl auf einem Remote-Host zu testen oder auszuführen.

Melden Sie sich auf Ihrem Ansible-Controller an und führen Sie den folgenden Befehl aus. Dieser Befehl verwendet das lineinfile-Modul (-m), um eine Verbindung mit der Webmaschine herzustellen und ein Argument (-a) zu übergeben, das der auszuführende Befehl ist.

In diesem Fall aktualisiert das lineinfile-Modul den Eintrag für localhost, indem es die IP-Adresse 127.0.0.1 mit myapache in der Datei /etc/hosts verknüpft. Durch die Verknüpfung von 127.0.0.1 mit myapache können Sie lokal auf die Apache-Testseite unter HTTP://myapache:80 zugreifen.

  • path gibt den Dateispeicherort an.
  • regexp findet den regulären Ausdruck, falls vorhanden, in der Datei und aktualisiert ihn mit 127.0.0.1 myapache, wie im line-Parameter angegeben.
  • Die --become-Flag ermöglicht das Ausführen des Befehls als privilegierter Benutzer.
  • Die web-Gruppe ist eine Sammlung aller Server im Inventar.
  • ansible.builtin.lineinfile oder einfach lineinfile ist der Modulname.
ansible web -m ansible.builtin.lineinfile -a "path=/etc/hosts regexp='^127\.0\.0\.1'  line='127.0.0.1 myapache' state=present" --become

Nach Ausführung des Befehls sollten Sie eine CHANGED-Meldung sehen, die bestätigt, dass die Zeile erfolgreich auf dem Remote-Host aktualisiert wurde.

Running the ad hoc command with ansible lineinfile module

Melden Sie sich mit einem SSH-Client an der Remote-Knoten an und überprüfen Sie mit dem cat-Befehl, ob die Datei /etc/hosts mit dem neuen Wert aktualisiert wurde.

Wie unten gezeigt, wurde der Eintrag für localhost erfolgreich mit 127.0.0.1 myapache auf dem Remote-Rechner aktualisiert.

Verifying the host file on remote machine

Ändern mehrerer Textdateien in einem Playbook

Es ist möglicherweise in Ordnung, mit einem einzelnen Ad-hoc-Befehl Zeilen auf einem Remote-Rechner zu verwalten, aber es wird schwierig, wenn Sie Zeilen in mehreren Dateien oder mehrere Zeilen in einer Datei verwalten müssen. Verwenden Sie anstelle von Ad-hoc-Befehlen den Ansible lineinfile-Modul innerhalb des Playbooks mit dem ansible-playbook-Befehl.

Jetzt lernen wir, wie man das Ansible lineinfile-Modul innerhalb des Playbooks verwendet und einige Zeilen ändert.

Angenommen, Sie sind bereits am Ansible-Controller-Host angemeldet:

1. Erstellen Sie ein Verzeichnis namens ansible_lineinfile_module_demo in Ihrem Home-Verzeichnis. Dieses Verzeichnis enthält das Playbook, das Sie verwenden werden, um das lineinfile-Modul aufzurufen.

mkdir ~/ansible_lineinfile_module_demo
cd ~/ansible_lineinfile_module_demo

2. Erstellen Sie eine weitere Datei mit dem Namen my_playbook.yml im Verzeichnis ~/ansible_lineinfile_module_demo und fügen Sie den folgenden YAML-Playbook-Inhalt ein. Dieses Playbook enthält mehrere Aufgaben, die das Ansible lineinefile-Modul verwenden, um Zeilen verschiedener Konfigurationsdateien für Apache auf der Remote-Maschine zu verwalten.

Das unten stehende Playbook enthält die folgenden Aufgaben:

1. Überprüft, ob ADMIN in der Datei /etc/sudoers vorhanden ist. Wenn nicht, fügt die Aufgabe es hinzu.

2. Stellt sicher, dass Apache standardmäßig auf Port 8080 hört, innerhalb der Datei /etc/apache2/ports.conf; falls es eine andere Portzeile findet, aktualisiert das lineinfile-Modul sie auf den Port 8080. Ebenso unter /etc/apache2/apache2.conf aktualisiert es MaxKeepAliveRequests auf 1000 und KeepAliveTimeout auf 100.

3. Fügt die Zeile mit dem Text „Hello This is my Apache Page“ am Ende der Datei index.html auf dem Remote-Server im Verzeichnis /var/www/html hinzu.

Ansible-Playbooks sind in YAML geschrieben. Um mehr über YAML zu erfahren, klicken Sie hier

---
- name: Ansible lineinfile module example
# Definieren des entfernten Servers, auf dem das Ansible-Lineinfile-Modul wirksam wird
  hosts: web
  remote_user: ubuntu   # Verwenden des Remote-Hosts als ubuntu
  become: true
  tasks:

# (Aufgabe-1) Überprüfen der Sudoers-Datei, ob Admins alle Operationen ausführen dürfen
    - name: Validate the sudoers file before saving
      ansible.builtin.lineinfile:
         path: /etc/sudoers
         state: present
         regexp: '^%ADMIN ALL='
         line: '%ADMIN ALL=(ALL) NOPASSWD: ALL'

# (Aufgabe-2) Aktualisieren des Standardports von Apache auf 8080
    - name: Ensure the default Apache port is 8080
      ansible.builtin.lineinfile:
         path: /etc/apache2/ports.conf
         regexp: '^Listen '
         insertafter: '^#Listen '
         line: Listen 8080

# (Aufgabe-3) Hinzufügen der Zeile am Ende der HTML-Seite Hallo Dies ist meine Apache-Seite
    - name: Add a line to a file if the file does not exist
      ansible.builtin.lineinfile:
         path: /var/www/html/index.html
         line: Hello This is my Apache Page
         create: yes

# (Aufgabe-4) Überprüfen der Sudoers-Datei, ob Admins alle Operationen ausführen dürfen
    - name: Ensure MaxKeepAliveRequests is set to greater than 100
      ansible.builtin.lineinfile:
         path: /etc/apache2/apache2.conf
         regexp: '^MaxKeepAliveRequests'
         line: MaxKeepAliveRequests=1000

# (Aufgabe-5) Überprüfen der Sudoers-Datei, ob Admins alle Operationen ausführen dürfen
    - name: Ensure KeepAliveTimeout is set to greater than 50
      ansible.builtin.lineinfile:
         path: /etc/apache2/apache2.conf
         regexp: '^KeepAliveTimeout'
         line: KeepAliveTimeout=100

3. Jetzt das Playbook aufrufen und die Aufgaben mit dem Befehl ansible-playbook ausführen, um alle im Playbook definierten Zeilen auf dem Remote-Host hinzuzufügen oder zu aktualisieren.

ansible-playbook my_playbook.yml 
Invoking the ansible playbook

Hier unten sehen Sie, dass die AUFGABE den Status geändert hat, was bedeutet, dass der Remote-Host nicht im richtigen Zustand war und geändert wurde, um den Befehl auszuführen. Für die AUFGABE, die den OK-Status hat, zeigt dies, dass keine Änderungen erforderlich sind.

4. Als nächstes melden Sie sich mit Ihrem bevorzugten SSH-Client beim Remote-Host an.

5. Überprüfen Sie abschließend mit dem Befehl cat, ob alle im my_playbook.yml definierten Zeilen auf dem Remote-Host aktualisiert oder hinzugefügt wurden.

# Um zu überprüfen, ob der Administrator mit vollen Berechtigungen vorhanden ist, und falls nicht, fügen Sie ihn hinzu
cat /etc/sudoers
# Um sicherzustellen, dass MaxKeepAliveRequests und KeepAliveTimeout auf 1000 bzw. 100 aktualisiert wurden.
cat /etc/apache2/apache.config | grep Alive
# Um zu überprüfen, ob Apache auf Port 8080 hört.
cat /etc/apache2/ports.config

Das untenstehende Bild bestätigt, dass der admin bereits in der sudoers-Datei hinzugefügt wurde.

Verifying the sudoers file

Erneut bestätigt das untenstehende Bild, dass Apache standardmäßig auf Port 8080 hört.

Verifying the ports for in the config file

Abschließend überprüfen Sie, ob MaxKeepAliveRequests und KeepAliveTimeout auf 1000 bzw. 100 aktualisiert wurden.

Verifying the MaxKeepAliveRequests and KeepAliveTimeout in the config file

Schlussfolgerung

Das Ansible lineinfile-Modul ist eine großartige Möglichkeit, Textdateien auf entfernten Hosts zu ändern. Das Modul bietet eine großartige Möglichkeit, Zeilen in Textdateien innerhalb Ihrer Playbooks hinzuzufügen, zu entfernen und zu ändern.

Welche anderen Anwendungsfälle sehen Sie, die vom Ansible lineinfile-Modul profitieren könnten?

Source:
https://adamtheautomator.com/ansible-lineinfile/