Come creare modelli Ansible per risparmiare tempo nella configurazione

Gestire le configurazioni di più server e ambienti è un grande vantaggio nell’utilizzo di Ansible. Ma cosa succede quando i file di configurazione variano da server a server? Invece di creare una configurazione separata per ogni server o ambiente, dovresti considerare l’utilizzo dei modelli di Ansible.

In questo tutorial, imparerai cosa sono i modelli di Ansible, come funzionano e come puoi utilizzare il modulo di template di Ansible per risparmiare un sacco di tempo.

Prerequisiti

Questo post sarà un tutorial passo-passo. Se desideri seguirmi, assicurati di avere un host controller di Ansible. Questo tutorial utilizzerà Ansible v2.9.18

Cos’è un template di Ansible?

A volte è necessario trasferire file di testo su host remoti. Questi file di testo sono tipicamente dei file di configurazione. Se stai lavorando con un singolo server, ad esempio, potresti avere bisogno di creare un file di configurazione chiamato app.conf che viene utilizzato da un determinato servizio.

Quel file di configurazione potrebbe contenere informazioni specifiche del server, come il nome host, l’indirizzo IP, ecc. Dato che stai lavorando con un singolo server, potresti creare il file sul controller Ansible e quindi utilizzare il modulo copy in un playbook per copiarlo sul server.

Ma cosa succede se hai più server web, ognuno che necessita dello stesso file di configurazione ma con valori specifici? Non puoi semplicemente copiare il file di configurazione su tutte le macchine; è progettato solo per un singolo server con un nome host e un indirizzo IP specifici, ecc. Hai bisogno di un modello Ansible.

I modelli Ansible ti consentono di definire file di testo con variabili invece di valori statici e poi sostituire quelle variabili durante l’esecuzione del playbook.

Come appare un modello Ansible?

Un modello Ansible è un file di testo costruito con il linguaggio di modellazione Jinja2 con un’estensione di file j2. Un modello Jinja2 assomiglia esattamente al file di testo che desideri ottenere su un host remoto. L’unico cambiamento è che, invece di valori statici, il file contiene variabili.

Ad esempio, potresti avere bisogno di ottenere un file di configurazione chiamato app.conf su tutti i tuoi server web che contiene riferimenti all’indirizzo IP di ciascun server, all’host di Ansible e all’utente di Ansible. Il file app.conf di un singolo server potrebbe apparire come nell’esempio qui sotto.

my_ip    = "192.168.0.1"
my_host  = "ANSBILECONTROL"
my_user  = "ansible_user"

Non puoi copiare questo file su ogni server web perché ogni elemento sarà unico a seconda dell’indirizzo IP dell’host remoto, del nome host del controller di Ansible e dell’utente di Ansible.

Invece di impostare staticamente ognuno di questi valori, un modello di Ansible ti consente di definire variabili che vengono interpretate durante l’esecuzione e sostituite sull’host remoto.

Di seguito troverai un esempio del file modello app.conf.j2. Ora puoi vedere che ogni valore statico è stato sostituito da una variabile indicata con doppie parentesi graffe su entrambi i lati. In questo caso, queste variabili provengono dai fatti di Ansible.

I file di modello hanno sempre l’estensione .j2 e di solito hanno lo stesso nome del file che creano sull’host di destinazione.

my_ip    = "{{ansible_default_ipv4["address"]}}"
my_host  = "{{ansible_host}}"
my_user  = "{{ansible_user}}"

Come vengono creati i file di template sugli host remoti?

Una volta creato un modello, devi trasferire quel file di modello sull’host remoto e “convertirlo” nel file di testo effettivo di come dovrebbe apparire. Per fare ciò, devi fare riferimento al file di modello in un playbook.

La maggior parte degli amministratori di Ansible utilizza il modulo copy per trasferire file agli host remoti, ma, come già accennato, ciò non è possibile con i template.

