Ansible lineinfile examples – Add, Modify, Delete, Replace lines

  • 0

Ansible lineinfile-modulen kan vara en räddare i nöden när du vill jobba med filer, och framför allt ändra deras innehåll, på språng, som att lägga till en ny rad i filen eller uppdatera en rad i filen eller ersätta en rad i filen när en viss text hittas och mycket mer.

lineinfile har olika exempel och tillhandahåller många parametrar för att du enkelt ska kunna utföra ditt arbete. I det här inlägget kommer vi att se ansible lineinfile-modulen i praktiken med exempel.

ansible lineinfile examples

Innehållsförteckning

Ansible lineinfile-modulen

Ansible lineinfile-modulen är användbar när du vill lägga till, ta bort, ändra en enda rad i en fil. Du kan också använda villkor för att matcha raden innan du ändrar eller tar bort den med hjälp av reguljära uttryck. Du kan återanvända och ändra den matchade raden med hjälp av parametern back reference.

Konsultera att du har något av följande krav

  1. Du vill lägga till en rad när den inte redan finns.
  2. Du vill ändra portnumret i konfigurationsfilen
  3. Du vill inaktivera SSL när SSL är aktiverat
  4. Du vill lägga till en ny post i filen /etc/hosts
  5. Du vill lägga till en ny post i filen /etc/hosts. vill uppgradera paketversionen när den installerade versionen matchar ditt reguljära uttryck
  6. Du vill ta bort ett användarnamn från filen /etc/passwd med hjälp av ett reguljärt uttryck

Hoppas att detta sätter sammanhanget. Innan vi fortsätter med exemplen Något som bör lyftas fram.

Ansible Lineinfile kan endast användas för att bearbeta en enda rad i en fil. Om du vill ersätta flera rader, prova replace-modulen eller använd blockinfile om du vill infoga/uppdatera/ta bort ett block av rader i en fil.

Om du vill utforska mer om Ansible Replace-modulen kan du hänvisa till det här inlägget.

Ansible replace line in file – Ansible Replace Examples

Ansible lineinfile examples

Vi har samlat olika exempel på ansible lineinfile här. Detta är exempel som vi har täckt i det här inlägget. du kan välja att läsa alla eller något specifikt exempel.

  • Validera om en rad finns utan ändring
  • Validera om en rad finns i filen och lägg till om den inte finns
  • Ersätt en rad i en fil om den hittas med ansible lineinfile
  • Ta bort en rad från filen. filen om den hittas – Alla instanser
  • Insätt före en matchande rad med parametern insertbefore
  • Insätt efter den matchande raden med parametern insertafter
  • Validera att ändringarna är korrekta innan de sparas

Exempel 1: Validera om en rad finns i filen utan några ändringar

Detta är bara för att validera om en rad finns i filen eller inte. Det kommer inte att ändra filen oavsett vad resultatet blir. detta är precis som att köra kommandot quick find

Exemplet nedan är för att ta reda på om strängen ”LogLevel debug” finns eller inte finns i fjärrwebbserverns httpd.conf-fil.

Som tidigare nämnts. Det skulle inte vidtas någon åtgärd alls

I det här exemplet ska vi kontrollera om LogLevel är Debug och skriva ut meddelandet Om den finns där eller inte och inte vidta någon åtgärd. Detta görs med hjälp av checkmode=yes

--- - name: Examples of lineinfile hosts: web tasks: - name: "Example1: Validerar om en sträng eller en rad finns i filen" become: yes become_user: root tags: example1 lineinfile: path: /etc/httpd/conf/httpd.conf rad: "LogLevel debug" state: present backup: yes check_mode: yes register: example1out

Den här playbooken skulle rapportera att en ändring har gjorts genom att markera den som changed=1, men detta skulle inte göra någon ändring i filen eftersom vi körde uppgiften i Check mode.

Här är det snabba ad hoc-kommandot för att kontrollera vad som är den faktiska LogLevel i fjärrfilen httpd.conf

$ ansible web -m shell -a "grep -i LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >># LogLevel: LogLevel warn

