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

  • 0

Ansible lineinfile-modulet kan være din redningsmand, når du ønsker at arbejde med filer og især ændre deres indhold undervejs, som f.eks. at tilføje en ny linje i filen eller opdatere en linje i filen eller erstatte en linje i filen, når en bestemt tekst er fundet og meget mere.

lineinfile har et forskelligt sæt eksempler, og det giver mange parametre til at få dit arbejde gjort nemt. I dette indlæg vil vi se ansible lineinfile modulet i aktion med eksempler.

ansible lineinfile eksempler

Indholdsfortegnelse

Ansible lineinfile modulet

Ansible lineinfile modulet er nyttigt, når du ønsker at tilføje, fjerne, ændre en enkelt linje i en fil. Du kan også bruge betingelser til at matche linjen, før du ændrer eller fjerner ved hjælp af regulære udtryk. Du kan genbruge og ændre den matchede linje ved hjælp af back reference-parameteren.

Samtidig har du et af følgende krav

  1. Du ønsker at tilføje en linje, når den ikke allerede er til stede.
  2. Du ønsker at ændre portnummeret i konfigurationsfilen
  3. Du ønsker at deaktivere SSL, når SSL er aktiveret
  4. Du ønsker at tilføje en ny post i filen /etc/hosts
  5. Du ønsker at opgradere pakkeversionen, når den installerede version matcher dit regulære udtryk
  6. Du ønsker at fjerne et brugernavn fra filen /etc/passwd ved hjælp af regex

Håber, at dette sætter konteksten. Før vi fortsætter med eksemplerne Noget skal fremhæves.

Ansible Lineinfile kan kun bruges til at bearbejde en enkelt linje i en fil. Hvis du ønsker at erstatte mutiple linjer prøve replace modulet eller bruge blockinfile hvis du ønsker at indsætte/opdatere/fjern en blok af linjer i en fil.

Hvis du ønsker at udforske mere om Ansible Replace modulet kan du henvise til dette indlæg.

Ansible replace line in file – Ansible Replace Examples

Ansible lineinfile examples

Vi har samlet forskellige eksempler på ansible lineinfile her. Det er eksempler vi har dækket i dette indlæg. du kan vælge at læse alle eller et specifikt eksempel.

  • Validér, om en linje er til stede uden nogen ændring
  • Validér, om en linje er til stede i filen, og tilføj, hvis den ikke findes
  • Forsæt en linje i en fil, hvis den er fundet med ansible lineinfile
  • Fjern en linje fra den fil, hvis den findes – Alle forekomster
  • Indsæt før en matchende linje ved hjælp af insertbefore-parameteren
  • Indsæt efter den matchende linje ved hjælp af insertafter-parameteren
  • bekræft, at ændringerne er korrekte, før du gemmer

Eksempel 1: Validér, om en linje er til stede i filen uden nogen ændring

Dette er blot for at validere, om en linje er til stede i filen eller ej. Det vil ikke ændre filen uanset hvad resultatet er. det er ligesom at køre kommandoen quick find

Eksemplet nedenfor er at finde ud af, om strengen “LogLevel debug” findes eller ej i den eksterne apache-webservers httpd.conf-fil.

Som tidligere nævnt. Der ville ikke blive foretaget nogen handling overhovedet

I dette eksempel vil vi kontrollere, om LogLevel er Debug, og udskrive meddelelsen Hvis den er der eller ej, og foretage ingen handling. Dette gøres ved hjælp af checkmode=yes

--- - name: Eksempler på 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 linje: /etc/httpd/conf/httpd.conf linje:: /etc/httpd/conf/httpd.conf line: "LogLevel debug" state: present backup: yes check_mode: yes register: example1out

Men denne playbook ville rapportere, at der er foretaget en ændring ved at markere den som changed=1, men dette ville ikke foretage nogen ændring på filen, da vi kørte opgaven i Check-tilstand.

Her er den hurtige ad hoc-kommando til at kontrollere, hvad der er den faktiske LogLevel i den eksterne httpd.conf-fil

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

Det anbefales, at du altid har parameteren backup: yes i din playbook, når du bruger lineinfile. Dette vil sikre, at der tages en sikkerhedskopi af filen, før der foretages nogen ændringer. Dette ville hjælpe i tilfælde, hvis du ønsker at rulle tilbage.

