Come usare il modulo modello Ansible

Come usare il modulo modello Ansible
L'ansible modello Il modulo viene utilizzato principalmente per copiare i file dal client Ansible (dove è installato Ansible) agli host Ansible (gestiti da Ansible). Il vantaggio di utilizzare il modello modulo, piuttosto che il copia modulo, è che l'ansible modello Il modulo può utilizzare il linguaggio del modello Jinja2. Jinja2 è un potente linguaggio di modelli di Python attraverso il quale è possibile generare file di configurazione, pagine Web, ecc. Puoi anche usare variabili, loop e condizioni dei fatti Ansible nei modelli Jinja2.

Questo articolo ti mostrerà come usare l'ansible modello Modulo e alcune basi del linguaggio del modello Jinja2. Quindi iniziamo!

Prerequisiti


Se desideri provare gli esempi in questo articolo:

1) Devi avere Ansible installato sul tuo computer.

2) È necessario disporre di almeno un host Ubuntu/Debian o un host CentOS/RHEL 8 configurato per ANSIBLE Automation.

Ci sono molti articoli su Linuxhint dedicati all'installazione di Ansible e alla configurazione di host per Ansible Automation. Puoi anche controllarli, se necessario.

Impostazione di una directory di progetto Ansible

Prima di andare oltre, è una buona idea creare una struttura di directory di progetto, solo per mantenere le cose un po 'organizzate.

Per creare una directory di progetto modello-demo/ e tutte le sottodirectory richieste (nella directory di lavoro attuale), eseguire il seguente comando:

$ mkdir -pv modello -demo/playbooks/modelli

Una volta creata la directory del progetto, vai alla directory del progetto, come segue:

$ cd modello-demo/

Creare un ospiti File di inventario, come segue:

$ nano hosts

Quindi, aggiungi il nome IP o DNS host (VM1.nodekite.com E VM2.nodekite.com) nel file di inventario.

Una volta terminato questo passaggio, salva il file premendo + X, seguito da Y E .

Crea un file di configurazione Ansible nella directory del progetto, come segue:

$ nano ansible.cfg

Quindi, digitare le seguenti righe in Ansible.cfg file.

Una volta terminato questo passaggio, salva il file premendo + X, seguito da Y E .

A questo punto, la directory del progetto dovrebbe apparire come segue:

$ Tree

Come puoi vedere, anche gli host Ansible sono accessibili. Quindi, possiamo passare alla sezione successiva di questo articolo.

$ ansible tutto -u ansible -m ping

Nozioni di base sul modulo del modello Ansible

IL modello Il modulo di Ansible accetta le stesse opzioni del copia Modulo di Ansible.

Ansible comune modello Opzioni del modulo:

src - Il percorso del file del modello Jinja2 sul tuo computer, che sarà analizzato dal linguaggio di modelli di Jinja2 e copiata sugli host remoti.
dest - Il percorso di destinazione sugli host remoti a cui verrà copiato il file.
proprietario - Il proprietario del file sugli host remoti.
gruppo - Il gruppo del file sugli host remoti.
modalità - La modalità di autorizzazione del file sugli host remoti.

Vediamo un esempio.

Innanzitutto, crea un nuovo playbook Ansible copy_file_template1.Yaml nel playbooks/ Directory, come segue:

$ nano playbooks/copy_file_template1.Yaml

Quindi, digitare le seguenti righe in copy_file_template1.Yaml playbook.

- Host: tutto
Utente: Ansible
compiti:
- Nome: Copia indice.File HTML al server
modello:
SRC: indice.Jinja2
dest:/home/ansible/indice.html
Proprietario: Ansible
Gruppo: Ansible
Modalità: 0644

Questo playbook copierà il indice.Jinja2 file da playbook/modelli/ Directory (relativo alla directory del progetto) agli host remoti usando l'ansible modello modulo.

Una volta terminato questo passaggio, salva il file premendo + X, seguito da Y E .

Creare il indice.Jinja2 file modello nel file playbook/modelli Directory, come segue:

$ nano playbooks/modelli/indice.Jinja2

Digitare le seguenti righe in indice.Jinja2 File modello:




Demo del modello Jinja2


