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

  • 0

Ansible lineinfile module potrebbe essere il salvatore della tua giornata quando vuoi lavorare con i file e soprattutto modificare il loro contenuto in corsa, come aggiungere una nuova linea nel file o aggiornare una linea nel file o sostituire una linea nel file quando si trova un certo testo e molto altro.

lineinfile ha una serie di esempi e fornisce molti parametri per fare il vostro lavoro facilmente. In questo post, vedremo il modulo ansible lineinfile in azione con degli esempi.

esempi ansible lineinfile

Tabella del contenuto

Il modulo Ansible lineinfile

Il modulo ansible lineinfile è utile quando vuoi aggiungere, rimuovere, modificare una singola linea in un file. Puoi anche usare le condizioni per abbinare la linea prima di modificare o rimuovere usando le espressioni regolari. Puoi riutilizzare e modificare la linea abbinata usando il parametro back reference.

Considera di avere uno dei seguenti requisiti

  1. Vuoi aggiungere una linea quando non è già presente.
  2. Vuoi cambiare il numero di porta nel file di configurazione
  3. Vuoi disabilitare l’SSL quando l’SSL è abilitato
  4. Vuoi aggiungere una nuova voce nel file /etc/hosts
  5. Vuoi vuoi aggiornare la versione del pacchetto quando la versione installata corrisponde alla tua espressione regolare
  6. Vuoi rimuovere un nome utente dal file /etc/passwd usando una regex

Spero che questo definisca il contesto. Prima di procedere con gli esempi Qualcosa da evidenziare.

Ansible Lineinfile può essere usato solo per lavorare una singola linea in un file. Se vuoi sostituire più linee prova il modulo replace o usa blockinfile se vuoi inserire/aggiornare/rimuovere un blocco di linee in un file.

Se vuoi approfondire il modulo Ansible Replace puoi consultare questo post.

Ansible replace line in file – Ansible Replace Examples

Ansible lineinfile examples

Abbiamo raccolto qui vari esempi di ansible lineinfile. Questi sono esempi che abbiamo coperto in questo post. puoi scegliere di leggere tutti o qualsiasi esempio specifico.

  • Valida se una linea è presente senza alcuna modifica
  • Valida se una linea è presente nel file e aggiungila se non esiste
  • Sostituisci una linea in un file se viene trovata con ansible lineinfile
  • Rimuovi una linea dal Tutte le istanze
  • Inserire prima di una linea corrispondente usando il parametro insertbefore
  • Inserire dopo la linea corrispondente usando il parametro insertafter
  • Convalidare le modifiche prima di salvare

Esempio 1: Validare se una linea è presente nel file senza alcuna modifica

Questo è solo per validare se una linea è presente nel file o no. Non modificherà il file a prescindere da quale sia il risultato. questo è proprio come eseguire il comando quick find

L’esempio dato sotto è per trovare se la stringa “LogLevel debug” si trova o meno nel file httpd.conf del server web apache remoto.

Come detto prima. Non ci sarebbe nessuna azione intrapresa

In questo esempio stiamo per controllare se il LogLevel è Debug e stampare il messaggio Se c’è o no e non intraprendere alcuna azione. Questo viene fatto con l’aiuto di checkmode=yes

--- - nome: Esempi di lineinfile hosts: web tasks: - nome: "Esempio1: Valida se una stringa o una linea è presente nel file" become: yes become_user: root tags: example1 lineinfile: path: /etc/httpd/conf/httpd.conf line: "LogLevel debug" state: present backup: yes check_mode: yes register: example1out

Anche se questo playbook riporterebbe che c’è una modifica fatta segnandola come changed=1 ma questo non farebbe alcuna modifica sul file in quanto abbiamo eseguito il task in modalità Check.

Ecco il comando rapido ad-hoc per controllare qual è l’effettivo LogLevel nel file remoto httpd.conf

$ ansible web -m shell -a "grep -i LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >># LogLevel: Controlla il numero di messaggi registrati nell'error_log.LogLevel warn

Si raccomanda di avere sempre il parametro backup: yes nel tuo playbook quando usi il lineinfile. Questo assicurerebbe il backup del file prima di qualsiasi modifica. Questo aiuterebbe nel caso in cui tu voglia fare un rollback.

Esempio2: Valida se una stringa o una linea è presente nel file e aggiungila se non esiste

Nello stesso playbook, abbiamo appena visto che se rimuoviamo la modalità di controllo sarebbe un playbook valido che cerca una linea e la aggiunge quando non ci sono corrispondenze trovate

