Ansible lineinfile voorbeelden – Regels toevoegen, wijzigen, verwijderen, vervangen

  • 0

Ansible lineinfile module zou de redder in nood kunnen zijn wanneer u met bestanden wilt werken en vooral de inhoud ervan wilt wijzigen tijdens het uitvoeren, zoals het toevoegen van een nieuwe regel in het bestand of het bijwerken van een regel in het bestand of het vervangen van een regel in het bestand wanneer bepaalde tekst wordt gevonden en nog veel meer.

lineinfile heeft een aantal voorbeelden en biedt veel parameters om uw werk gemakkelijk te doen. In deze post gaan we de Ansible lineinfile module in actie zien met voorbeelden.

ansible lineinfile voorbeelden

Inhoudsopgave

De Ansible lineinfile module

Ansible lineinfile module is handig wanneer u een enkele regel in een bestand wilt toevoegen, verwijderen of wijzigen. U kunt ook voorwaarden gebruiken om de regel te matchen voor het wijzigen of verwijderen met behulp van de reguliere expressies. U kunt de gematchte regel opnieuw gebruiken en wijzigen met behulp van de terugverwijzingsparameter.

Bedenk dat u een van de volgende vereisten hebt

  1. U wilt een regel toevoegen als deze nog niet aanwezig is.
  2. U wilt het poortnummer in het configuratiebestand wijzigen
  3. U wilt SSL uitschakelen wanneer SSL is ingeschakeld
  4. U wilt een nieuwe regel toevoegen in het bestand /etc/hosts
  5. U wilt wilt de pakketversie upgraden als de geïnstalleerde versie overeenkomt met uw reguliere expressie
  6. U wilt een gebruikersnaam verwijderen uit het bestand /etc/passwd met behulp van regex

Hoop dat dit de context schept. Voordat we verder gaan met de voorbeelden Iets om te benadrukken.

Ansible Lineinfile kan alleen worden gebruikt voor het bewerken van een enkele regel in een bestand. Als u meerdere regels wilt vervangen, probeert u de module replace of gebruikt u blockinfile als u een blok regels in een bestand wilt invoegen/bijwerken/verwijderen.

Als u meer wilt weten over de module Ansible Replace, kunt u deze post raadplegen.

Ansible vervang regel in bestand – Ansible vervang voorbeelden

Ansible lineinfile voorbeelden

We hebben hier verschillende voorbeelden van ansible lineinfile verzameld. Dit zijn voorbeelden die we in deze post hebben behandeld. U kunt ervoor kiezen om alle of een specifiek voorbeeld te lezen.

  • Valideer of een regel aanwezig is zonder enige wijziging
  • Valideer of een regel aanwezig is in het bestand en voeg toe als deze niet bestaat
  • Vervang een regel in een bestand als deze gevonden is met ansible lineinfile
  • Verwijder een regel uit het bestand als deze wordt gevonden – Alle instanties
  • Voeg in vóór een overeenkomende regel met insertbefore parameter
  • Voeg in na de overeenkomende regel met insertafter parameter
  • Verifieer dat de wijzigingen correct zijn alvorens op te slaan

Voorbeeld 1: Valideer of een regel in het bestand aanwezig is zonder enige wijziging

Dit is alleen om te valideren of een regel in het bestand aanwezig is of niet. Het zal het bestand niet wijzigen, ongeacht wat het resultaat is. dit is net als het uitvoeren van het quick find commando

Het voorbeeld hieronder is om te vinden of de String “LogLevel debug” wel of niet gevonden is in het remote apache web server’s httpd.conf bestand.

Zoals eerder vermeld. Er zou geen enkele actie worden ondernomen

In dit voorbeeld gaan we controleren of het LogLevel Debug is en drukken we de boodschap af Als het er is of niet en ondernemen geen actie. Dit wordt gedaan met behulp van checkmode=yes

--- - naam: Voorbeelden van lineinfile hosts: web tasks: - naam: "Voorbeeld1: 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 regel: "LogLevel debug" state: present backup: yes check_mode: yes register: example1out

Hoewel dit playbook zou melden dat er een wijziging is aangebracht door het te markeren als changed=1, maar dit zou geen wijziging aanbrengen in het bestand omdat we de taak in Check mode hebben uitgevoerd.

Hier volgt een snel ad-hoc commando om te controleren wat het huidige LogLevel is in het remote httpd.conf bestand

$ ansible web -m shell -a "grep -i LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >># LogLevel: Regelt het aantal berichten dat wordt gelogd naar de error_log.LogLevel warn

Het wordt aanbevolen om altijd de parameter backup: yes in uw playbook te hebben wanneer u de lineinfile gebruikt. Dit zou ervoor zorgen dat er een back-up van het bestand wordt gemaakt voordat er wijzigingen worden aangebracht. Dit zou helpen in het geval dat u wilt terugdraaien.