Benvenuti in Linuxhint!



Questo è solo un semplice file HTML. Non ho usato alcuna sintassi di fantasia Jinja2 qui.

Una volta terminato questo passaggio, salva il file premendo + X, seguito da Y E .

Esegui il playbook copy_file_template1.Yaml come segue:

$ ansible-playbook playbooks/copy_file_template1.Yaml

Il playbook dovrebbe funzionare con successo.

Come puoi vedere, il indice.Jinja2 Il modello è stato reso utilizzando il linguaggio del modello Jinja2. Il contenuto reso deve essere copiato a indice.html File degli host remoti.

Variabili di stampa nel modello Jinja2

È possibile utilizzare fatti, variabili e variabili definite dall'utente nei modelli Jinja2.

Sul tuo modello Jinja2, puoi stampare il valore di una variabile usando il VariableName sintassi. Se la variabile è un oggetto, è possibile stampare singoli proprietà dell'oggetto utilizzando il ObjectVariable.nome della proprietà sintassi.

Nell'esempio che segue, stamperemo il data proprietà del ansible_date_time oggetto nel nostro indice.Jinja2 modello.

$ ansible all -u ansible -m configurazione | EGREP -COLOR 'DATA | TIMA'

Innanzitutto, apri il indice.Jinja2 File modello con il nano Editor di testo, come segue:

$ nano playbooks/modelli/indice.Jinja2

Aggiungi la riga seguente al file indice.Jinja2 File modello:

Pagina generata su ansible_date_time.data

Il finale indice.Jinja2 Il file dovrebbe apparire come mostrato nello screenshot seguente.

Una volta terminato questo passaggio, salva il file premendo + X, seguito da Y E .

Esegui il playbook copy_file_template1.Yaml come segue:

$ ansible-playbook playbooks/copy_file_template1.Yaml

Come puoi vedere, il indice.Jinja2 Il modello è stato elaborato dal linguaggio del modello di Jinja2 e ha sostituito il ansible_date_time.data variabile con la data in YYYY-MM-DD formato. L'uscita è stata quindi copiata a indice.html File sull'host remoto.

Dichiarazione IF condizionale nel modello Jinja2

Jinja2 Il linguaggio del modello supporta condizionale Se dichiarazioni. È possibile controllare determinate variabili prima di stampare qualsiasi cosa usando il Se dichiarazione.

Il jinja2 Se La sintassi è la seguente:

% se condizione %
Fare qualcosa se la condizione è vera
% finisci se %

Vediamo un esempio del jinja2 Se dichiarazione.

In questa sezione, dimostrerò il jinja2 Se Dichiarazione usando il Ansible_Distribution Fatti variabili.

$ ansible all -u ansible -m configurazione | egrep -color 'dist'

Innanzitutto, apri il indice.Jinja2 Modello Jinja2 con il nano Editor di testo, come segue:

$ nano playbooks/modelli/indice.Jinja2

Quindi, aggiungi le seguenti righe in indice.Jinja2 File modello:

% se Ansible_Distribution == "Debian" %

Stai eseguendo Debian Linux


% finisci se %

Qui, ho controllato se Ansible_Distribution È Debian. Se lo è, stampare la stringa

Stai eseguendo Debian Linux

. Altrimenti, non stamparlo.

Finalmente il indice.Jinja2 Il file modello dovrebbe apparire come mostrato nello screenshot seguente.

Dopo aver modificato il file, salva il file premendo + X, seguito da Y E .

Ora, esegui il playbook copy_file_template1.Yaml come segue:

$ ansible-playbook playbooks/copy_file_template1.Yaml

Come puoi vedere, sul mio ospite remoto Debian, il indice.html Il file ha la riga

Stai eseguendo Debian Linux

. Tuttavia, sul mio host remoto CentOS, la linea non è presente. Quindi, il jinja2 Se la condizione funziona.

Condizionale: dichiarazione if-else nel modello Jinja2

Jinja2 Il linguaggio del modello supporta condizionale se altro dichiarazioni. Puoi stampare una cosa se la condizione corrisponde e stampano qualcos'altro se non utilizza il se altro dichiarazione.

