Il modulo Ansible lineinfile può essere usato per inserire una linea, modificare una linea esistente, rimuovere una linea esistente o sostituire una linea.
Inserimento di una linea
Primo, vedremo come scrivere una linea in un file, se non è presente.
Possiamo impostare il percorso del file da modificare usando il parametro path(>Ansible 2.3)/dest. E imposteremo la riga da inserire usando il parametro line.
L’esempio seguente scriverà la riga ‘Inserire una riga in un file’ nel file ‘remote_server.txt’. La nuova linea sarà aggiunta all’EOF. Se la linea esiste già, allora non sarà aggiunta.
La nuova linea sarà aggiunta all’EOF. Se la linea esiste già, allora non sarà aggiunta.
Abbiamo anche impostato il parametro create, che dice che se il file non è presente allora crea un nuovo file. Il valore predefinito per lo stato è presente. Ma lo aggiungo comunque per chiarezza.
Il valore predefinito per lo stato è presente. Ma lo aggiungo comunque per chiarezza.
- hosts: loc tasks: - name: Ansible insert lineinfile example lineinfile: dest: /home/mdtutorials2/remote_server.txt line: Inserting a line in a file. state: present create: yes
Issue1:
Se ottieni il seguente errore,
lineinfile unsupported parameter for module: path
È probabilmente dovuto al problema con il parametro path. Fino ad ansible 2.3 questo parametro era ‘dest’. Quindi se la tua versione di ansible è inferiore alla 2.3, allora cambia il parametro in ‘dest’. Dovrebbe risolvere il problema.
Il problema 2:
Se il file di destinazione non esiste, allora Ansible lancerebbe un errore come sotto. Puoi assicurarti che il file esista nel file remoto o puoi impostare il parametro ‘create’ su yes per risolvere questo problema.
Destinazione /home/mdtutorials2/hello.txt non esiste
Inserimento di una nuova linea dopo/prima di un pattern
Non vogliamo sempre che la linea sia inserita all’EOF. Il modulo lineinfile dà la possibilità di inserire la linea dopo un modello o prima di un modello. Possiamo usare i parametri insertafter e insertbefore rispettivamente per questo.
Nell’esempio seguente, voglio inserire la linea prima della linea ” nel file ansible.cfg. Ho fatto l’escape dei ” poiché sono caratteri speciali regex.
- name: Ansible lineinfile insert after example lineinfile: dest: /etc/ansible/ansible.cfg line: 'inventory = /home/fedora/inventory.ini' insertafter: '\'
Se hai bisogno di inserire una linea prima di un modello, puoi usare il parametro insertbefore. Il seguente esempio inserirà la linea prima del pattern ‘#library’ in ansible.cfg.
- name: Ansible lineinfile insertbefore example lineinfile: dest: /etc/ansible/ansible.cfg line: 'inventory = /home/mdtutorials/inventory.ini' insertbefore: '#library'
Rimuovere una linea
Puoi impostare il parametro state su absent, per rimuovere le linee specificate. Tutte le occorrenze di quella linea saranno rimosse.
- hosts: loc tasks: - name: Ansible lineinfile remove line example lineinfile: dest: /home/mdtutorials2/remote_server.txt line: Removed lines. state: absent
Rimozione di una linea usando Ansible regexp
Puoi anche specificare una regexp per rimuovere una linea. Così si può dire di rimuovere tutte le linee che iniziano con la parola ‘ciao’ ecc.
Diamo l’espressione regolare usando il parametro regexp di lineinfile. L’esempio seguente rimuoverà tutte le linee che iniziano con DevOps.
- hosts: loc tasks: - name: Ansible lineinfile regexp example lineinfile: dest: /home/mdtutorials2/remote_server.txt regexp: '^DevOps' state: absent
Rimuovere/modificare una linea usando Regex
Per modificare una linea dobbiamo usare il parametro Ansible backrefs insieme al parametro regexp. Questo dovrebbe essere usato con state=present.
Se la regexp non corrisponde a nessuna linea, allora il file non viene modificato. Se la regexp corrisponde a una o più righe, allora l’ultima riga trovata sarà sostituita. Inoltre, gli elementi raggruppati nella regexp sono popolati e possono essere usati per la modifica.
Nell’esempio seguente stiamo commentando una linea. La linea completa viene catturata mettendola all’interno della parentesi a ‘\1’. Il ‘#\1’ sostituisce la linea con ‘#’ seguito da ciò che è stato catturato.
Puoi avere più catture e chiamarle usando ‘\1’, ‘\2’, ‘\3’ ecc. Se hai bisogno di ulteriori informazioni sul raggruppamento, fai riferimento a regular-expression.info.
Commentare una linea con Ansible lineinfile backrefs
- name: Ansible lineinfile regexp replace example lineinfile: dest: /etc/ansible/ansible.cfg regexp: '(inventory = /home/fedora/inventory.ini.*)' line: '#' backrefs: yes
Scommentare la linea con lineinfile regexp
- name: Ansible lineinfile backrefs example lineinfile: dest: /etc/ansible/ansible.cfg regexp: '#(inventory = /home/fedora/inventory.ini.*)' line: '' backrefs: yes
Possiamo scommentare la stessa linea con piccole modifiche. Qui sto mettendo la linea commentata con il ‘#’ fuori dal raggruppamento. Così ora solo la parte dopo il ‘#’ viene catturata in \1. E dopo aver eseguito lo script, puoi vedere che la linea è scomposta.
Lineinfile linee multiple
Questa sezione è per la sostituzione di più compiti lineinfile con un singolo compito e with_items. Se la tua intenzione è quella di aggiungere più linee ad un file, dovresti usare il modulo blockinfile.
Puoi usare with_items per fare un ciclo attraverso una lista di hash. Puoi specificare il dest, la linea, la regexp ecc. per ogni compito nella lista. Fondamentalmente, puoi usarlo invece di scrivere più task.
L’esempio seguente cambierà due file: ansible.cfg e remote_server.txt.
- hosts: loc tasks: - name: Ansible lineinfile multiple lines with_items example lineinfile: dest: "{{ item.dest }}" regexp: "{{ item.regexp }}" line: "{{ item.line }}" backrefs: yes with_items: - {dest: '/etc/ansible/ansible.cfg', regexp: 'config file for ansible', line: 'line changed'} - {dest: '/home/dinoopblogger/remote_server.txt', regexp: 'hello', line: 'world'}