Det rekommenderas att du alltid har parametern backup: yes i din playbook när du använder lineinfile. Detta skulle se till att filen säkerhetskopieras innan några ändringar görs. Detta skulle vara till hjälp om du vill backa tillbaka.

Exempel2: Validera om en sträng eller rad finns i filen och lägg till om den inte finns

I samma spelbok har vi just sett att om vi tar bort checkläget skulle det vara en giltig spelbok som söker efter en rad och lägger till den när det inte finns några matchningar som hittas

Men det finns ett problem här den rad du nämner som ska läggas till skulle läggas till endast i slutet av filen eller vid den sista raden. Detta kan kontrolleras med direktiven insert_before och insert_before som kommer att diskuteras senare i denna artikel.

Nu kommer spelboken

--- - 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 rad: /etc/httpd/conf/httpd.conf rad: "LogLevel debug" state: present backup: yes register: example2out

Resultatet av detta skulle resultera i en ogiltig konfigurationsfil eftersom posten skulle läggas till i slutet av filen.

$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" mwiweb02 | CHANGED | rc=0 >>185:# LogLevel: 189:LogLevel warn354:LogLevel debug

Vilket kan kontrolleras med Insert after och insert before, vilket vi kommer att göra senare i det här inlägget.

Example3: I exemplet2 har vi sett hur man lägger till en ny rad med modulen lineinfile. Nu ska vi se hur man ersätter en rad när en viss rad hittas.

Tyvärr kan du använda ansible replace-modulen för att ersätta. Lineinfile-modulen kan också användas för att ersätta en rad.

Nu i det här exemplet kommer vi att ändra LogLevel debug till LogLevel Debug med ett stort D

Vi kommer att använda Ansible Lineinfile med Regular Expressions för att söka efter en rad och line-elementet skulle innehålla line-argumentet skulle innehålla den rad som ska ersättas med

Klipp på följande Playbook och du kan enkelt förstå det.

--- - 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: /Stråk att söka regexp: "LogLevel warn" # Stråk att ersätta rad: "LogLevel warn" # Stråk att ersätta rad: "LogLevel warn" # Stråk att ersätta rad: "LogLevel debug" state: present backup: yes register: example1out

Resultatet av filen skulle vara ungefär så här

$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>185:# LogLevel: 189:LogLevel debug

Vill den ersätta alla matchande rader? Vad händer om det finns fler än en matchning

Om det finns fler än en matchning i filen. Ansible Lineinfile skulle ersätta endast den sista raden som matchas eller hittas.

Om du vill ersätta alla förekomster måste du överväga att använda replace-modulen och inte lineinfile.

Exempel 4: Ta bort en rad från filen, om den hittas ( Alla förekomster )

Nu vill jag ta bort raden LogLevel Debug som vi har lagt till tidigare eftersom den är på fel plats och dessutom har vi redanLogLevel warn närvarande i samma fil.

Här är ansible playbook för att ta bort raden från filen och vi kan använda några reguljära uttryck här för att hitta både debug och 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: # 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

Här ställer vi in state-parametern som absent vilket kommer att ta bort om sökningen är framgångsrik. parametern line används inte eftersom den inte är nödvändig

Som tidigare nämnts skulle detta ta bort alla matchande rader från filen, med andra ord allt utseende av en sökrad.

Exempel5: Infoga efter en matchande rad med hjälp av parametern insertafter

Då vi har tagit Apache httpd.conf-filen som vår basfil i det här inlägget, låt oss ta ett krav som vi brukade göra ofta i Apache, vilket är att lägga till en ny lyssnare

Först ska vi se vad som redan finns i filen

$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Det gör det möjligt att binda Apache till specifika IP-adresser och/eller38:# Ändra detta till Listen på specifika IP-adresser som visas nedan till 41:#Listen 12.34.56.78:8042:Listen 80

här är 42 radnumret och du kan se att vi bara har en Listen-angivelse/direktiv från och med nu. För att få Apache att lyssna på 443 måste vi nu lägga till Listen 443 precis under Listen 80
Låt oss se hur man infogar efter en rad med hjälp av parametern insertafter.