Il jinja2 se altro La sintassi è la seguente:

% se condizione %
Fare qualcosa se la condizione è vera
% altro %
Fare qualcosa se la condizione è falsa
% finisci se %

Vediamo un esempio del jinja2 se altro dichiarazione.

Innanzitutto, apri il indice.Jinja2 Modello Jinja2 con il nano Editor di testo, come segue:

$ nano playbooks/modelli/indice.Jinja2

Quindi, aggiungi le seguenti righe in indice.Jinja2 File modello:

% se Ansible_Distribution == "Debian" %

Stai eseguendo Debian Linux


% altro %

Non stai eseguendo Debian Linux


% finisci se %

Qui, ho controllato se Ansible_Distribution È Debian. Se lo è, stampare la stringa

Stai eseguendo Debian Linux

. Altrimenti, stampa

Non stai eseguendo Debian Linux

.

Finalmente il indice.Jinja2 Il file modello dovrebbe apparire come mostrato nello screenshot seguente.

Dopo aver modificato il file, salva il file premendo + X, seguito da Y E .

Esegui il playbook copy_file_template1.Yaml come segue:

$ ansible-playbook playbooks/copy_file_template1.Yaml

Come puoi vedere, sul mio ospite remoto Debian, il indice.html Il file ha la riga

Stai eseguendo Debian Linux

. Ma sul mio ospite remoto CentOS, il indice.html Il file ha la riga

Non stai eseguendo Debian Linux

. Quindi, il jinja2 se altro la condizione funziona.

Condizionale: istruzione if-elif nel modello Jinja2

Jinja2 Il linguaggio del modello supporta condizionale if-elif dichiarazioni.

Il jinja2 if-elif La sintassi è la seguente:

% se condition1 %
Fare qualcosa se la condizione1 è vera
% Elif Condition2 %
Fare qualcosa se la condizione2 è vera
% Elif Condition3 %
Fare qualcosa se la condizione3 è vera
..
% elif conditionn %
Fare qualcosa se la condizione è vera
% altro %
Fare qualcosa se nessuna delle condizioni è vera
% finisci se %

Qui, il % altro % La sezione è facoltativa, ma è lì se ne hai bisogno.

Vediamo un esempio del jinja2 if-elif dichiarazione.

Innanzitutto, apri il indice.Jinja2 Modello Jinja2 con il nano Editor di testo, come segue:

$ nano playbooks/modelli/indice.Jinja2

Quindi, aggiungi le seguenti righe in indice.Jinja2 File modello:

% se Ansible_Distribution == "Debian" %

Stai eseguendo Debian Linux


% elif ansible_distribution == "centos" %

Stai correndo centos linux


% altro %

Il tuo sistema operativo non è supportato


% finisci se %

Qui, ho controllato se Ansible_Distribution È Debian. Se lo è, stampare la stringa

Stai eseguendo Debian Linux

.

Ho anche controllato se Ansible_Distribution È Centos. Se lo è, stampare la stringa

Stai correndo centos linux

.

Altrimenti, stampa

Il tuo sistema operativo non è supportato

.

Finalmente il indice.Jinja2 Il file modello dovrebbe apparire come mostrato nello screenshot seguente.

Dopo aver modificato il file, salva il file premendo + X, seguito da Y E .

Esegui il playbook copy_file_template1.Yaml come segue:

$ ansible-playbook playbooks/copy_file_template1.Yaml

Come puoi vedere, sul mio ospite remoto Debian, il indice.html Il file ha la riga

Stai eseguendo Debian Linux

.

Sul mio host remoto centos, il indice.html Il file ha la riga

Stai correndo centos linux

.

Se avessi un altro host remoto che esegueva un sistema operativo diverso da Debian o CentOS, avrebbe la linea

Il tuo sistema operativo non è supportato

nel indice.html file.

Quindi, il jinja2 if-elif la condizione funziona.

Loop nel modello Jinja2

Puoi anche stampare array e oggetti usando loop in jinja2.
Il jinja2 per La sintassi del loop è la seguente:

% per variaLelename in ArrayName %
Fai qualcosa con Variablename
% endfor %

