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.