Ma c’è un problema qui la linea che stai menzionando per essere aggiunta verrebbe aggiunta solo alla Fine del file o Ultima linea. Questo può essere controllato con le direttive insert_before e insert_before che saranno discusse più avanti in questo articolo.

Ora il playbook

--- - nome: Esempi di lineinfile hosts: web tasks: - nome: "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

Il risultato di questo risulterebbe in un file di configurazione non valido poiché la voce verrebbe aggiunta alla fine del file.

$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" mwiweb02 | CHANGED | rc=0 >>185:# LogLevel: Controlla il numero di messaggi registrati nell'error_log.189:LogLevel warn354:LogLevel debug

Che può essere controllato con Insert after e insert before che vedremo più avanti in questo post.

Example3: Sostituire una linea in un file con ansible lineinfile.

Nell’esempio2 abbiamo visto come aggiungere una nuova linea con il modulo lineinfile. Ora vedremo come sostituire una linea quando viene trovata una linea certa.

Anche se è possibile utilizzare il modulo ansible replace per sostituire. Anche il modulo Lineinfile può essere usato per sostituire una linea.

Ora in questo esempio, cambieremo il LogLevel debug in LogLevel Debug con una D maiuscola

Utilizzeremo Ansible Lineinfile con Regular Expressions per cercare una linea e l’elemento line conterrà l’argomento line che conterrà la linea da sostituire

Guarda il seguente Playbook e potrai facilmente capirlo.

--- - nome: Esempi di lineinfile host: web task: - nome: "Esempio1: Valida se una stringa o una linea è presente nel file" become: yes become_user: root tags: example1 lineinfile: path: /etc/httpd/conf/httpd.conf # La stringa da cercare regexp: "LogLevel warn" # La stringa da sostituire line: "LogLevel debug" stato: presente backup: sì registro: example1out

Il risultato del file sarebbe qualcosa come questo

$ ansible web -m shell -a "grep -in LogLevel /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>185:# LogLevel: Controlla il numero di messaggi registrati nell'error_log.189:LogLevel debug

Sostituirebbe tutte le linee corrispondenti? Cosa succede se ci sono più di una corrispondenza

Se ci sono più di una corrispondenza nel file. Ansible Lineinfile sostituirebbe solo l’ultima linea che corrisponde o che è stata trovata.

Se vuoi sostituire tutte le occorrenze, devi considerare di usare il modulo replace e non lineinfile.

Esempio 4: Rimuovere una linea dal file, se viene trovata (tutte le istanze)

Ora voglio rimuovere la linea LogLevel Debug che abbiamo aggiunto prima perché è nel posto sbagliato e inoltre abbiamo già ilLogLevel warn presente nello stesso file.

Ecco il playbook di ansible per rimuovere la linea dal file e possiamo usare alcune espressioni regolari qui per trovare sia debug che Debug

--- - nome: Esempi di lineinfile hosts: web tasks: - nome: "Esempio1: Valida se una stringa o una linea è presente nel file" become: yes become_user: root tags: example1 lineinfile: path: /etc/httpd/conf/httpd.conf # Stringa da cercare regexp: "LogLevel ebug" # State è impostato su Absent per rimuovere se la linea di ricerca viene trovata state: absent backup: yes register: example1out

Qui stiamo impostando il parametro state come absent che rimuoverà se la ricerca ha successo. il parametro line non è usato perché non è necessario

Come detto prima, questo rimuoverà tutte le linee corrispondenti dal file, in altre parole, tutto l’aspetto di una linea di ricerca.

Esempio5: Inserire dopo una linea corrispondente usando il parametro insertafter

Siccome abbiamo preso il file Apache httpd.conf come nostro file di base in questo post, prendiamo qualche requisito che siamo soliti fare spesso in Apache, ovvero aggiungere un nuovo listener

Prima vediamo cosa c’è già nel file

$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Permette di legare Apache a specifici indirizzi IP e/o38:# Cambia questo in Listen su specifici indirizzi IP come mostrato sotto a 41:#Listen 12.34.56.78:8042:Listen 80

qui 42 è il numero di linea e puoi vedere che abbiamo solo una dichiarazione/direttiva Listen per ora. Ora per far sì che Apache ascolti 443 dobbiamo aggiungere Listen 443 proprio sotto il Listen 80
Vediamo come inserire dopo qualche linea usando il parametro insertafter.

Ecco il playbook.