Example2: Valideer of een String of regel aanwezig is in het bestand en voeg toe als het niet bestaat

In hetzelfde playbook, dat we zojuist hebben gezien als we de controle-modus verwijderen, zou het een geldig playbook zijn dat zoekt naar een regel en deze toevoegt als er geen overeenkomsten worden gevonden

Maar er is een probleem hier de regel die u vermeldt om te worden toegevoegd zou alleen worden toegevoegd aan het einde van het bestand of de laatste regel. Dit kan worden gecontroleerd met insert_before en insert_before directives die later in dit artikel zullen worden besproken.

Nu het playbook

-- - naam: Voorbeelden van lineinfile hosts: web tasks: - naam: "Example2: Voeg de regel toe als deze niet bestaat" become: yes become_user: root tags: example2 lineinfile: path: /etc/httpd/conf/httpd.conf line: "LogLevel debug" state: present backup: yes register: example2out

Het resultaat hiervan zou resulteren in een ongeldig configuratiebestand omdat de entry zou worden toegevoegd aan het End Of File.

$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" mwiweb02 | CHANGED | rc=0 >>185:# LogLevel: Regelt het aantal berichten dat naar de error_log wordt gelogd.189:LogLevel warn354:LogLevel debug

Die kan worden geregeld met Insert after en insert before die we later in deze post zullen behandelen.

Example3: Een regel in een bestand vervangen met ansible lineinfile.

In het voorbeeld2 hebben we gezien hoe we een nieuwe regel kunnen toevoegen met lineinfile module. Nu gaan we zien hoe we een regel kunnen vervangen wanneer een Bepaalde regel wordt gevonden.

Hoewel u de ansible replace module kunt gebruiken om te vervangen. De Lineinfile module kan ook worden gebruikt om een regel te vervangen.

Nu in dit voorbeeld, gaan we de LogLevel debug veranderen in LogLevel Debug met een hoofdletter D

We gaan de Ansible Lineinfile gebruiken met Regular Expressions om te zoeken naar een regel en het line element zou het line argument bevatten zou de regel bevatten om te vervangen met

Kijk naar het volgende Playbook en u kunt het gemakkelijk begrijpen.

--- - naam: Voorbeelden van lineinfile hosts: web taken: - naam: "Voorbeeld1: 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 # The String to Search regexp: "LogLevel warn" # The String to Replace line: "LogLevel debug" state: present backup: yes register: example1out

Het resultaat van het bestand zou er ongeveer zo uitzien

$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>185:# LogLevel: Regelt het aantal berichten dat naar de error_log wordt gelogd.189:LogLevel debug

Worden dan alle overeenkomende regels vervangen? Wat als er meer dan één overeenkomst is

Als er meer dan één overeenkomst in het bestand is. Ansible Lineinfile zou alleen de laatste overeenkomende of gevonden regel vervangen.

Als u alle overeenkomende regels wilt vervangen, moet u overwegen de module replace te gebruiken en niet lineinfile.

Voorbeeld 4: Verwijder een regel uit het bestand, als deze wordt gevonden ( Alle voorkomens )

Nu wil ik de regel LogLevel Debug verwijderen, die we eerder hebben toegevoegd, omdat deze op de verkeerde plaats staat en we ook al deLogLevel warn in hetzelfde bestand hebben staan.

Hier volgt het ansible playbook om de regel uit het bestand te verwijderen en we kunnen hier enkele Reguliere expressies gebruiken om zowel debug als Debug

--- - naam: Voorbeelden van lineinfile hosts: web taken: - naam: "Voorbeeld1: 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 om te zoeken regexp: "LogLevel ebug" # State is ingesteld op Absent om te verwijderen als de Searching Line is gevonden state: absent backup: yes register: example1out

Hier zetten we de state parameter op absent die zal verwijderen als de Search is Success. de line parameter wordt niet gebruikt omdat het niet nodig is

Zoals eerder vermeld, zou dit alle overeenkomende regels uit het bestand verwijderen, met andere woorden, alle verschijningsvormen van een zoekregel.

Exemplaar 5: invoegen na een overeenkomende regel met behulp van de parameter insertafter

Omdat we het Apache httpd.conf bestand als ons basis bestand hebben genomen in deze post, Laten we een vereiste nemen die we vaak doen in Apache, namelijk een nieuwe listener toevoegen

Laten we eerst eens kijken wat er al in het bestand staat

$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Hiermee kunt u Apache binden aan specifieke IP-adressen en/of38:# Wijzig dit in Listen op specifieke IP-adressen zoals hieronder weergegeven in 41:#Listen 12.34.56.78:8042:Listen 80

