Files
learning/ansible/003-playbook.md
2025-08-29 21:53:05 +02:00

5.5 KiB
Raw Blame History

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:

---
- 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
  • lopzione become: true indica che i task devono essere eseguite con privilegi elevati, tipicamente utilizzando sudo

Un esempio di playbook con due play:

---
- 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:

  • linventory 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
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 lesecuzione di un task in base allesito di un task già eseguito
  • variabili definite nel playbook o nell'inventory

Un semplice esempio di condizione when:

---
- 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:

---
- 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.

Loops

I loop in Ansible consentono di ripetere un task più volte all'interno di un playbook, evitando la necessità di riscrivere blocchi di codice che eseguono la stessa operazione.

I tre tipi principali di loop sono:

  • Liste
  • Liste di hash
  • Dizionari

Liste

Per i loop di liste, si utilizza la parola chiave loop, seguita da una lista di stringhe. Il task verrà eseguito tante volte quante sono le stringhe nella lista, e {{ item }}, nel task, assumerà il valore dell'elemento iesimo.

---
- name: playbook with loop
  hosts: db
  become: true

  tasks:
    - name: add users
      user:
        name: "{{ item }}"
      loop:
        - userOne
        - userTwo

Liste di hash

Per i loop di liste di hash, si utilizza la medesima parola chiave loop, ma la lista contiene elementi chiavi: valore. In questo caso, si può accedere ai valori usando la sintassi {{ item.key }}.

---
- name: Playbook con loop su lista di hash
  hosts: db
  become: true

  tasks:
    - name: add users
      user:
        name: "{{ item.name }}"
        uid: "{{ item.uid }}"
        shell: "{{ item.shell }}"
      loop:
        - { name: 'userOne', uid: 1001, shell: '/bin/bash' }
        - { name: 'userTwo', uid: 1002, shell: '/bin/zsh' }