Ansible lineinfile példák – Vonalak hozzáadása, módosítása, törlése, cseréje

  • 0

Az Ansible lineinfile modul lehet a nap megmentője, ha fájlokkal szeretnénk dolgozni, és különösen a tartalmukat menet közben módosítani, például egy új sor hozzáadása a fájlban, vagy egy sor frissítése a fájlban, vagy egy sor cseréje a fájlban, ha bizonyos szöveget talál, és még sok más.

lineinfile számos példával rendelkezik, és számos paramétert biztosít, hogy könnyedén elvégezhesse a feladatát. Ebben a bejegyzésben az ansible lineinfile modult fogjuk látni működés közben példákon keresztül.

ansible lineinfile példák

Tartalomjegyzék

Az Ansible lineinfile modul

Az ansible lineinfile modul akkor hasznos, ha egy fájlban egyetlen sort szeretnénk hozzáadni, eltávolítani, módosítani. A módosítás vagy eltávolítás előtt a reguláris kifejezések segítségével feltételeket is használhat a sorra való megfeleltetéshez. Az illesztett sort a back reference paraméter segítségével újra felhasználhatja és módosíthatja.

Tegyük fel, hogy az alábbi követelmények bármelyikével rendelkezik

  1. Egy sort szeretne hozzáadni, ha az még nincs benne.
  2. A port számát szeretné megváltoztatni a konfigurációs fájlban
  3. Az SSL-t szeretné letiltani, ha az SSL engedélyezve van
  4. Új bejegyzést szeretne hozzáadni az /etc/hosts fájlhoz
  5. Az /etc/hosts fájlban
  6. Új bejegyzést szeretne hozzáadni. frissíteni akarod a csomag verzióját, ha a telepített verzió megfelel a reguláris kifejezésednek
  7. Eltávolítani akarsz egy felhasználónevet az /etc/passwd fájlból a regex segítségével

Hope ez beállítja a kontextust. Mielőtt folytatnánk a példákkal Valamit ki kell emelni.

Az Ansible Lineinfile csak egy fájl egyetlen sorának megmunkálására használható. Ha több sort akarsz cserélni, próbáld ki a replace modult, vagy használd a blockinfile-t, ha egy sorblokkot akarsz beszúrni/frissíteni/eltávolítani egy fájlban.

Ha többet szeretnél megtudni az Ansible Replace modulról, akkor nézd meg ezt a bejegyzést.

Ansible replace line in file – Ansible Replace példák

Ansible lineinfile példák

Az ansible lineinfile különböző példáit gyűjtöttük össze itt. Ezeket a példákat ebben a bejegyzésben tárgyaltuk. választhatsz, hogy az összeset vagy bármelyik konkrét példát elolvasod.

  • Hitelesíti, hogy egy sor jelen van-e módosítás nélkül
  • Hitelesíti, hogy egy sor jelen van-e a fájlban, és hozzáadja, ha nem létezik
  • Replace a Line in a file If it is found with ansible lineinfile
  • Remove a line from a file fájlból, ha megtalálták – Az összes példány
  • Előtte a megfelelő sort az insertbefore paraméterrel
  • Előtte a megfelelő sor után az insertafter paraméterrel
  • Mentés előtt ellenőrizze a változások helyességét

1. példa:

Ez csak annak ellenőrzésére szolgál, hogy egy sor jelen van-e a fájlban módosítás nélkül

Ez csak annak ellenőrzésére szolgál, hogy egy sor jelen van-e a fájlban vagy sem. Nem módosítja a fájlt, függetlenül attól, hogy milyen eredményt kapunk. ez olyan, mintha a quick find parancsot futtatnánk

Az alábbi példa azt vizsgálja, hogy a “LogLevel debug” karakterlánc megtalálható-e a távoli apache webszerver httpd.conf fájljában.

Mint korábban említettük. Semmilyen lépést nem fogunk tenni

Ebben a példában azt fogjuk ellenőrizni, hogy a LogLevel Debug-e, és kiírjuk az üzenetet, hogy megvan-e vagy sem, és nem teszünk semmilyen lépést. Ezt a checkmode=yes

--- - name: Példák sorinfile 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 sor: /etc/httpd/conf/httpd.conf sor: /etc/httpd/conf/httpd.conf line: "LogLevel debug" state: present backup: yes check_mode: yes register: example1out

Ez a playbook ugyan jelentené, hogy történt egy változás a changed=1 jelöléssel, de ez nem végezne semmilyen módosítást a fájlon, mivel a feladatot Check módban futtattuk.

Itt a gyors ad-hoc parancs annak ellenőrzésére, hogy mi az aktuális LogLevel a távoli httpd.conf fájlban