Di seguito puoi vedere un semplice esempio di riferimento da un playbook che copia il file app.conf nella directory /opt di tutti gli host di destinazione del playbook.

- name: copy file from local host to remote host
  copy:                               # Declaring Copy Module 
    src: "app.conf"                   # Source Location 
    dest: "/opt/app.conf"             # Destination Location on remote host

Supponiamo ora che tu abbia “templatizzato” il file di configurazione app.conf per trasformarlo in un file template app.conf.j2, come illustrato nella sezione precedente, sul tuo controller Ansible. Ora devi assicurarti che app.conf venga ancora copiato nella directory /opt, ma con le variabili sostituite con valori reali.

Per dire al playbook di creare il file app.conf nella directory /opt, sostituisci semplicemente il riferimento copy con template come mostrato di seguito. In questo modo, Ansible invoca il modulo template per trasferire il template e sostituire le variabili con valori statici.

- name: template file to remote host
  template:                 # Ansible template module
    src: "app.conf.j2"      # This is template src i.e source location 
    dest: "/opt/app.conf"   # Destination of Remote host

Dopo l’esecuzione del compito nel playbook sopra descritto, Ansible copierà il file app.conf.j2 nella directory /opt dell’host remoto, sostituendo tutte le variabili con valori statici e rinominando il file in app.conf.

Quando fornisci il modello src con un percorso di directory, Ansible cerca i modelli nella directory /<directory_installazione_ansible>/files/. Se fornisci semplicemente il nome del file, Ansible cercherà il modello nella directory /<directory_installazione_ansible>/templates/.

Rendering di un file di configurazione: un esempio di modello

Adesso passiamo a una demo per vedere come configurare un modello Ansible e utilizzare il modulo di modello Ansible per generare dinamicamente un file di configurazione. In questo esempio, stai creando un file chiamato app.conf nella directory /etc su un server chiamato SRV1.

I passaggi in questa sezione funzioneranno per qualsiasi tipo di file di testo. Il tutorial utilizzerà un file di configurazione come esempio singolo.

1. Accedi via SSH al tuo host controller di Ansible utilizzando l’utente che utilizzi normalmente per gestire Ansible.

2. Crea una cartella nella tua directory home per contenere i file di demo di questo tutorial e cambia la directory di lavoro in essa.

mkdir ~/ansible_template_demo
cd ~/ansible_template_demo

3. Crea un file di modello chiamato app.conf.j2 nella directory che assomiglia a quanto segue.

my_ip = {{ansible_default_ipv4["address"]}}
my_host  = {{ansible_host}}
my_user  = {{ansible_user}}

Puoi anche utilizzare diverse variabili specifiche del modulo di modello Ansible stesso nel tuo modello.

4. Crea un playbook semplice nella stessa directory chiamato my_playbook.yml. Questo playbook crea il file app.conf nella directory /etc.


name: Ansible template example 
hosts: myserver 
remote_user: ubuntu   # Using Remote host as ubuntu 
tasks: 
 - name: Create the app.conf configuration file
   template:
     src: "~/ansible_template_demo/app.conf.j2"
     dest: "/etc/app.conf"
   become: true 

5. Esegui il playbook di Ansible mirando all’host remoto SRV1.

ansible-playbook my_playbook.yml --inventory SRV1
You should then see Ansible execute the playbook.

6. Ora conferma che il file di configurazione /etc/app.conf esista e abbia i valori attesi.

confirm the /etc/app.conf configuration file

Aggiornamento dei permessi del file con il modulo Template

Ora che hai visto i concetti di base dell’utilizzo del modulo template, passiamo a qualcosa di più avanzato. Per questa dimostrazione, creerai lo stesso file app.conf mostrato in precedenza. Ma questa volta, imposterai il proprietario e i permessi del file.