hier is 42 het regelnummer en u kunt zien dat we vanaf nu slechts één Listen statement/directive hebben. Om Apache te laten luisteren naar 443 moeten we Listen 443 toevoegen onder de Listen 80
Laten we eens kijken hoe we een regel kunnen invoegen met de parameter insertafter.

Hier is het afspeelboek.

--- - naam: Voorbeelden van regelinfile hosts: web taken: - naam: "Voorbeeld1: 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 kan je opmerken dat er geen REGEX parameter is. Deze is niet nodig omdat de insertafter parameter zelf de zoekstring kan hebben met de Reguliere Expressie Syntax

$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Hiermee kunt u Apache binden aan specifieke IP-adressen en/of38:# Wijzig dit in Luisteren op specifieke IP-adressen zoals hieronder aangegeven 41:#Luisteren 12.34.56.78:8042:Luisteren 8043:Luisteren 443

Als u de regelnummers in de uitvoer opmerkt, kunt u zien dat de Listen 443 is toegevoegd direct onder de Listen 80

Wanneer er meerdere regels van de zoekregel in het bestand aanwezig zijn.

Example6: Invoegen vóór een overeenkomende regel met behulp van insertbefore parameter

Om de insert before parameter te testen, nemen we hetzelfde httpd.conf bestand als basis nemen en deze keer gaan we de ServerAdmin Email ID updaten van de standaard ServerAdmin naar Server Admin

Vóór elke wijziging

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: Uw adres, waar problemen met de server moeten zijn87:ServerAdmin root@localhost

Maar we moeten de bestaande ServerAdmin regel uitschakelen/commentariëren en een nieuwe regel toevoegen, Hier is het playbook om deze beide taken uit te voeren.

--- - naam: Voorbeelden van lineinfile hosts: web taken: - naam: "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

Het verwachte resultaat zou er ongeveer als volgt uitzien.

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: Uw adres, waar problemen met de server zouden moeten zijn87:ServerAdmin [email protected]:# ServerAdmin root@localhost

U kunt zien dat regelnummer 88 is becommentarieerd wat de oudere Server Admin was en regelnummer 87 is onze nieuwe ServerAdmin

Voorbeeld 7: Valideer de wijzigingen voordat u ze opslaat/vastlegt

Dit is een leuke functie van Ansible lineinfile waarmee u een shell commando kunt uitvoeren om te valideren of het gewijzigde bestand echt OK is of dat er problemen zijn. Omdat ons basisbestand een configuratiebestand is httpd.conf heeft het een bepaalde syntaxis en als we ons er niet aan houden, zetten we de hele website/infra op het spel.

Dus laten we het valideren voordat we het bestand opslaan.

Apache HTTPD server heeft een commando om de syntax controle uit te voeren op het httpd.conf bestand dat httpd -t

Wanneer het wordt aangeroepen en er zijn geen problemen met de syntax. Het zou de boodschap Syntax OK afdrukken zoals hieronder gegeven en een Zero Return Code teruggeven wat alles is wat telt voor Ansible. Ansible vertrouwt op de Return Code van het Validation Command.

$ httpd -t Syntax OK

Als het NON-ZERO is, worden de wijzigingen niet vastgelegd en zal de taak mislukken.

Hier is het playbook om de ServerNaam richtlijn van Apache bij te werken.

--- - naam: Voorbeelden van lineinfile hosts: web taken: - naam: "Example7: Update the ServerName" become: yes become_user: root lineinfile: path: /etc/httpd/conf/httpd.conf insertafter: "#ServerName www.example.com:80" line: "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 is de %s de werkkopie van het eigenlijke bestand. Ansible zou altijd het bestand kopiëren en het bewaren als een werkkopie en de wijzigingen aanbrengen en het uiteindelijk naar de bestemmingslocatie kopiëren en het originele bestand vervangen.

Vlug ad hoc commando om te valideren

$ ansible web -m shell -a "grep -in ServerName /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>92:# ServerName geeft de naam en de poort die de server gebruikt om zichzelf te identificeren.98:#ServerName www.example.com:8099:ServerName www.middlewareinventory.com:80 

U ziet dat de ServerName directive is toegevoegd.

We zijn aan het einde van het artikel gekomen.

Hoop dat het helpt

Beoordeel dit artikel

Cheers
Sarav AK

Buy Me a Coffee at ko-fi.com

Volg ons op Facebook of TwitterVoor meer praktische video’s en tutorials. Abonneer je op ons kanaalVind me op Linkedin Mijn profielVoor een consultatie of om ons in te hurenAls je dit artikel leuk vindt. Toon uw steun! Koop een kopje koffie voor me.

Schrijf je in voor exclusieve “Alleen voor abonnees”-content