Eksempel2: Validér, om en streng eller linje er til stede i filen og tilføj, hvis den ikke findes

I samme playbook, vi lige har set, hvis vi fjerner check mode, ville det være en gyldig playbook, som søger efter en linje og tilføjer den, når der ikke er fundet nogen match

Men der er et problem her den linje, du nævner at blive tilføjet, ville kun blive tilføjet ved End Of File eller Last line. Dette kan styres med direktiverne insert_before og insert_before, som vil blive diskuteret senere i denne artikel.

Nu playbook

--- - name: Eksempler på lineinfile hosts: web tasks: - name: "Example2: Tilføj linjen hvis den ikke eksisterer" become: yes become_user: root tags: example2 lineinfile: path: /etc/httpd/conf/httpd.conf line: "LogLevel debug" state: present backup: yes register: example2out

Resultatet af dette ville resultere i en ugyldig konfigurationsfil, da posten ville blive tilføjet i slutningen af filen.

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

Det kan styres med Insert after og Insert before, som vi vil se senere i dette indlæg.

Eksempel3: I eksempel2 har vi set, hvordan vi kan tilføje en ny linje med lineinfile-modulet. Nu vil vi se, hvordan man erstatter en linje, når der findes en bestemt linje.

Selv om du kan bruge ansible replace-modulet til at erstatte. Lineinfile-modulet kan også bruges til at erstatte en linje.

Nu i dette eksempel vil vi ændre LogLevel debug til LogLevel Debug med et stort D

Vi vil bruge Ansible Lineinfile med Regular Expressions til at søge efter en linje, og linjeelementet ville indeholde line-argumentet ville indeholde den linje, der skal erstattes med

Kig på følgende Playbook, og du kan nemt forstå det.

--- - name: Eksempler på 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: /Streng der skal søges regexp: "LogLevel warn" # Streng der skal erstattes linje: "LogLevel warn" # Streng der skal erstattes linje: "LogLevel debug" state: present backup: yes register: example1out

Resultatet af filen ville være noget i stil med dette

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

Vil den erstatte alle de matchende linjer? Hvad hvis der er mere end én matchning

Hvis der er mere end én matchning i filen. Ansible Lineinfile ville kun erstatte den sidste linje matchet eller fundet.

Hvis du gerne vil erstatte alle forekomsterne, skal du overveje at bruge replace-modulet og ikke lineinfile.

Eksempel 4: Fjern en linje fra filen, hvis den er fundet ( Alle forekomster )

Nu vil jeg gerne fjerne linjen LogLevel Debug, som vi har tilføjet tidligere, da den er på det forkerte sted, og også vi allerede har LogLevel warn til stede i samme fil.

Her er den ansible playbook til at fjerne linjen fra filen, og vi kan bruge nogle Regular expressions her til at finde både debug og Debug

--- - name: Eksempler på 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

Her indstiller vi state parameteren som absent, hvilket vil fjerne hvis søgningen er en succes. parameteren line bruges ikke, da den ikke er nødvendig

Som tidligere nævnt vil dette fjerne alle de matchende linjer fra filen, med andre ord alt udseende af en Søgelinje.

Eksempel5: Indsæt efter en matchende linje ved hjælp af insertafter-parameteren

Da vi har taget Apache httpd.conf-fil som vores basisfil i dette indlæg, Lad os tage nogle krav, vi plejede at gøre ofte i Apache, hvilket er at tilføje en ny lytter

Først Lad os se, hvad der er der i filen allerede

$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Tillader dig at binde Apache til specifikke IP-adresser og/eller38:# Ændre dette til Listen på specifikke IP-adresser som vist nedenfor til 41:#Listen 12.34.56.78:8042:Listen 80

her 42 er linjenummeret, og du kan se, at vi kun har én Listen-angivelse/direktiv fra nu af. For at få Apache til at lytte til 443 skal vi nu tilføje Listen 443 lige under Listen 80
Lad os se, hvordan man indsætter efter en linje ved hjælp af insertafter-parameteren.

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

