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

  • 0

Modul Ansible lineinfile by vám mohl zachránit den, pokud chcete pracovat se soubory a zejména upravovat jejich obsah za běhu, jako je přidání nového řádku do souboru nebo aktualizace řádku v souboru nebo nahrazení řádku v souboru při nalezení určitého textu a mnoho dalšího.

lineinfile má různou sadu příkladů a poskytuje mnoho parametrů, které vám usnadní práci. V tomto příspěvku si na příkladech ukážeme modul ansible lineinfile v akci.

příklady modulu ansible lineinfile

Obsah

Modul ansible lineinfile

Modul ansible lineinfile je užitečný, když chcete přidat, odebrat nebo změnit jeden řádek v souboru. Můžete také použít podmínky pro porovnání řádku před úpravou nebo odstraněním pomocí regulárních výrazů. Shodný řádek můžete znovu použít a upravit pomocí parametru zpětného odkazu.

Považte, že máte některý z následujících požadavků

  1. Chcete přidat řádek, pokud ještě není přítomen.
  2. Chcete změnit číslo portu v konfiguračním souboru
  3. Chcete zakázat protokol SSL, když je povolen
  4. Chcete přidat nový záznam do souboru /etc/hosts
  5. Chcete přidat nový záznam do souboru /etc/hosts
  6. Chcete zakázat protokol SSL, když je povolen. chcete aktualizovat verzi balíčku, když nainstalovaná verze odpovídá vašemu regulárnímu výrazu
  7. Chcete odstranit uživatelské jméno ze souboru /etc/passwd pomocí regexu

Snad to nastaví kontext. Než budeme pokračovat v příkladech Něco je třeba zdůraznit.

Ansible Lineinfile lze použít pouze pro práci s jedním řádkem v souboru. Pokud chcete nahradit více řádků, zkuste modul replace nebo použijte modul blockinfile, pokud chcete vložit/aktualizovat/odstranit blok řádků v souboru.

Pokud chcete prozkoumat více o modulu Ansible Replace, můžete se podívat na tento příspěvek.

Ansible replace line in file – Ansible Replace Examples

Příklady modulu ansible lineinfile

Shromáždili jsme zde různé příklady modulu ansible lineinfile. Těmito příklady jsme se zabývali v tomto příspěvku. můžete si vybrat, zda si chcete přečíst všechny nebo některý konkrétní příklad.

  • Ověřit, zda je řádek přítomen bez jakékoli úpravy
  • Ověřit, zda je řádek v souboru přítomen, a přidat, pokud neexistuje
  • Nahradit řádek v souboru, pokud je nalezen pomocí ansible lineinfile
  • Odstranit řádek ze souboru. souboru, pokud je nalezen – Všechny instance
  • Vložit před odpovídající řádek pomocí parametru insertbefore
  • Vložit za odpovídající řádek pomocí parametru insertafter
  • Ověřit správnost změn před uložením

Příklad 1: Ověřte, zda je řádek v souboru přítomen bez jakýchkoli změn

Toto je pouze ověření, zda je řádek v souboru přítomen či nikoli. Soubor se nijak nemodifikuje bez ohledu na to, jaký je výsledek. je to jen jako spuštění rychlého příkazu find

Níže uvedený příklad slouží ke zjištění, zda se v souboru httpd.conf vzdáleného webového serveru apache nachází řetězec „LogLevel debug“.

Jak již bylo uvedeno. Nebyla by provedena žádná akce

V tomto příkladu budeme kontrolovat, zda je LogLevel Debug, a vypíšeme zprávu Pokud tam je nebo není, a neprovedeme žádnou akci. To se provádí pomocí checkmode=yes

--- - název: Examples of lineinfile hosts: web tasks: - název: "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 řádek: "LogLevel debug" stav: present backup: yes check_mode: yes register: example1out

Tento playbook by sice ohlásil, že byla provedena změna tím, že by ji označil jako changed=1, ale neprovedl by žádnou změnu v souboru, protože jsme úlohu spustili v režimu Check.

Tady je rychlý ad-hoc příkaz pro kontrolu, jaká je aktuální LogLevel ve vzdáleném souboru httpd.conf

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

Při použití souboru lineinfile se doporučuje mít v playbooku vždy parametr backup: yes. Tím byste se ujistili, že je soubor zálohován před provedením jakýchkoli změn. Pomohlo by to v případě, že byste chtěli vrátit soubor zpět.

Příklad2: Ověřit, zda je v souboru přítomen řetězec nebo řádek, a přidat jej, pokud neexistuje