Per modificare i permessi del file creato dal modulo template, devi utilizzare tre parametri all’interno del playbook:

  • proprietario – Il proprietario del file
  • gruppo – Il gruppo di cui il file dovrebbe essere membro
  • modalità – I permessi. Questa stringa può essere espressa sia con simboli che con numeri ottali

Nella modalità simbolica, u rappresenta “utente”, g rappresenta “gruppo” e o rappresenta “altro”.

Assumendo che tu abbia ancora la cartella ~/ansible_template_demo creata dalla sezione precedente, apri il playbook my_playbook.yml e sostituisci il contenuto con quello riportato di seguito. In questo esempio, Ansible imposterà il proprietario e il gruppo sull’utente Ansible utilizzando le variabili di connessione. Imposterà quindi i permessi del file a 0644, che rappresenta:

  • Il proprietario ha il permesso di lettura/scrittura
  • Gli utenti nel gruppo e chiunque altro ha il permesso di lettura
---
- name: Ansible file permission example
  remote_user: ubuntu
  tasks:
    - name: Create the app.conf configuration file and assign permissions
      template:
          src: "~/ansible_template_demo/app.conf.j2"
          dest: "/etc/app.conf"
	  owner: "{{ ansible_user }}"
          group: "{{ ansible_user }}"
          mode:  0644 ## OR  mode: u=rw, g=w,o=r       
      become: true

Puoi trovare tutti i parametri disponibili del modulo template nella documentazione del modulo template di Ansible.

Ora, esegui nuovamente il playbook come mostrato di seguito.

ansible-playbook my_playbook.yml --inventory SRV1

Ora puoi vedere che il file app.conf ha i permessi di file previsti.

app.conf

Utilizzo di Cicli per Creare Modelli Multipli di File

A volte un singolo file non è sufficiente; è necessario aggiungere più file su un host remoto. In questo caso, puoi utilizzare i cicli con il modulo template. Definire un ciclo utilizzando il parametro loop ti consente di aggiungere molti file di testo memorizzati in una directory.

Presumendo che tu abbia ancora la cartella ~/ansible_template_demo creata dalla sezione precedente, dovresti già avere il file app.conf.j2 in essa.

1. Crea un secondo file modello chiamato app2.conf.j2 nella cartella ~/ansible_template_demo come mostrato di seguito.

 template_host = "{{ template_host }}"
 template_uid = "{{ template_uid }}"
 template_path = "{{ template_path }}"
 template_fullpath = "{{ template_fullpath }}"
 template_run_date = "{{ template_run_date }}"

2. Apri il libro my_playbook.yml e sostituisci tutti i contenuti con il seguente YAML. Questo playbook utilizza la variabile {{item}} per rappresentare ciascun file modello elaborato nel ciclo. Il parametro loop definisce quindi ciascuno dei file modello da elaborare nel ciclo.

---
- name: Ansible file permission example 
  remote_user: ubuntu 
  tasks: 
   - name: Create the app.conf configuration file and assign permissions 
     template:   
        src: "~/ansible_template_demo/{{item}}.j2"    # Itera su 2 modelli   
        dest: "/etc/{{item}}"
        owner: "{{ ansible_user }}"   
        group: "{{ ansible_user }}"   
        mode:  0644 ## OR  mode: u=rw, g=w,o=r        
     become: true     
     loop: # Indica al modulo template di trovare ciascuno di questi modelli e elaborarli                                              
      - app1.conf 
      - app2.conf 

3. Ora esegui nuovamente il playbook. ansible-playbook my_playbook.yml --inventory SRV1

ansible-playbook my_playbook.yml --inventory SRV1
Notice now that Ansible sees each template file and processes them accordingly.

Conclusion

I modelli Ansible e il modulo template possono risparmiarti un sacco di tempo e creare file di testo dinamici su tutti i tuoi host remoti. Il modulo di copia fornisce funzionalità simili, ma se hai mai bisogno di creare file di testo dinamici, il modulo template è il tuo amico.

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