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.
Indholdsfortegnelse
- Ansible lineinfile modulet
- Ansible lineinfile examples
- Eksempel 1: Validér, om en linje er til stede i filen uden nogen ændring
- Eksempel2: Validér, om en streng eller linje er til stede i filen og tilføj, hvis den ikke findes
- 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.
- Vil den erstatte alle de matchende linjer? Hvad hvis der er mere end én matchning
- Eksempel 4: Fjern en linje fra filen, hvis den er fundet ( Alle forekomster )
- Eksempel5: Indsæt efter en matchende linje ved hjælp af insertafter-parameteren
- Eksempel6: Indsæt før en matchende linje ved hjælp af insertbefore parameter
- Eksempel 7: Validér ændringerne før du gemmer/kommitterer
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
- Du ønsker at tilføje en linje, når den ikke allerede er til stede.
- Du ønsker at ændre portnummeret i konfigurationsfilen
- Du ønsker at deaktivere SSL, når SSL er aktiveret
- Du ønsker at tilføje en ny post i filen /etc/hosts
- Du ønsker at opgradere pakkeversionen, når den installerede version matcher dit regulære udtryk
- 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
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