Här är spelboken.

--- - 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:: /etc/httpd/conf/httpd.conf insertafter: "^Listen +" rad: "Listen 443" firstmatch: yes state: present register: lineinfileexample

Här kan du märka att det inte finns någon REGEX-parameter. Den behövs inte eftersom parametern insertafter själv kan ha söksträngen med syntaxen Regular Expression

$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Låter dig binda Apache till specifika IP-adresser och/eller38:# Ändra detta till Lyssna på specifika IP-adresser som visas nedan till 41:#Listen 12.34.56.78:8042:Listen 8043:Listen 443

Om du lägger märke till radnumren i utmatningen kan du se att Listen 443 har lagts till precis under Listen 80

När det finns flera poster för den sökande linjen finns det i filen. Den sista matchade raden skulle beaktas.

Exempel6: Infoga före en matchande rad med hjälp av parametern insertbefore

För att testa parametern insert before, låt oss ta samma httpd.conf-filen som basfil och den här gången ska vi uppdatera ServerAdmin Email ID från standardvärdet ServerAdmin till Server Admin

För att göra någon ändring

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: Här är spelboken för att göra båda dessa uppgifter. 
--- - name: Examples of lineinfile hosts: web tasks: - name: "Example6: Comment the Exisiting ServerAdmin Line" become: yes become_user: root tags: lineinfileexample6_1 lineinfile: path: 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

Det förväntade resultatet skulle se ut på följande sätt.

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: Du kan se att rad nummer 88 har kommenterats vilket var den äldre Server Admin och rad nummer 87 är vår nya ServerAdmin 

Exempel 7: Validera ändringarna innan du sparar/kommitterar

Det här är en trevlig funktion i Ansible lineinfile som låter dig köra ett skalkommando för att validera om den modifierade filen verkligen är OK eller om det finns några problem. Eftersom vår basfil är en konfigurationsfil httpd.conf har den en viss syntax och om vi missar att följa den kommer vi att lämna hela webbplatsen/infra på spel.

Så låt oss validera den innan vi sparar filen.

Apache HTTPD-serveren har ett kommando för att utföra syntaxkontrollen på httpd.conf-filen som är httpd -t

När den anropas och utan syntaxproblem. Det skulle skriva ut meddelandet Syntax OK enligt nedan och returnera en Zero Return Code, vilket är allt som spelar roll för Ansible. Ansible förlitar sig på valideringskommandots returkod.

$ httpd -t Syntax OK

Om den inte är noll skulle ändringarna inte bekräftas och uppgiften skulle misslyckas.

Här är spelboken för att uppdatera ServerName-direktivet i Apache.

--- - name: Examples of 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' rad: "ServerName www.middlewareinventory.com:80" state: present # Kommando för att validera konfigurationen och %s är en arbetskopia av filen validate: "httpd -t -f %s"

Här är %s en arbetskopia av den faktiska filen. Ansible skulle alltid kopiera filen och behålla den som en arbetskopia och göra ändringarna och slutligen kopiera den över till den avsedda platsen och ersätta den ursprungliga filen.

Snabbt ad hoc-kommando för att validera

$ ansible web -m shell -a "grep -in ServerName /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>92:# ServerName anger det namn och den port som servern använder för att identifiera sig själv.98:#ServerName www.example.com:8099:ServerName www.middlewareinventory.com:80 

Du kan se att ServerName-direktivet har lagts till.

Vi har kommit till slutet av artikeln.

Hoppas att det hjälper

Bedöm den här artikeln

Cheers
Sarav AK

Buy Me a Coffee at ko-fi.com

Följ oss på Facebook eller TwitterFör fler praktiska videor och handledningar. Prenumerera på vår kanalHitta mig på Linkedin Min profilFör konsultationer eller för att anlita oss Om du gillar den här artikeln. Visa ditt stöd! Buy me a Coffee.

Signup for Exclusive "Subscriber-only" Content