--- - nome: Esempi di lineinfile hosts: web tasks: - nome: "Example1: Valida se una stringa o una linea è presente nel file" become: yes become_user: root tags: lineinfileexample lineinfile: path: /etc/httpd/conf/httpd.conf insertafter: "^Listen +" linea: "Listen 443" firstmatch: yes state: present register: lineinfileexample

Qui potete notare che non c’è nessun parametro REGEX. Non è necessario in quanto il parametro insertafter stesso può avere la stringa di ricerca con la sintassi dell’espressione regolare

$ ansible web -m shell -a "grep -in Listen /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>34:# Listen: Permette di legare Apache a specifici indirizzi IP e/o38:# Cambia questo in Listen su specifici indirizzi IP come mostrato sotto a 41:#Listen 12.34.56.78:8042:Listen 8043:Listen 443

Se noti i numeri di linea nell’output, puoi vedere che il Listen 443 è stato aggiunto proprio sotto il Listen 80

Quando ci sono più voci della linea di ricerca è presente nel file. L’ultima linea corrispondente verrebbe considerata.

Esempio6: Inserire prima di una linea corrispondente usando il parametro insertbefore

Per provare il parametro insert before, prendiamo lo stesso file httpd.conf come file di base e questa volta aggiorneremo il ServerAdmin ID Email dal default ServerAdmin a Server Admin

Prima di qualsiasi modifica

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: Il tuo indirizzo, dove dovrebbero esserci problemi con il server87:ServerAdmin root@localhost

Ma abbiamo bisogno di disabilitare/commentare la linea esistente di ServerAdmin e aggiungere una nuova voce, ecco il playbook per fare entrambi questi compiti.

--- - nome: Esempi di lineinfile hosts: web tasks: - nome: "Example6: Comment the Exisiting ServerAdmin Line" become: 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 " stato: presente registro: lineinfileexample6_2

Il risultato atteso sarebbe qualcosa come segue.

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: Il tuo indirizzo, dove dovrebbero esserci problemi con il server87:ServerAdmin [email protected]:# ServerAdmin root@localhost

Puoi vedere che la linea numero 88 è stata commentata che era il vecchio Server Admin e la linea numero 87 è il nostro nuovo ServerAdmin

Esempio 7: Convalidare le modifiche prima di salvare/commettere

Questa è una bella caratteristica di Ansible lineinfile che ti permetterà di eseguire un comando shell per convalidare se il file modificato è veramente OK o se ci sono dei problemi. Dal momento che il nostro file di base è un file di configurazione httpd.conf ha una certa sintassi e se manchiamo di aderirvi, lasceremo l’intero sito web/infra in gioco.

Quindi convalidiamolo prima di salvare il file.

Il server HTTPD Apache ha un comando per eseguire il controllo della sintassi sul file httpd.conf che è httpd -t

Quando invocato e senza problemi di sintassi. Stamperebbe il messaggio Syntax OK come indicato di seguito e restituirebbe uno Zero Return Code che è tutto ciò che conta per Ansible. Ansible si basa sul codice di ritorno del comando di convalida.

$ httpd -t Syntax OK

Se è NON-ZERO le modifiche non saranno commesse e il compito fallirà.

Ecco il playbook per aggiornare la direttiva ServerName di Apache.

--- - nome: Esempi di lineinfile hosts: web tasks: - nome: "Example7: Update the ServerName" become: yes become_user: root lineinfile: path: /etc/httpd/conf/httpd.conf insertafter: '#ServerName www.example.com:80' line: "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"

Qui il %s è la copia di lavoro del file attuale. Ansible copierebbe sempre il file e lo terrebbe come copia di lavoro e farebbe le modifiche e infine lo copierebbe nella posizione di destinazione e sostituirebbe il file originale.

Quick Ad Hoc command to validate

$ ansible web -m shell -a "grep -in ServerName /etc/httpd/conf/httpd.conf" -i ansible_hostsmwiweb02 | CHANGED | rc=0 >>92:# ServerName dà il nome e la porta che il server usa per identificarsi.98:#ServerName www.example.com:8099:ServerName www.middlewareinventory.com:80 

Puoi vedere che la direttiva ServerName è stata aggiunta.

Siamo arrivati alla fine dell’articolo.

Spero che aiuti

Voti questo articolo

Cheers
Sarav AK

Comprami un caffè a ko-fi.com

Seguiteci su Facebook o TwitterPer altri video pratici e tutorial. Iscriviti al nostro canaleTrovami su Linkedin Il mio profiloPer qualsiasi consultazione o per assumerci Se ti piace questo articolo. Mostra il tuo sostegno! Comprami un caffè.

Abbonati per contenuti esclusivi “solo per abbonati”