V tomtéž playbooku, který jsme právě viděli, pokud odstraníme kontrolní režim, by byl platný playbook, který vyhledá řádek a přidá jej, pokud není nalezena žádná shoda

Ale je zde problém, řádek, o kterém se zmiňujete, že má být přidán, by byl přidán pouze na konec souboru nebo na poslední řádek. To lze řídit pomocí direktiv insert_before a insert_before, o kterých bude řeč později v tomto článku.

Nyní playbook

--- - název: Examples of lineinfile hosts: web tasks: - název: "Example2: Add the line if it does not exist" become: yes become_user: root tags: example2 lineinfile: path: /etc/httpd/conf/httpd.conf řádek: " 
$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" mwiweb02 | CHANGED | rc=0 >>185:# LogLevel: 189:LogLevel warn354:LogLevel debug

Který lze ovládat pomocí Insert after a Insert before, které si ukážeme později v tomto příspěvku.

Příklad3:

V příkladu2 jsme viděli, jak přidat nový řádek pomocí modulu lineinfile. Nyní se podíváme, jak nahradit řádek při nalezení určitého řádku.

Pro nahrazení můžete použít modul ansible replace. K nahrazení řádku lze použít také modul Lineinfile.

Nyní v tomto příkladu změníme LogLevel debug na LogLevel Debug s velkým D

Pro vyhledání řádku použijeme modul Ansible Lineinfile s Regular Expressions a prvek line by obsahoval argument line by obsahoval řádek, který se má nahradit

Podívejte se na následující Playbook a snadno to pochopíte.

--- - název: Examples of lineinfile hosts: web tasks: - název: "Example1: Validate if a String or line is present in the file" become: yes become_user: root tags: example1 lineinfile: path: # Řetězec, který se má hledat regexp: "LogLevel warn" # Řetězec, který se má nahradit line: "LogLevel debug" stav: přítomno zálohování: ano registr: example1out

Výsledek souboru by vypadal nějak takto

$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>185:# LogLevel: Řídí počet zpráv zaznamenávaných do error_log.189:LogLevel debug

Chce to nahradit všechny odpovídající řádky? Co když je v souboru více než jedna shoda

Pokud je v souboru více než jedna shoda. Ansible Lineinfile by nahradil pouze poslední shodný nebo nalezený řádek.

Pokud chcete nahradit všechny výskyty, musíte zvážit použití modulu replace a ne lineinfile.

Příklad 4: Odstranění řádku ze souboru, pokud je nalezen ( Všechny výskyty )

Nyní chci odstranit řádek LogLevel Debug, který jsme přidali dříve, protože je na špatném místě a také již máme ve stejném souboru přítomný řádekLogLevel warn.

Tady je ansible playbook pro odstranění řádku ze souboru a můžeme zde použít některé regulární výrazy, abychom našli jak debug, tak Debug

--- - název: Examples of lineinfile hosts: web tasks: - název: "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

Zde nastavujeme parametr state jako absent, který se odstraní, pokud je hledání úspěšné. parametr line se nepoužívá, protože není nutný

Jak již bylo zmíněno, odstranily by se tím všechny odpovídající řádky ze souboru, jinými slovy veškerý výskyt Hledaného řádku.

Příklad5: Vložení za odpovídající řádek pomocí parametru insertafter

Protože jsme vzali Apache httpd.conf soubor jako náš základní soubor v tomto příspěvku, vezměme si nějaký požadavek, který jsme v Apache často dělali, což je přidání nového posluchače

Nejprve se podívejme, co už v souboru je

$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Umožňuje vázat Apache na konkrétní IP adresy a/nebo38:# Změňte to na Listen na konkrétních IP adresách, jak je uvedeno níže na 41:#Listen 12.34.56.78:8042:Listen 80

zde 42 je číslo řádku a můžete vidět, že máme zatím pouze jeden příkaz/příkaz Listen. Nyní, aby Apache naslouchal na 443, musíme přidat Listen 443 přímo pod Listen 80
Podívejme se, jak vložit za nějaký řádek pomocí parametru insertafter.

Tady je playbook.

