Ansible - parte 2
Pubblicato il lun 20 maggio 2019 in tutorial • 3 min read
Nel precedente articolo ho introdotto ansible. I questo analizzerò alcune caratteristiche più avanzate dei playbooks.
Variabili
Nei playbooks possono essere usate delle variabili cosa che permette di avere una maggiore flessibilità. Le variabili possono essere definite nella sezione vars
di un playbook. Ad esempio:
---
- hosts: all
become: true
vars:
package: apache2
tasks:
- name: Install Package
apt: name={{ package }} state=latest
Ansible usa jinja2
per gestire i templates. Come risultato le variabili possono essere richiamate facendo uso delle parentesi graffe {{ .. }}
, come nell'esempio precedente in cui la variabile package
è usata per impostare il nome del pacchetto che deve essere installato.
Le variabili possono anche essere definite come una lista, come si vede qui di seguito:
---
- hosts: all
become: true
vars:
packages: ["apache2", "apache2-doc", "apache2-utils"]
tasks:
- name: Install Package
apt: name={{ item }} state=latest
with_items: packages
Gli arrays
sono assegnati per mezzo della chiave with_items
e gli elementi possono essere richiamati facendo uso della keyword item
.
Tags
Per raggruppare uno o più tasks
all'interno di un playbook si utilizza la keyword tags
a cui si assegnano i corrispondenti tasks, ad es:
- name: make sure apache2 is installed
apt: name=apache2 state=installed
tags: apache2
Ciò permette di utilizzare solo certe funzionalità di un playbook tramite il parametro --tags apache2
da passare come argomento a linea di comando quando si vuole eseguire un playbook.
Construtti condizionali
Inoltre, la keyword when
può essere utilizzata per decidere di eseguire un task solo quando una certa condizione è rispettata. Ad esempio, per riavviare il sistema remoto solo quando su tale sistema è installato un sistema operativo Debian basta creare un task simile al seguente:
tasks:
- name: Shut down Debian system
command: /sbin/shutdown -t now
when: ansible_os_family == "Debian"
Templates
L'utilizzo di jinja2
in ansible permette altresì di utilizzare i templates
o modelli per altri files. Ad esempio un file di configurazione per un site
apache2 (mysite.j2
) potrebbe essere reso col seguente template:
<VirtualHost *:{{ http_port }}>
ServerAdmin webmaster@localhost
DocumentRoot {{ doc_root }}
<Directory {{ doc_root }}>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Questo template poi puo' essere usato in un playbook di ansible in questo modo:
vars:
http_port: 80
doc_root: /var/www/mysite
...
- name: Create mysite apache2 configuration file
template: src=mysite.j2 dest=/etc/apache2/sites-available/mysite.conf
Le variabili definite nel playbook verranno sostituite nel template jinja2 al momento dell'utilizzo del template stesso.
Handlers
Oltre i tasks, possono essere definiti anche dei gestori, o handlers
, che vengono eseguiti solo quando richiamati servendosi della keyword notification
. Gli handlers sono, molto spesso, usati insieme ai services: quando un certo file di configurazione è cambiato allora il servizio verrà riavviato. Ad esempio, dopo aver utilizzato un template per la creazione di un site
di apache2 occorre riavviare il servizio apache2 affiché la nuova configurazione possa essere utilizzata:
handlers:
- name: restart apache2
service: name=apache2 state=restarted
...
- name: Create mysite apache2 configuration file
template: src=mysite.j2 dest=/etc/apache2/sites-available/mysite.conf
notify: restart apache2
Esempio completo
Un playbook completo che fa uso delle funzionalità descritte in questo articolo è il seguente:
---
- hosts: webservers
become: true
vars:
http_port: 80
doc_root: /var/www/mysite
tasks:
- name: Update apt
apt: update_cache=yes
- name: Install apache2
apt: name=apache2 state=latest
- name: Create document root
file: path={{ doc_root }} state=directory owner=www-data group=www-data
- name: Create index.html file
copy: src=index.html dest={{ doc_root }}/index.html owner=www-data group=www-data mode=0644
- name: Render apache2 configuration file
template: src=mysite.j2 dest=/etc/apache2/sites-available/mysite.conf
- name: Enabling new apache2 configuration file
command: a2ensite mysite.conf
notify: restart apache2
handlers:
- name: restart apache2
service: name=apache2 state=restarted
Articolo successivo della serie: Ansible - parte 3.