143 lines
4.2 KiB
Markdown
143 lines
4.2 KiB
Markdown
# Playbook
|
||
|
||
Un playbook Ansible è un file testuale, scritto in formato YAML, che definisce una sequenza di operazioni (`task`) da eseguire su uno o più nodi.
|
||
|
||
Un playbook può contenere uno o più *Play*. Ogni Play è composto da una serie di *task*, che a loro volta possono richiamare uno o più moduli.
|
||
|
||
## Struttura di un playbook
|
||
|
||
Di seguito è riportato un esempio di playbook:
|
||
|
||
```yaml
|
||
---
|
||
- name: install and start httpd
|
||
hosts: databases
|
||
|
||
tasks:
|
||
- name: install httpd
|
||
apt:
|
||
name: httpd
|
||
state: latest
|
||
become: true
|
||
|
||
- name: start httpd
|
||
service:
|
||
name: httpd
|
||
state: started
|
||
become: true
|
||
```
|
||
|
||
- `name`: specifica il nome del play, che descrive l'azione da eseguire
|
||
- `hosts`: indica i nodi sui quali il play sarà eseguito
|
||
- `tasks`: contiene un elenco di operazioni da eseguire
|
||
|
||
In questo esempio:
|
||
|
||
- il playbook contiene un unico play
|
||
- il play ha il compito di installare e avviare il servizio httpd su un gruppo di host denominato *databases*
|
||
- sono definiti due task: il primo installa il pacchetto httpd tramite il *modulo apt*, mentre il secondo avvia il servizio httpd utilizzando il *modulo service*
|
||
- l’opzione `become: true` indica che i task devono essere eseguite con privilegi elevati, tipicamente utilizzando sudo
|
||
|
||
Un esempio di playbook con due play:
|
||
|
||
```yaml
|
||
---
|
||
- name: install and start apache
|
||
hosts: webservers
|
||
|
||
tasks:
|
||
- name: install apache
|
||
apt:
|
||
name: apache2
|
||
state: latest
|
||
become: true
|
||
|
||
- name: start apache
|
||
service:
|
||
name: apache2
|
||
state: started
|
||
become: true
|
||
|
||
- name: install and start mysql
|
||
hosts: databases
|
||
|
||
tasks:
|
||
- name: install mysql
|
||
apt:
|
||
name: mysql-server
|
||
state: latest
|
||
become: true
|
||
|
||
- name: start mysql
|
||
service:
|
||
name: mysql
|
||
state: started
|
||
become: true
|
||
```
|
||
|
||
## Esecuzione di un playbook
|
||
|
||
Per eseguire un playbook, è necessario utilizzare il comando `ansible-playbook`, specificando:
|
||
|
||
- l’inventory file, se custom, con l'opzione `-i`
|
||
- il percorso del playbook
|
||
- eventuali opzioni aggiuntive, come `-ask-vault-pass`, che richiede la password per decifrare i file crittografati con `ansible-vault`
|
||
|
||
```bash
|
||
ansible-playbook -i inventory playbook/my-playbook.yml -K --ask-vault-pass
|
||
```
|
||
|
||
## Conditionals
|
||
|
||
Le istruzioni condizionali consentono di modificare il comportamento di un playbook in base a specifiche condizioni.
|
||
|
||
L'istruzione condizionale più semplice si applica a un singolo task, utilizzando la parola chiave `when`. In questo caso, il task verrà eseguito solo sui nodi in cui la condizione specificata è soddisfatta.
|
||
|
||
### Tipologie di condizioni
|
||
|
||
Le condizioni possono basarsi su diversi tipi di dati:
|
||
|
||
- `ansible_facts`: attributi specifici di ogni host, messi a disposizione da Ansible. Questi fanno riferimento a caratteristiche del nodo, come il tipo sistema operativo, le caratteristiche hardware e altre proprietà rilevanti. Sono utili per adattare il comportamento del playbook in base alle caratteristiche del nodo target
|
||
- `registered variables`: variabili che contengono il risultato di task precedenti. È possibile condizionare in questo modo l’esecuzione di un task in base all’esito di un task già eseguito
|
||
- `variabili` definite nel playbook o nell'inventory
|
||
|
||
Un semplice esempio di condizione `when`:
|
||
|
||
```yaml
|
||
---
|
||
- name: playbooks with conditions
|
||
hosts: db
|
||
become: true
|
||
|
||
tasks:
|
||
- name: install postgres
|
||
yum:
|
||
name: postgresql
|
||
state: latest
|
||
when: ansible_distribution == 'Ubuntu'
|
||
```
|
||
|
||
Un esempio di `registered variables`:
|
||
|
||
```yaml
|
||
---
|
||
- name: Install and Start HTTPD Service
|
||
hosts: webservers
|
||
become: true
|
||
|
||
tasks:
|
||
- name: Install the httpd package
|
||
yum:
|
||
name: httpd
|
||
state: present
|
||
register: httpd_installation
|
||
|
||
- name: Start the httpd service
|
||
service:
|
||
name: httpd
|
||
state: started
|
||
when: httpd_installation.changed == true
|
||
```
|
||
|
||
Questo task utilizza il modulo yum per installare il pacchetto httpd. Durante l'esecuzione, il risultato dell'installazione viene registrato nella variabile `httpd_installation`. Avvia infine il servizio httpd, ma solo se l'installazione del pacchetto è stata completata con successo.
|