--- - název: Příklady řádkuinfile hosts: web tasks: - název: "Example1: Ověřte, zda je v souboru přítomen řetězec nebo řádek" become: yes become_user: root tags: lineinfileexample lineinfile: path: /etc/httpd/conf/httpd.conf insertafter: "^Listen +" řádek: "Zde si můžete všimnout, že zde není žádný parametr REGEX. Není potřeba, protože samotný parametr insertafter může mít vyhledávací řetězec se syntaxí regulárního výrazu 
$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Umožňuje vázat Apache na konkrétní IP adresy a/nebo38:# Změňte toto na Listen on specific IP addresses, jak je uvedeno níže na 41:#Listen 12.34.56.78:8042:Listen 8043:Listen 443

Pokud si všimnete čísel řádků ve výstupu, můžete vidět, že Listen 443 byl přidán hned pod Listen 80

Pokud je v souboru přítomno více záznamů vyhledávacího řádku. V úvahu by se bral poslední odpovídající řádek.

Příklad6: Vložení před odpovídající řádek pomocí parametru insertbefore

Pro otestování parametru insert before vezměme stejný httpd.conf jako základní soubor a tentokrát budeme aktualizovat ServerAdmin ID e-mailu z výchozího ServerAdmin na Server Admin

Před úpravou

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: Vaše adresa, kde by měly být problémy se serverem87:ServerAdmin root@localhost

Ale potřebujeme zakázat/komentovat existující řádek ServerAdmin a přidat nový záznam, Zde je playbook pro provedení obou těchto úkolů.

--- - název: Examples of lineinfile hosts: web úkoly: - název: "Example6: Comment the Exisiting ServerAdmin Line" become: yes become_user: root tagy: lineinfileexample6_1 lineinfile: path: /Název: "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 .*' řádek: Očekávaný výsledek by vypadal takto: "ServerAdmin " stav: přítomný registr: lineinfileexample6_2

Očekávaný výsledek by vypadal takto.

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: Vaše adresa, kde by měly být problémy se serverem87:ServerAdmin [email protected]:# ServerAdmin root@localhost

Vidíte, že řádek číslo 88 byl zakomentován, což byl starší ServerAdmin, a řádek číslo 87 je náš nový ServerAdmin

Příklad 7: Ověření změn před uložením/odesláním

Jedná se o pěknou funkci Ansible lineinfile, která vám umožní spustit příkaz shellu pro ověření, zda je upravený soubor opravdu v pořádku, nebo zda jsou nějaké problémy. Protože náš základní soubor je konfigurační soubor httpd.conf, má určitou syntaxi, a pokud ji nedodržíme, necháme v sázce celý web/infra.

Před uložením souboru jej tedy ověříme.

Server HTTPD od Apache má příkaz pro provedení kontroly syntaxe souboru httpd.conf, který je httpd -t

Při vyvolání a bez problémů se syntaxí. Vypíše zprávu Syntax OK, jak je uvedeno níže, a vrátí nulový návratový kód, což je vše, na čem Ansible záleží. Ansible se spoléhá na návratový kód příkazu Validation.

$ httpd -t Syntax OK

Pokud by byl NULOVÝ, změny by nebyly odevzdány a úloha by selhala.

Tady je playbook pro aktualizaci směrnice ServerName Apache.

--- - název: Examples of lineinfile hosts: web tasks: - název: "Example7: Update the ServerName" become: yes become_user: root lineinfile: path: /etc/httpd/conf/httpd.conf insertafter: '#ServerName www.example.com:80' řádek: "ServerName www.middlewareinventory.com:80" state: present # Příkaz pro ověření konfigurace a %s je pracovní kopie souboru validate: "httpd -t -f %s"

Zde %s je pracovní kopie aktuálního souboru. Ansible by vždy zkopíroval soubor a ponechal ho jako pracovní kopii a provedl změny a nakonec ho překopíroval do určeného umístění a nahradil původní soubor.

Rychlý ad hoc příkaz pro ověření

$ ansible web -m shell -a "grep -in ServerName /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>92:# ServerName udává jméno a port, které server používá ke své identifikaci. 98:#ServerName www.example.com:8099:ServerName www.middlewareinventory.com:80 

Vidíte, že byla přidána direktiva ServerName.

Dospěli jsme ke konci článku.

Doufám, že vám to pomohlo

Ohodnoťte tento článek

Zdraví
Sarav AK

Kupte mi kávu na ko-fi.com

Sledujte nás na Facebooku nebo TwitteruPro více praktických videí a návodů. Přihlaste se k odběru našeho kanáluNajdete mě na Linkedin Můj profilPro jakoukoli konzultaci nebo pronajmutí Pokud se vám tento článek líbí. Vyjádřete mu svou podporu! Kupte mi kávu.

Přihlaste se k odběru exkluzivního obsahu "pouze pro předplatitele"

.