Qui, in ogni iterazione dell'array ArrayName, Uno degli elementi dell'array (a partire dall'inizio dell'array) è assegnato al Variablename variabile. Puoi fare qualcosa con questa variabile all'interno del loop.

Vediamo come puoi stampare elementi di array nel tuo modello Jinja2 nell'esempio seguente.

Innanzitutto, apri il copy_file_template1.Yaml Ansible Playbook con Nano Text Editor, come segue:

$ nano playbooks/copy_file_template1.Yaml

Quindi, aggiungi le seguenti righe in copy_file_template1.Yaml File di playbook:

VAR:
Menu:
- Casa
- Prodotti
- Chi siamo
- Contattaci

Qui, ho aggiunto un menu Array nel copy_file_template1.Yaml playbook. Successivamente, stamperò gli elementi dell'array usando un ciclo nel mio indice.Jinja2 File modello Jinja2.

Finalmente il copy_file_template1.Yaml Il file Playbook dovrebbe apparire come mostrato nello screenshot seguente.

Dopo aver modificato il file, salva il file premendo + X, seguito da Y E .

Ora, apri il indice.Jinja2 Modello Jinja2 con il nano Editor di testo, come segue:

$ nano playbooks/modelli/indice.Jinja2

Aggiungi le seguenti righe in indice.Jinja2 File modello:

Qui, sto generando una semplice barra di navigazione HTML usando un Jinja2 per ciclo continuo. Il loop itera attraverso il menu array (che ho definito in copy_file_template1.Yaml Playbook) elementi e genera un menù Articolo in ogni iterazione.

Finalmente il indice.Jinja2 Il file modello dovrebbe apparire come mostrato nello screenshot seguente.

Dopo aver modificato il file, salva il file premendo + X, seguito da Y E .

Esegui il playbook copy_file_template1.Yaml come segue:

$ ansible-playbook playbooks/copy_file_template1.Yaml

Come puoi vedere, il jinja2 per Loop ha generato una barra di navigazione HTML (in indice.html file).

Puoi anche accedere a una serie di oggetti nel tuo modello Jinja2.

Vediamo un altro esempio.

Innanzitutto, apri il copy_file_template1.Yaml Ansible Playbook con Nano Text Editor, come segue:

$ nano playbooks/copy_file_template1.Yaml

Quindi, aggiungi le seguenti righe in copy_file_template1.Yaml File di playbook:

VAR:
Menu:
- Nome: Home
Link: /Home
- Nome: prodotti
Link: /Products
- Nome: su di noi
Link: /About-us
- Nome: contattaci
Link: /Contact-us

Qui, ho aggiunto un menu Array di oggetti in copy_file_template1.Yaml playbook. Ognuno di questi oggetti ha due proprietà, a nome proprietà e a collegamento proprietà.

Finalmente il copy_file_template1.Yaml Il file Playbook dovrebbe apparire come mostrato nello screenshot seguente.

Dopo aver modificato il file, salva il file premendo + X, seguito da Y E .

Apri il indice.Jinja2 Modello Jinja2 con il nano Editor di testo, come segue:

$ nano playbooks/modelli/indice.Jinja2

Quindi, aggiungi le seguenti righe in indice.Jinja2 File modello:

Tutto ciò che vedi qui è lo stesso dell'esempio precedente. L'unica differenza è che sto stampando le proprietà dell'oggetto nome (usando menù.nome) E collegamento (usando menù.collegamento) nel mio indice.Jinja2 Modello jinja2.

Finalmente il indice.Jinja2 Il file modello dovrebbe apparire come mostrato nello screenshot seguente.

Dopo aver modificato il file, salva il file premendo + X, seguito da Y E .

Ora, esegui il playbook copy_file_template1.Yaml come segue:

$ ansible-playbook playbooks/copy_file_template1.Yaml

Come puoi vedere, il jinja2 per Loop ha generato una barra di navigazione HTML (in indice.html file) da una matrice di oggetti.

Qual è il prossimo?

In questo articolo, ti ho mostrato come usare l'ansible modello modulo e descritto alcune delle basi del linguaggio del modello Jinja2. Visita il sito web ufficiale di Jinja2 per saperne di più sulla lingua di modelli di Jinja2.