Her kan du bemærke, at der ikke er nogen REGEX-parameter. Det er ikke nødvendigt, da insertafter-parameteren selv kan have søgestrengen med den regulære udtrykssyntaks

$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Tillader dig at binde Apache til specifikke IP-adresser og/eller38:# Ændre dette til Listen på specifikke IP-adresser som vist nedenfor til 41:#Listen 12.34.56.78:8042:Listen 8043:Listen 443

Hvis du bemærker linjenumrene i output, Du kan se, at Listen 443 er blevet tilføjet lige under Listen 80

Når der er flere poster af den søgende linje er til stede i filen. Den sidste matchede linje ville blive overvejet.

Eksempel6: Indsæt før en matchende linje ved hjælp af insertbefore parameter

For at teste insert before parameteren, Lad os tage den samme httpd.conf-fil som en basisfil, og denne gang vil vi opdatere ServerAdmin Email ID fra standard ServerAdmin til Server Admin

For nogen æ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: Din adresse, hvor problemer med serveren skal være87:ServerAdmin root@localhost

Men vi skal deaktivere/kommentere den eksisterende ServerAdmin-linje og tilføje en ny post, Her er playbooken til at udføre begge disse opgaver.

— – name: Eksempler på lineinfile hosts: web tasks: – name: “Example6: Comment the Exisiting ServerAdmin Line” become: yes become_user: root tags: lineinfileexample6_1 lineinfile: path: 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: path: /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf insertbefore: ‘# ServerAdmin .*’ line: “ServerAdmin ” state: present register: lineinfileexample6_2

Det forventede resultat ville være noget i retning af følgende.

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: Din adresse, hvor problemer med serveren skal være87:ServerAdmin [email protected]:# ServerAdmin root@localhost

Du kan se, at linje nummer 88 er blevet kommenteret, som var den ældre Server Admin og linje nummer 87 er vores nye ServerAdmin

Eksempel 7: Validér ændringerne før du gemmer/kommitterer

Dette er en dejlig funktion i Ansible lineinfile, som lader dig køre en shell-kommando for at validere, om den ændrede fil virkelig er OK, eller om der er nogen problemer. Da vores basisfil er en konfigurationsfil httpd.conf har den en vis syntaks, og hvis vi savner at overholde den, vil vi efterlade hele webstedet / infrastrukturen på spil.

Så lad os validere det, før vi gemmer filen.

Apache HTTPD-serveren har en kommando til at udføre Syntaks-tjek på httpd.conf-filen, som er httpd -t

Når den er påkaldt og uden syntaks-problemer. Den vil udskrive meddelelsen Syntax OK som angivet nedenfor og returnere en nul returkode, hvilket er det eneste, der betyder noget for Ansible. Ansible er afhængig af Validation Command’s Return Code.

$ httpd -t Syntax OK

Hvis den er NON-ZERO, vil ændringerne ikke blive overført, og opgaven vil mislykkes.

Her er playbook til at opdatere ServerName-direktivet i Apache.

--- - name: Eksempler på 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' linje: "ServerName www.middlewareinventory.com:80" state: present # Kommando til validering af konfigurationen og %s er en arbejdskopi af filen validate: "httpd -t -f %s"

Her er %s en arbejdskopi af den faktiske fil. Ansible ville altid kopiere filen og beholde den som en arbejdskopi og foretage ændringerne og til sidst kopiere den over til den destinerede placering og erstatte den oprindelige fil.

Quick Ad Hoc-kommando til validering

$ ansible web -m shell -a "grep -in ServerName /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>92:# ServerName angiver det navn og den port, som serveren bruger til at identificere sig selv.98:# #ServerName www.example.com:8099:ServerName www.middlewareinventory.com:80 

Du kan se, at ServerName-direktivet er blevet tilføjet.

Vi er nået til slutningen af artiklen.

Håber det hjælper

Rate denne artikel

Cheers
Sarav AK

Buy Me a Coffee at ko-fi.com

Følg os på Facebook eller TwitterFor flere praktiske videoer og vejledninger. Abonner på vores kanalFind mig på Linkedin Min profilFor enhver konsultation eller for at ansætte os Hvis du kan lide denne artikel. Vis din støtte! Køb mig en kaffe.

Signup for Exclusive “Subscriber-only” Content