$ ansible web -m shell -a "grep -i LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >># LogLevel: Az error_logba naplózott üzenetek számának szabályozása. logLevel warn

A lineinfile használata esetén ajánlott, hogy a playbookban mindig szerepeljen a backup: yes paraméter. Ez biztosítaná, hogy a fájlról biztonsági mentés készüljön, mielőtt bármilyen változtatásra kerülne sor. Ez segítene abban az esetben, ha vissza akarod tekerni.

Példa2: Ellenőrzi, hogy egy karakterlánc vagy sor jelen van-e a fájlban, és hozzáadja, ha nem létezik

Az imént látott playbookban, ha eltávolítjuk az ellenőrzési módot, akkor ez egy érvényes playbook lenne, amely keres egy sort, és hozzáadja, ha nem talál egyezést

De van egy probléma itt a sor, amit említesz, hogy hozzá kell adni, csak a fájl végén vagy az utolsó sorban lenne hozzáadva. Ezt az insert_before és insert_before direktívákkal lehet szabályozni, amelyekről a cikk későbbi részében lesz szó.

Most a 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 line: "LogLevel debug" state: present backup: yes register: example2out

Az eredmény egy érvénytelen konfigurációs fájl lenne, mivel a bejegyzés a fájl végére kerülne.

$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" mwiweb02 | CHANGED | rc=0 >>185:# LogLevel: Az error_logba naplózott üzenetek számának szabályozása.189:LogLevel warn354:LogLevel debug

Az Insert after és insert before segítségével szabályozható, amire később ebben a bejegyzésben még kitérünk.

Példa3:

A példa2-ben láttuk, hogyan lehet egy új sort hozzáadni a lineinfile modullal. Most azt fogjuk megnézni, hogyan cserélhetünk ki egy sort, ha egy Bizonyos sort találunk.

A cseréhez használhatjuk az ansible replace modult. A lineinfile modul is használható egy sor cseréjére.

Most ebben a példában a LogLevel debug-et LogLevel Debug-re fogjuk cserélni nagy D-vel

Az Ansible Lineinfile-t fogjuk használni a Regular Expressions-val egy sor keresésére, és a line elem tartalmazná a line argumentum tartaná a sort, amivel helyettesíteni szeretnénk

Nézze meg a következő Playbookot, és könnyen megértheti.

--- - 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 # A keresendő karakterlánc regexp: "LogLevel warn" # A cserélendő karakterlánc line: "LogLevel debug" state: present backup: yes register: example1out

A fájl eredménye valami ilyesmi lenne

$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>185:# LogLevel: Az error_logba naplózott üzenetek számának szabályozása. 189:LogLevel debug

Kicserélné az összes egyező sort? Mi van, ha egynél több találat van

Ha egynél több találat van a fájlban. Az Ansible Lineinfile csak az utolsó egyező vagy talált sort cserélné le.

Ha az összes előfordulást szeretné lecserélni, akkor nem a lineinfile, hanem a replace modul használatát kell megfontolnia.

4. példa: Egy sor eltávolítása a fájlból, ha megtalálható ( Minden példány )

Most szeretném eltávolítani a korábban hozzáadott LogLevel Debug sort, mivel rossz helyen van, és aLogLevel warn már jelen van ugyanabban a fájlban.

Itt van az ansible playbook a Line eltávolításához a fájlból, és itt használhatunk néhány reguláris kifejezést, hogy megtaláljuk mind a debug, mind a 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" # Az állapotot Absent-re állítjuk, hogy eltávolítsuk, ha a keresett sort megtaláljuk state: absent backup: yes register: example1out

Itt az állapot paramétert absent-re állítjuk, ami eltávolítja, ha a keresés sikeres. a line paramétert nem használjuk, mivel nincs rá szükség

Mint korábban említettük, ez eltávolítaná az összes megfelelő sort a fájlból, vagyis a Keresés sorának minden megjelenését.

5. példa: Beillesztés a megfelelő sor után az insertafter paraméter használatával

Mivel az Apache httpd.conf fájlt vettük alapfájlnak ebben a bejegyzésben, vegyünk néhány követelményt, amit gyakran szoktunk csinálni az Apache-ban, ami egy új listener hozzáadása

Először nézzük meg, mi van már a fájlban

$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Lehetővé teszi, hogy az Apache-t meghatározott IP-címekhez kössük és/vagy38:# Módosítsuk ezt Listen on specific IP-címekre, ahogy alább látható 41:#Listen 12.34.56.78:8042:Listen 80

itt 42 a sorszám és láthatjuk, hogy mostantól csak egy Listen utasításunk/irányelvünk van. Most ahhoz, hogy az Apache Listen a 443-at hallgassa, közvetlenül a Listen 80
alá Listen 443 kell beillesztenünk.Listen 80
Lássuk, hogyan kell beilleszteni néhány sor után az insertafter paraméter segítségével.

