Come utilizzare il modulo Ansible lineinfile per gestire i file di testo

Ansible è uno strumento di automazione ampiamente utilizzato che può gestire centinaia di nodi in una sola operazione. Ansible ha molte caratteristiche eccellenti, e una di esse è la sua capacità di gestire una singola linea all’interno di un file su nodi remoti utilizzando il modulo lineinfile di Ansible.

Il modulo lineinfile di Ansible è un modulo che esegue varie azioni su una singola linea in un file, come la sostituzione di una linea, l’aggiornamento di una linea o l’aggiunta di una particolare linea.

In questo tutorial, imparerai cos’è il modulo lineinfile di Ansible, come funziona e come usarlo per gestire file di testo.

Prerequisiti

Questo post sarà un tutorial passo dopo passo sul modulo lineinfile di Ansible. Se desideri seguirci, assicurati di avere quanto segue:

  • A remote computer to run commands. You’ll need an inventory file set up and one or more hosts already configured to run Ansible command and playbooks on. The remote Linux computer will be called myserver, and the tutorial will use an inventory group called web.
  • Apache dovrebbe già essere installato sul computer remoto se vuoi seguire il tutorial esattamente.

Modificare un file di testo con il modulo lineinfile di Ansible.

Cominciamo questo tutorial eseguendo il modulo lineinfile di Ansible utilizzando i comandi ad hoc. I comandi ad hoc sono un modo rapido per testare o eseguire un singolo comando su un host remoto.

Accedi al tuo controller Ansible ed esegui il seguente comando. Questo comando utilizza il modulo lineinfile (-m) per connettersi alla macchina web e passare un argomento (-a) che è il comando da eseguire.

In questo caso, il modulo lineinfile aggiorna l’entry localhost mappando l’indirizzo IP 127.0.0.1 con myapache nel file /etc/hosts. Mappando il 127.0.0.1 con myapache ti permette di navigare localmente sulla pagina di test di Apache su HTTP://myapache:80

  • path indica la posizione del file.
  • regexp trova l’espressione regolare, se presente, nel file e aggiorna con 127.0.0.1 myapache specificato nel parametro line.
  • –diventa flag ti permette di eseguire il comando come utente privilegiato.
  • Il web è il gruppo di inventario che è una collezione di tutti i server.
  • ansible.builtin.lineinfile o semplicemente lineinfile è il nome del modulo.
ansible web -m ansible.builtin.lineinfile -a "path=/etc/hosts regexp='^127\.0\.0\.1'  line='127.0.0.1 myapache' state=present" --become

Dopo aver eseguito il comando, dovresti vedere un messaggio CAMBIATO che conferma che la riga è stata aggiornata con successo sull’host remoto.

Running the ad hoc command with ansible lineinfile module

Accedi al nodo remoto utilizzando un client SSH e verifica se il file /etc/hosts è stato aggiornato con il nuovo valore utilizzando il comando cat.

Come puoi vedere di seguito, l’entry di localhost è stata aggiornata con successo con 127.0.0.1 myapache sulla macchina remota.

Verifying the host file on remote machine

Modificare più file di testo all’interno di un playbook

Lavorare con un singolo comando ad hoc per gestire le righe su una macchina remota può andare bene, ma sarà difficile se hai righe in più file o più righe in un file da gestire. Invece di utilizzare comandi ad hoc, considera l’utilizzo del modulo lineinfile di Ansible all’interno del playbook utilizzando il comando ansible-playbook.

Ora, impariamo come utilizzare il modulo lineinfile di Ansible all’interno del playbook e modificare alcune righe.

Assumendo che tu sia già connesso all’host del controller di Ansible:

1. Crea una directory chiamata ansible_lineinfile_module_demo nella tua directory home. Questa directory conterrà il playbook che utilizzerai per invocare il modulo lineinfile.

mkdir ~/ansible_lineinfile_module_demo
cd ~/ansible_lineinfile_module_demo

2. Crea un altro file chiamato my_playbook.yml nella directory ~/ansible_lineinfile_module_demo e incolla il seguente contenuto del playbook YAML. Questo playbook ha più task che utilizzano il modulo Ansible lineinfile per gestire le righe di diversi file di configurazione per Apache sulla macchina remota.

Il playbook qui di seguito contiene i seguenti task:

1. Verifica se ADMIN è presente nel file /etc/sudoers; se non lo trova, il task lo aggiunge.

