Questo articolo ti mostrerà come usare Ansible modello modulo e alcune nozioni di base sul linguaggio dei modelli Jinja2. Quindi iniziamo!
Prerequisiti
Se vuoi provare gli esempi in questo articolo:
1) Devi avere Ansible installato sul tuo computer.
2) Devi avere almeno un host Ubuntu/Debian o un host CentOS/RHEL 8 configurato per l'automazione Ansible.
Ci sono molti articoli su LinuxHint dedicati all'installazione di Ansible e alla configurazione degli host per l'automazione di Ansible. Puoi dare un'occhiata anche a questi, se necessario.
Configurazione di una directory di progetto Ansible
Prima di procedere oltre, è una buona idea creare una struttura di directory del 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 corrente), esegui il seguente comando:
$ mkdir -pv template-demo/playbook/templates
Una volta creata la directory del progetto, accedere alla directory del progetto, come segue:
$ cd modello-demo/
Creare un padroni di casa file di inventario, come segue:
$ nano host
Quindi, aggiungi l'IP dell'host o il nome DNS (vm1.nodokite.come e vm2.nodokite.come) nel file di inventario.
Una volta terminato questo passaggio, salvare il file premendo
Crea un file di configurazione Ansible nella directory del progetto, come segue:
$ nano ansible.cfg
Quindi, digita le seguenti righe nel ansible.cfg file.
Una volta terminato questo passaggio, salvare il file premendo
A questo punto, la directory del progetto dovrebbe apparire come segue:
$ albero
Come puoi vedere, anche gli host Ansible sono accessibili. Quindi, possiamo passare alla prossima sezione di questo articolo.
$ ansible all -u ansible -m ping
Nozioni di base sul modulo modello Ansible
Il modello modulo di Ansible accetta le stesse opzioni del copia modulo di Ansible.
Ansible comune modello opzioni del modulo:
src - Il percorso del file modello Jinja2 sul tuo computer, che verrà analizzato dal linguaggio del modello Jinja2 e copiato negli host remoti.
destinazione - Il percorso di destinazione sugli host remoti in 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 dei file sugli host remoti.
Facciamo un esempio.
Innanzitutto, crea un nuovo playbook Ansible A copy_file_template1.igname nel libri di gioco/ rubrica, come segue:
$ nano playbook/copy_file_template1.igname
Quindi, digita le seguenti righe nel copy_file_template1.igname playbook.
- host: tuttiutente: ansible
compiti:
- nome: Copia indice.html al server
modello:
src: indice.jinja2
dest: /home/ansible/index.html
proprietario: ansible
gruppo: ansible
modalità: 0644
Questo playbook copierà il indice.jinja2 file dal playbook/modelli/ directory (relativa alla directory del progetto) agli host remoti utilizzando Ansible modello modulo.
Una volta terminato questo passaggio, salvare il file premendo
Crea il indice.jinja2 file modello nel playbook/modelli rubrica, come segue:
$ nano playbook/modelli/indice.jinja2
Digita le seguenti righe nel indice.jinja2 file modello:
Benvenuto in Linuxhint!
Questo è solo un semplice file HTML. Non ho usato nessuna sintassi Jinja2 fantasiosa qui.
Una volta terminato questo passaggio, salvare il file premendo
Esegui il playbook copy_file_template1.igname come segue:
$ playbook ansible-playbook/copy_file_template1.igname
Il playbook dovrebbe funzionare correttamente.
Come puoi vedere, il indice.jinja2 il template è stato reso usando il linguaggio di template Jinja2. Il contenuto renderizzato dovrebbe essere copiato nel indice.html file degli host remoti.
Variabili di stampa nel modello Jinja2
Puoi utilizzare fatti, variabili e variabili definite dall'utente di Ansible nei tuoi modelli Jinja2.
Sul tuo modello Jinja2, puoi stampare il valore di una variabile usando il tasto nomevariabile sintassi. Se la variabile è un oggetto, puoi stampare le proprietà dei singoli oggetti utilizzando il pulsante 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 setup | egrep --color 'data|ora'
Per prima cosa, apri il indice.jinja2 file modello con l'editor di testo nano, come segue:
$ nano playbook/modelli/indice.jinja2
Aggiungi la seguente riga al indice.jinja2 file modello:
Pagina generata il ansible_date_time.Data
Il finale indice.jinja2 il file dovrebbe apparire come mostrato nello screenshot qui sotto.
Una volta terminato questo passaggio, salvare il file premendo
Esegui il playbook copy_file_template1.igname come segue:
$ playbook ansible-playbook/copy_file_template1.igname
Come puoi vedere, il indice.jinja2 template è stato elaborato dal linguaggio di template Jinja2 e ha sostituito il ansible_date_time.Data variabile con la data in AAAA-MM-GG formato. L'output è stato quindi copiato su indice.html file sull'host remoto.
Istruzione if condizionale nel modello Jinja2
Il linguaggio di template Jinja2 supporta il condizionale Se dichiarazioni. Puoi controllare alcune variabili prima di stampare qualsiasi cosa usando il Se dichiarazione.
Il Jinja2 Se la sintassi è la seguente:
% se condizione %Fai qualcosa se la condizione è vera
% finisci se %
Vediamo un esempio del Jinja2 Se dichiarazione.
In questa sezione, dimostrerò il Jinja2 Se dichiarazione usando il distribuzione_ansible fatti variabile.
$ ansible all -u ansible -m setup | egrep --color 'dist'
Per prima cosa, apri il indice.jinja2 Modello Jinja2 con l'editor di testo nano, come segue:
$ nano playbook/modelli/indice.jinja2
Quindi, aggiungi le seguenti righe nel indice.jinja2 file modello:
% if ansible_distribution == "Debian" %Stai eseguendo Debian Linux
% finisci se %
Ecco, ho verificato se distribuzione_ansible è Debian. Se lo è, stampa la stringa Stai eseguendo Debian Linux
Infine, il indice.jinja2 il file modello dovrebbe apparire come mostrato nello screenshot qui sotto.
Una volta modificato il file, salvalo premendo
Ora esegui il playbook copy_file_template1.igname come segue:
$ playbook ansible-playbook/copy_file_template1.igname
Come puoi vedere, sul mio host remoto Debian, il indice.html il file ha la riga Stai eseguendo Debian Linux
Condizionale: istruzione if-else nel modello Jinja2
Il linguaggio di template Jinja2 supporta il condizionale se altro dichiarazioni. Puoi stampare una cosa se la condizione corrisponde e stampare qualcos'altro se non lo fa usando il se altro dichiarazione.
Il Jinja2 se altro la sintassi è la seguente:
% se condizione %Fai qualcosa se la condizione è vera
% altro %
Fai qualcosa se la condizione è falsa
% finisci se %
Vediamo un esempio del Jinja2 se altro dichiarazione.
Per prima cosa, apri il indice.jinja2 Modello Jinja2 con l'editor di testo nano, come segue:
$ nano playbook/modelli/indice.jinja2
Quindi, aggiungi le seguenti righe nel indice.jinja2 file modello:
% if ansible_distribution == "Debian" %Stai eseguendo Debian Linux
% altro %
Non stai eseguendo Debian Linux
% finisci se %
Ecco, ho verificato se distribuzione_ansible è Debian. Se lo è, stampa la stringa Stai eseguendo Debian Linux Non stai eseguendo Debian Linux
Infine, il indice.jinja2 il file modello dovrebbe apparire come mostrato nello screenshot qui sotto.
Una volta modificato il file, salvalo premendo
Esegui il playbook copy_file_template1.igname come segue:
$ playbook ansible-playbook/copy_file_template1.igname
Come puoi vedere, sul mio host remoto Debian, il indice.html il file ha la riga Stai eseguendo Debian Linux Non stai eseguendo Debian Linux
Condizionale: istruzione if-elif nel modello Jinja2
Il linguaggio di template Jinja2 supporta il condizionale se-elif dichiarazioni.
Il Jinja2 se-elif la sintassi è la seguente:
% se condizione1 %Fai qualcosa se la condizione1 è vera
% elif condition2 %
Fai qualcosa se la condizione2 è vera
% condizione elif3 %
Fai qualcosa se la condizione3 è vera
…
% elif conditionN %
Fai qualcosa se la condizioneN è vera
% altro %
Fai 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 se-elif dichiarazione.
Per prima cosa, apri il indice.jinja2 Modello Jinja2 con l'editor di testo nano, come segue:
$ nano playbook/modelli/indice.jinja2
Quindi, aggiungi le seguenti righe in indice.jinja2 file modello:
% if ansible_distribution == "Debian" %Stai eseguendo Debian Linux
% elif ansible_distribution == "CentOS" %
Stai utilizzando CentOS Linux
% altro %
Il tuo sistema operativo non è supportato
% finisci se %
Ecco, ho verificato se distribuzione_ansible è Debian. Se lo è, stampa la stringa Stai eseguendo Debian Linux
Ho anche verificato se distribuzione_ansible è CentOS. Se lo è, stampa la stringa Stai utilizzando CentOS Linux
Altrimenti, stampa Il tuo sistema operativo non è supportato
Infine, il indice.jinja2 il file modello dovrebbe apparire come mostrato nello screenshot qui sotto.
Una volta modificato il file, salvalo premendo
Esegui il playbook copy_file_template1.igname come segue:
$ playbook ansible-playbook/copy_file_template1.igname
Come puoi vedere, sul mio host 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 utilizzando CentOS Linux
Se avessi un altro host remoto che esegue un sistema operativo diverso da Debian o CentOS, avrebbe la linea Il tuo sistema operativo non è supportato
Quindi, Jinja2 se-elif la condizione funziona.
Loop nel modello Jinja22
Puoi anche stampare array e oggetti usando i loop in Jinja2.
Il Jinja2 per la sintassi del ciclo è la seguente:
Fai qualcosa con nomevariabile
% endfor %
Qui, in ogni iterazione dell'array nomearray, uno degli elementi dell'array (a partire dall'inizio dell'array) è assegnato a nomevariabile variabile. Puoi fare qualcosa con questa variabile all'interno del ciclo.
Vediamo come puoi stampare gli elementi dell'array nel tuo modello Jinja2 nel seguente esempio.
Per prima cosa, apri il copy_file_template1.igname Playbook Ansible con l'editor di testo nano, come segue:
$ nano playbook/copy_file_template1.igname
Quindi, aggiungi le seguenti righe in copy_file_template1.igname file del registro:
variabili:menù:
- Casa
- Prodotti
- Chi siamo
- Contattaci
Qui ho aggiunto un menu array in copy_file_template1.igname playbook. Successivamente, stamperò gli elementi dell'array usando un ciclo in my indice.jinja2 File modello Jinja2.
Infine, il copy_file_template1.igname il file playbook dovrebbe apparire come mostrato nello screenshot qui sotto.
Una volta modificato il file, salvalo premendo
Ora apri il indice.jinja2 Modello Jinja2 con l'editor di testo nano, come segue:
$ nano playbook/modelli/indice.jinja2
Aggiungi le seguenti righe nel indice.jinja2 file modello:
Qui, sto generando una semplice barra di navigazione HTML usando un Jinja2 per ciclo continuo. Il ciclo scorre attraverso il menu array (che ho definito nel copy_file_template1.yaml playbook) elementi e genera a menù elemento in ogni iterazione.
Infine, il indice.jinja2 il file modello dovrebbe apparire come mostrato nello screenshot qui sotto.
Una volta modificato il file, salvalo premendo
Esegui il playbook copy_file_template1.igname come segue:
$ playbook ansible-playbook/copy_file_template1.igname
Come puoi vedere, Jinja2 per loop ha generato una barra di navigazione HTML (nel indice.html file).
Puoi anche accedere a una serie di oggetti nel tuo modello Jinja2.
Vediamo un altro esempio.
Per prima cosa, apri il copy_file_template1.igname Playbook Ansible con l'editor di testo nano, come segue:
$ nano playbook/copy_file_template1.igname
Quindi, aggiungi le seguenti righe in copy_file_template1.igname file del registro:
variabili:menù:
- nome: Casa
link: /home
- nome: Prodotti
link: /prodotti
- nome: Chi siamo
link: /chi-siamo
- nome: Contattaci
link: /contattaci
Qui ho aggiunto un menu array di oggetti in copy_file_template1.igname playbook. Ciascuno di questi oggetti ha due proprietà, a nome proprietà e a collegamento proprietà.
Infine, il copy_file_template1.igname il file playbook dovrebbe apparire come mostrato nello screenshot qui sotto.
Una volta modificato il file, salvalo premendo
Apri il indice.jinja2 Modello Jinja2 con l'editor di testo nano, come segue:
$ nano playbook/modelli/indice.jinja2
Quindi, aggiungi le seguenti righe in indice.jinja2 file modello:
Tutto quello 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.
Infine, il indice.jinja2 il file modello dovrebbe apparire come mostrato nello screenshot qui sotto.
Una volta modificato il file, salvalo premendo
Ora esegui il playbook copy_file_template1.igname come segue:
$ playbook ansible-playbook/copy_file_template1.igname
Come puoi vedere, Jinja2 per loop ha generato una barra di navigazione HTML (nel indice.html file) da un array di oggetti.
Qual è il prossimo?
In questo articolo, ti ho mostrato come usare Ansible modello modulo e ha descritto alcune delle basi del linguaggio di template Jinja2. Visita il sito web ufficiale di Jinja2 per saperne di più sul linguaggio dei modelli Jinja2.