Itt van a playbook.

--- - név: Példák sorinfile hosts: web tasks: - név: "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

Itt látható, hogy nincs REGEX paraméter. Erre nincs is szükség, mivel az insertafter paraméter maga is lehet a kereső karakterlánc a Regular Expression Syntax

$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Lehetővé teszi, hogy az Apache-t meghatározott IP-címekhez kösse és/vagy38:# Módosítsa ezt Listen on specific IP-címekre az alábbiakban látható módon 41:#Listen 12.34.56.78:8042:Listen 8043:Listen 443

Ha észreveszi a sorszámokat a kimeneten, láthatja, hogy a Listen 443 közvetlenül a Listen 80

Ahol több bejegyzés van a kereső sor jelen van a fájlban. Az utolsó illeszkedő sort vennénk figyelembe.

Példa6: Beillesztés egy illeszkedő sor előtt az insertbefore paraméter használatával

Az insert before paraméter teszteléséhez vegyük ugyanazt a httpd.conf fájlt alapfájlnak, és ezúttal a ServerAdmin Email ID-t frissítjük az alapértelmezett ServerAdmin -ről

Minden módosítás elő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: A cím, ahol a szerverrel kapcsolatos problémákat kell87:ServerAdmin root@localhost

De ki kell kapcsolnunk/kommentálnunk a meglévő ServerAdmin sort és hozzá kell adnunk egy új bejegyzést, Itt van a playbook mindkét feladat elvégzéséhez.

--- - név: Példák lineinfile hostok: web feladatok: - név: "Example6: Comment the Exisiting ServerAdmin Line" become: yes become_user: root tags: lineinfileexample6_1 lineinfile: path: /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: /.conf insertbefore: '# ServerAdmin .*' line: "ServerAdmin " state: present register: lineinfileexample6_2

A várt eredmény a következő lenne.

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: Az Ön címe, ahol a szerverrel kapcsolatos problémáknak kell lennie87:ServerAdmin [email protected]:# ServerAdmin root@localhost

Láthatjuk, hogy a 88-as sorszámot kommentáltuk, ami a régebbi ServerAdmin volt, a 87-es sorszám pedig a mi új ServerAdminunk

7. példa: Validálja a módosításokat mentés/átvitel előtt

Ez az Ansible lineinfile egy szép funkciója, amely lehetővé teszi egy shell parancs futtatását annak ellenőrzésére, hogy a módosított fájl valóban rendben van-e vagy vannak-e problémák. Mivel az alapfájlunk egy konfigurációs fájl httpd.conf van némi szintaxis, és ha ezt nem tartjuk be, akkor az egész weboldalt/infra kockán hagyjuk.

Szóval validáljuk a fájl mentése előtt.

Apache HTTPD szerver rendelkezik egy paranccsal a httpd.conf fájl szintaxis ellenőrzésére, amely httpd -t

Ha meghívjuk és nincsenek szintaxis problémák. A parancs az alábbiakban megadott Syntax OK üzenetet írja ki, és egy nulla visszatérési kódot ad vissza, ami az Ansible számára csak ez számít. Az Ansible az érvényesítési parancs visszatérési kódjára támaszkodik.

$ httpd -t Syntax OK

Ha ez NEM NULLA, akkor a változások nem kerülnek rögzítésre és a feladat sikertelen lesz.

Itt a playbook az Apache ServerName irányelvének frissítésére.

--- - name: Példák 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" sor: "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"

Here the %s is the working copy of the actual file. Az Ansible mindig lemásolná a fájlt, és megtartaná munkamásolatként, majd elvégezné a módosításokat, végül átmásolná a Meghatározott helyre, és kicserélné az eredeti fájlt.

Gyors Ad Hoc parancs az érvényesítéshez

$ ansible web -m shell -a "grep -in ServerName /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>92:# A ServerName adja meg a szerver azonosítására használt nevet és portot.98:#ServerName www.example.com:8099:ServerName www.middlewareinventory.com:80 

Láthatod, hogy a ServerName direktíva hozzá lett adva.

A cikk végére értünk.

Remélem ez segít

Bíráld ezt a cikket

Cheers
Sarav AK

Vegyél nekem egy kávét a ko-fi.com

Kövessen minket a Facebookon vagy a Twitteren További praktikus videók és oktatóanyagokért. Iratkozzon fel csatornánkraTaláljon meg a Linkedin profilomonMindenféle konzultációért, vagy ha fel akar bérelni minket Ha tetszett ez a cikk. Mutasd meg a támogatásod! Vegyél nekem egy kávét.

Iratkozz fel az exkluzív “csak előfizetőknek szóló” tartalomra