Ansible lineinfile Beispiele – Hinzufügen, Ändern, Löschen, Ersetzen von Zeilen
- 0
Das Ansible lineinfile Modul könnte der Retter in der Not sein, wenn man mit Dateien arbeiten und vor allem deren Inhalt im laufenden Betrieb ändern möchte, wie das Hinzufügen einer neuen Zeile in der Datei oder das Aktualisieren einer Zeile in der Datei oder das Ersetzen einer Zeile in der Datei, wenn ein bestimmter Text gefunden wird und vieles mehr.
lineinfile hat eine Reihe von Beispielen und stellt viele Parameter zur Verfügung, mit denen man seine Arbeit leicht erledigen kann. In diesem Beitrag werden wir das Ansible lineinfile Modul in Aktion mit Beispielen sehen.
Inhaltsverzeichnis
- Das Ansible lineinfile Modul
- Ansible lineinfile examples
- Beispiel 1: Überprüfen, ob eine Zeile in der Datei vorhanden ist, ohne sie zu ändern
- Beispiel2: Überprüfen, ob eine Zeichenkette oder eine Zeile in der Datei vorhanden ist und hinzufügen, wenn sie nicht existiert
- Beispiel3: Ersetzen einer Zeile in einer Datei mit ansible lineinfile.
- Würden alle übereinstimmenden Zeilen ersetzt? Was ist, wenn es mehr als eine Übereinstimmung gibt
- Beispiel 4: Eine Zeile aus der Datei entfernen, wenn sie gefunden wird (alle Instanzen)
- Beispiel5: Einfügen nach einer passenden Zeile mit dem Parameter insertafter
- Beispiel6: Einfügen vor einer übereinstimmenden Zeile mit dem Parameter insertbefore
- Beispiel 7: Validieren Sie die Änderungen vor dem Speichern/Übertragen
Das Ansible lineinfile Modul
Ansible lineinfile Modul ist hilfreich, wenn man eine einzelne Zeile in einer Datei hinzufügen, entfernen oder ändern möchte. Sie können auch Bedingungen verwenden, um die Zeile vor dem Ändern oder Entfernen mit regulären Ausdrücken abzugleichen. Sie können die übereinstimmende Zeile wiederverwenden und ändern, indem Sie den Rückverweis-Parameter verwenden.
Stellen Sie sich vor, Sie haben eine der folgenden Anforderungen
- Sie möchten eine Zeile hinzufügen, wenn sie noch nicht vorhanden ist.
- Sie möchten die Portnummer in der Konfigurationsdatei ändern
- Sie möchten SSL deaktivieren, wenn SSL aktiviert ist
- Sie möchten einen neuen Eintrag in der Datei /etc/hosts hinzufügen
- Sie möchten die Paketversion aktualisieren, wenn die installierte Version mit dem regulären Ausdruck übereinstimmt
- Sie möchten einen Benutzernamen aus der Datei /etc/passwd mit Hilfe von regex entfernen
Hoffe, dass dies den Kontext darstellt. Bevor wir mit den Beispielen fortfahren, muss etwas hervorgehoben werden.
Ansible Lineinfile kann nur für die Bearbeitung einer einzelnen Zeile in einer Datei verwendet werden. Wenn Sie mehrere Zeilen ersetzen wollen, versuchen Sie das replace-Modul oder verwenden Sie blockinfile, wenn Sie einen Block von Zeilen in einer Datei einfügen/aktualisieren/entfernen wollen.
Wenn Sie mehr über das Ansible Replace-Modul erfahren wollen, können Sie diesen Beitrag lesen.
Ansible replace line in file – Ansible Replace Examples
Ansible lineinfile examples
Wir haben hier verschiedene Beispiele für ansible lineinfile gesammelt. Diese Beispiele haben wir in diesem Beitrag behandelt. Sie können wählen, ob Sie alle oder ein bestimmtes Beispiel lesen möchten.
- Prüfen, ob eine Zeile vorhanden ist, ohne sie zu ändern
- Prüfen, ob eine Zeile in der Datei vorhanden ist und hinzufügen, wenn sie nicht vorhanden ist
- Ersetzen einer Zeile in einer Datei, wenn sie mit ansible lineinfile gefunden wird
- Entfernen einer Zeile aus der Datei, wenn sie gefunden wird – Alle Instanzen
- Einfügen vor einer passenden Zeile mit dem Parameter insertbefore
- Einfügen nach der passenden Zeile mit dem Parameter insertafter
- Validieren Sie die Änderungen vor dem Speichern
Beispiel 1: Überprüfen, ob eine Zeile in der Datei vorhanden ist, ohne sie zu ändern
Dies dient nur dazu, zu überprüfen, ob eine Zeile in der Datei vorhanden ist oder nicht. Die Datei wird nicht verändert, egal was das Ergebnis ist. Dies ist genau wie das Ausführen des Befehls quick find
Das folgende Beispiel soll herausfinden, ob die Zeichenkette „LogLevel debug“ in der httpd.conf-Datei des entfernten Apache-Webservers gefunden wird.
Wie bereits erwähnt. Es würde keinerlei Aktion erfolgen
In diesem Beispiel werden wir prüfen, ob der LogLevel Debug ist und die Meldung ausgeben, ob er vorhanden ist oder nicht und keine Aktion durchführen. Dies geschieht mit Hilfe von checkmode=yes
--- - Name: Examples of lineinfile hosts: web tasks: - Name: "Example1: Überprüfen, ob ein String oder eine Zeile in der Datei vorhanden ist" become: yes become_user: root tags: example1 lineinfile: path: /etc/httpd/conf/httpd.conf Zeile: "LogLevel debug" state: present backup: yes check_mode: yes register: example1out
Dieses Playbook würde zwar melden, dass eine Änderung vorgenommen wurde, indem es als changed=1
markiert wird, aber dies würde keine Änderung an der Datei vornehmen, da wir die Aufgabe im Prüfmodus ausgeführt haben.
Hier ist der schnelle Ad-hoc-Befehl, um zu überprüfen, was der tatsächliche LogLevel in der entfernten httpd.conf-Datei ist
$ ansible web -m shell -a "grep -i LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >># LogLevel: Steuert die Anzahl der Meldungen, die im error_log protokolliert werden.LogLevel warn
Es wird empfohlen, immer den Parameter
backup: yes
in Ihrem Playbook zu haben, wenn Sie die lineinfile verwenden. Dadurch wird sichergestellt, dass die Datei gesichert wird, bevor irgendwelche Änderungen vorgenommen werden. Das würde helfen, wenn man ein Rollback machen möchte.
Beispiel2: Überprüfen, ob eine Zeichenkette oder eine Zeile in der Datei vorhanden ist und hinzufügen, wenn sie nicht existiert
In demselben Playbook, das wir gerade gesehen haben, wäre es ein gültiges Playbook, das nach einer Zeile sucht und sie hinzufügt, wenn keine Übereinstimmungen gefunden werden
Aber hier gibt es ein Problem, die Zeile, die Sie erwähnen, würde nur am Ende der Datei oder der letzten Zeile hinzugefügt werden. Dies kann mit den Direktiven insert_before und insert_before kontrolliert werden, die später in diesem Artikel besprochen werden.
Nun das Playbook
--- - name: Examples of lineinfile hosts: web tasks: - name: "Example2: Add the line if it does not exist" become: yes become_user: root tags: example2 lineinfile: path: /etc/httpd/conf/httpd.conf Zeile: "LogLevel debug" state: present backup: yes register: example2out
Das Ergebnis wäre eine ungültige Konfigurationsdatei, da der Eintrag am Ende der Datei hinzugefügt würde.
$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" mwiweb02 | CHANGED | rc=0 >>185:# LogLevel: Steuert die Anzahl der Meldungen, die im error_log protokolliert werden.189:LogLevel warn354:LogLevel debug
Das kann mit Insert after und insert before gesteuert werden, die wir später in diesem Beitrag behandeln werden.
Beispiel3: Ersetzen einer Zeile in einer Datei mit ansible lineinfile.
Im Beispiel2 haben wir gesehen, wie man mit dem lineinfile-Modul eine neue Zeile einfügt. Jetzt werden wir sehen, wie man eine Zeile ersetzt, wenn eine bestimmte Zeile gefunden wird.
Auch wenn man das ansible replace Modul zum Ersetzen verwenden kann. Das Lineinfile-Modul kann auch verwendet werden, um eine Zeile zu ersetzen.
In diesem Beispiel werden wir LogLevel debug
in LogLevel Debug
mit einem großen D ändern
Wir werden das Ansible Lineinfile mit Regular Expressions
verwenden, um nach einer Zeile zu suchen, und das Linienelement würde das line
-Argument enthalten, das die zu ersetzende Zeile enthält
Schauen Sie sich das folgende Playbook an und Sie können es leicht verstehen.
--- - name: Examples of lineinfile hosts: web tasks: - name: "Example1: Überprüfen, ob ein String oder eine Zeile in der Datei vorhanden ist" become: yes become_user: root tags: example1 lineinfile: path: /etc/httpd/conf/httpd.conf # The String to Search regexp: "LogLevel warn" # The String to Replace line: "LogLevel debug" state: present backup: yes register: example1out
Das Ergebnis der Datei würde etwa so aussehen
$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>185:# LogLevel: Steuert die Anzahl der Meldungen, die im error_log protokolliert werden.189:LogLevel debug
Würden alle übereinstimmenden Zeilen ersetzt? Was ist, wenn es mehr als eine Übereinstimmung gibt
Wenn es mehr als eine Übereinstimmung in der Datei gibt. Ansible Lineinfile würde nur die letzte übereinstimmende oder gefundene Zeile ersetzen.
Wenn Sie alle Vorkommen ersetzen möchten, müssen Sie das Modul replace und nicht lineinfile verwenden.
Beispiel 4: Eine Zeile aus der Datei entfernen, wenn sie gefunden wird (alle Instanzen)
Nun möchte ich die Zeile LogLevel Debug
entfernen, die wir zuvor hinzugefügt haben, da sie sich an der falschen Stelle befindet und außerdem haben wir bereits dieLogLevel warn
in derselben Datei.
Hier ist das Ansible-Playbook, um die Zeile aus der Datei zu entfernen und wir können hier einige reguläre Ausdrücke verwenden, um sowohl debug
als auch Debug
--- - Name: Examples of lineinfile hosts: web tasks: - Name: "Example1: Validate if a String or line is present in the file" become: yes become_user: root tags: example1 lineinfile: path: /etc/httpd/conf/httpd.conf # String to Search regexp: "LogLevel ebug" # State is set to Absent to remove if the Searching Line is found state: absent backup: yes register: example1out
Hier setzen wir den State-Parameter als Absent, der entfernt wird, wenn die Suche erfolgreich ist. Der Parameter line
wird nicht verwendet, da er nicht notwendig ist
Wie bereits erwähnt, würden dadurch alle übereinstimmenden Zeilen aus der Datei entfernt werden, mit anderen Worten, alles, was nach einer Suchzeile aussieht.
Beispiel5: Einfügen nach einer passenden Zeile mit dem Parameter insertafter
Da wir die Apache httpd.conf Datei als unsere Basisdatei in diesem Beitrag genommen haben, lassen Sie uns eine Anforderung nehmen, die wir oft in Apache gemacht haben, nämlich das Hinzufügen eines neuen Listeners
Zuerst lassen Sie uns sehen, was bereits in der Datei vorhanden ist
$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Ermöglicht es Ihnen, Apache an bestimmte IP-Adressen zu binden und/oder38:# Ändern Sie dies in Listen auf bestimmte IP-Adressen, wie unten gezeigt 41:#Listen 12.34.56.78:8042:Listen 80
hier ist 42 die Zeilennummer und Sie können sehen, dass wir nur eine Listen-Anweisung/Direktive ab jetzt haben. Um den Apache dazu zu bringen, auf 443 zu hören, müssen wir Listen 443
direkt unter dem Listen 80
Lassen Sie uns sehen, wie man nach einer Zeile mit dem Parameter insertafter einfügt.
Hier ist das Playbook.
--- - Name: Examples of lineinfile hosts: web tasks: - Name: "Example1: Validate if a String or line is present in the file" become: yes become_user: root tags: lineinfileexample lineinfile: path: /etc/httpd/conf/httpd.conf insertafter: "^Listen +" line: "Listen 443" firstmatch: yes state: present register: lineinfileexample
Hier können Sie feststellen, dass es keinen REGEX Parameter gibt. Er wird nicht benötigt, da der Parameter insertafter selbst den Suchstring mit der Syntax des regulären Ausdrucks haben kann
$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Ermöglicht es Ihnen, Apache an bestimmte IP-Adressen zu binden und/oder38:# Ändern Sie dies in Listen auf bestimmte IP-Adressen, wie unten gezeigt 41:#Listen 12.34.56.78:8042:Listen 8043:Listen 443
Wenn Sie die Zeilennummern in der Ausgabe beachten, können Sie sehen, dass die Listen 443
direkt unter der Listen 80
Wenn es mehrere Einträge der suchenden Zeile in der Datei vorhanden ist. Die letzte übereinstimmende Zeile wird berücksichtigt.
Beispiel6: Einfügen vor einer übereinstimmenden Zeile mit dem Parameter insertbefore
Um den Parameter insert before zu testen, nehmen wir die gleiche httpd.conf-Datei als Basisdatei und aktualisieren diesmal die ServerAdmin
E-Mail-ID von der Standardeinstellung ServerAdmin
auf Server Admin
Vor jeder Änderung
aksarav@middlewareinventory:/apps/vagrant/webinfra$ ansible web -m shell -a "grep -in ServerAdmin /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>83:# ServerAdmin: Ihre Adresse, wo Probleme mit dem Server sein sollten87:ServerAdmin root@localhost
Aber wir müssen die bestehende ServerAdmin-Zeile deaktivieren/kommentieren und einen neuen Eintrag hinzufügen, Hier ist das Playbook, um diese beiden Aufgaben zu erledigen.
--- - name: Beispiele für lineinfile hosts: web tasks: - name: "Example6: Comment the Exisiting ServerAdmin Line" become: yes become_user: root tags: lineinfileexample6_1 lineinfile: path: /etc/httpd/conf/httpd.conf regexp: '(^ServerAdmin .*)' line: '# \1' backrefs: yes state: present register: lineinfileexample6_1 - name: "Example6: Add a New ServerAdmin Before the Commented Line" become: yes become_user: root tags: lineinfileexample6_2 lineinfile: path: /etc/httpd/conf/httpd.conf insertbefore: '# ServerAdmin .*' line: "ServerAdmin " state: present register: lineinfileexample6_2
Das erwartete Ergebnis wäre etwa wie folgt.
aksarav@middlewareinventory:/apps/vagrant/webinfra$ ansible web -m shell -a "grep -in ServerAdmin /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>83:# ServerAdmin: Ihre Adresse, wo Probleme mit dem Server sein sollten87:ServerAdmin [email protected]:# ServerAdmin root@localhost
Sie können sehen, dass die Zeile Nummer 88 auskommentiert wurde, die der alte ServerAdmin war, und die Zeile Nummer 87 ist unser neuer ServerAdmin
Beispiel 7: Validieren Sie die Änderungen vor dem Speichern/Übertragen
Dies ist eine nette Funktion von Ansible lineinfile, die es Ihnen ermöglicht, einen Shell-Befehl auszuführen, um zu überprüfen, ob die geänderte Datei wirklich in Ordnung ist oder ob es irgendwelche Probleme gibt. Da unsere Basisdatei eine Konfigurationsdatei httpd.conf
ist, hat sie eine gewisse Syntax und wenn wir sie nicht einhalten, steht die gesamte Website/Infra auf dem Spiel.
So lassen Sie uns die Datei vor dem Speichern validieren.
Apache HTTPD Server hat einen Befehl, um die Syntaxprüfung der httpd.conf Datei durchzuführen, der httpd -t
Wenn er aufgerufen wird und es keine Syntaxprobleme gibt. Er würde die Meldung Syntax OK wie unten angegeben ausgeben und einen Null-Rückgabecode zurückgeben, was für Ansible das einzig Wichtige ist. Ansible verlässt sich auf den Return Code des Validierungsbefehls.
$ httpd -t Syntax OK
Wenn er NICHT NULL ist, werden die Änderungen nicht übertragen und die Aufgabe schlägt fehl.
Hier ist das Playbook zum Aktualisieren der ServerName-Direktive von Apache.
--- - name: Beispiele für lineinfile hosts: web tasks: - name: "Example7: Update the ServerName" become: yes become_user: root lineinfile: path: /etc/httpd/conf/httpd.conf insertafter: '#Servername www.example.com:80' Zeile: "ServerName www.middlewareinventory.com:80" state: present # Command to Validate the Configuration and %s is a working copy of the file validate: "httpd -t -f %s"
Hier ist das %s
die Arbeitskopie der eigentlichen Datei. Ansible würde die Datei immer kopieren und als Arbeitskopie aufbewahren, die Änderungen vornehmen und sie schließlich an den Zielort kopieren und die Originaldatei ersetzen.
Quick Ad Hoc command to validate
$ ansible web -m shell -a "grep -in ServerName /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>92:# ServerName gibt den Namen und den Port an, den der Server verwendet, um sich zu identifizieren.98:#ServerName www.example.com:8099:ServerName www.middlewareinventory.com:80
Sie sehen, dass die ServerName-Direktive hinzugefügt wurde.
Wir sind am Ende des Artikels angelangt.
Hoffentlich hilft es
Bewerten Sie diesen Artikel
Grüße
Sarav AK
Folgen Sie uns auf Facebook oder TwitterFür weitere praktische Videos und Anleitungen. Abonnieren Sie unseren KanalFinden Sie mich auf Linkedin Mein ProfilFür jede Beratung oder um uns zu engagieren Wenn Sie diesen Artikel mögen. Zeigen Sie Ihre Unterstützung! Buy me a Coffee.
Signup for Exclusive „Subscriber-only“ Content