2. Assicura che l’Apache predefinito stia ascoltando sulla porta 8080 nel file /etc/apache2/ports.conf; se trova un’altra riga di porta, il modulo lineinfile la aggiorna alla porta 8080. Allo stesso modo, nel file /etc/apache2/apache2.conf, aggiorna MaxKeepAliveRequests a 1000 e KeepAliveTimeout a 100.

3. Aggiunge la riga con il testo “Hello This is my Apache Page” alla fine della pagina index.html sul server remoto nella directory /var/www/html.

I playbook di Ansible sono scritti in formato YAML. Per saperne di più su YAML, clicca qui

---
- name: Ansible lineinfile module example
# Definizione del server remoto dove il modulo lineinfile di Ansible avrà effetto
  hosts: web
  remote_user: ubuntu   # Utilizzo dell'host remoto come ubuntu
  become: true
  tasks:

# (Task-1) Verifica del file Sudoers se agli amministratori è consentito eseguire tutte le operazioni 
    - name: Validate the sudoers file before saving
      ansible.builtin.lineinfile:
         path: /etc/sudoers
         state: present
         regexp: '^%ADMIN ALL='
         line: '%ADMIN ALL=(ALL) NOPASSWD: ALL'

# (Task-2) Aggiornamento della porta predefinita di Apache a 8080 
    - name: Ensure the default Apache port is 8080
      ansible.builtin.lineinfile:
         path: /etc/apache2/ports.conf
         regexp: '^Listen '
         insertafter: '^#Listen '
         line: Listen 8080

# (Task-3) Aggiunta della riga alla fine della pagina html Hello This is my Apache Page
    - name: Add a line to a file if the file does not exist
      ansible.builtin.lineinfile:
         path: /var/www/html/index.html
         line: Hello This is my Apache Page
         create: yes

# (Task-4) Verifica del file Sudoers se agli amministratori è consentito eseguire tutte le operazioni 
    - name: Ensure MaxKeepAliveRequests is set to greater than 100
      ansible.builtin.lineinfile:
         path: /etc/apache2/apache2.conf
         regexp: '^MaxKeepAliveRequests'
         line: MaxKeepAliveRequests=1000

# (Task-5) Verifica del file Sudoers se agli amministratori è consentito eseguire tutte le operazioni 
    - name: Ensure KeepAliveTimeout is set to greater than 50
      ansible.builtin.lineinfile:
         path: /etc/apache2/apache2.conf
         regexp: '^KeepAliveTimeout'
         line: KeepAliveTimeout=100

3. Ora, invoca il playbook ed esegui i compiti utilizzando il comando ansible-playbook per aggiungere o aggiornare tutte le righe definite nel playbook sull’host remoto.

ansible-playbook my_playbook.yml 
Invoking the ansible playbook

Di seguito, puoi vedere che il TASK ha uno stato di changed, il che significa che l’host remoto non era nello stato corretto e è stato modificato per eseguire il comando. Per quel TASK che ha lo stato OK, indica che non richiede modifiche.

4. Successivamente, effettua l’accesso SSH all’host remoto utilizzando il tuo client SSH preferito.

5. Infine, verifica se tutte le righe definite nel my_playbook.yml sono state aggiornate o aggiunte sull’host remoto utilizzando il comando cat.

# Per verificare se l'amministratore è presente con tutti i privilegi e, se non lo è, aggiungerlo
cat /etc/sudoers
# Per verificare se MaxKeepAliveRequests e KeepAliveTimeout sono stati aggiornati rispettivamente a 1000 e 100.
cat /etc/apache2/apache.config | grep Alive
# Per verificare se Apache è in ascolto sulla porta 8080
cat /etc/apache2/ports.config

Lo screenshot sottostante conferma che l’admin è già stato aggiunto nel file sudoers.

Verifying the sudoers file

Ancora una volta, lo screenshot sottostante conferma che Apache è in ascolto sulla Porta 8080 per impostazione predefinita.

Verifying the ports for in the config file

Infine, verifica se MaxKeepAliveRequests e KeepAliveTimeout sono stati aggiornati rispettivamente a 1000 e 100.

Verifying the MaxKeepAliveRequests and KeepAliveTimeout in the config file

Conclusioni

Il modulo lineinfile di Ansible è un ottimo modo per modificare file di testo su host remoti. Il modulo fornisce un ottimo modo per aggiungere, rimuovere e modificare righe in file di testo all’interno dei tuoi playbook.

Quali altri casi d’uso ritieni possano beneficiare dal modulo lineinfile di Ansible?

Source:
https://adamtheautomator.com/ansible-lineinfile/