ansible
ruoli
Ricerca…
Utilizzo dei ruoli
Ansible usa il concetto di ruoli per meglio consentire il codice modulare ed evitare di ripetersi.
Un ruolo è semplicemente una struttura di cartelle che Ansible sa dove caricare i file, le attività e i gestori di vars. Un esempio potrebbe essere simile a questo:
apache/
├── defaults
│ └── main.yml
├── files
│ ├── mod-pagespeed-stable_current_i386.deb
│ ├── mod-pagespeed-stable_current_i386.rpm
│ ├── mod-pagespeed-stable_current_amd64.deb
| └── mod-pagespeed-stable_current_x86_64.rpm
├── tasks
│ ├── debian.yml
│ ├── main.yml
│ └── redhat.yml
├── templates
│ ├── httpd.conf.j2
│ └── sites-available
│ └── virthualhost.conf.j2
└── vars
├── debian
└── redhat
Puoi quindi utilizzare il ruolo con un playbook di base che assomiglia a questo:
- hosts: webservers
roles:
- apache
Quando esegui Ansible su questo libro di gioco, esso verrà indirizzato a tutti gli host nel gruppo webservers
ed eseguirà il ruolo apache
definito sopra contro di esso, caricando automaticamente tutte le variabili predefinite per il ruolo ed eseguendo tutte le attività incluse in tasks/main.yml
. Ansible sa anche cercare determinati tipi di file in posizioni di facile utilizzo:
Se esistono ruoli / x / tasks / main.yml, le attività elencate in esso verranno aggiunte al gioco
Se esistono ruoli / x / handlers / main.yml, i gestori in esso elencati verranno aggiunti al gioco
Se esistono ruoli / x / vars / main.yml, le variabili elencate in esso verranno aggiunte al gioco
Se role / x / meta / main.yml esiste, tutte le dipendenze dei ruoli elencate in questo verranno aggiunte all'elenco dei ruoli (1.3 e successive)
Qualsiasi copia, script, modello o attività di inclusione (nel ruolo) può fare riferimento a file in ruoli / x / {file, modelli, attività} / (la directory dipende dall'attività) senza doverli percorrere relativamente o in modo assoluto
Dipendenze dei ruoli
I ruoli consentono anche di definire altri ruoli come dipendenza creando un file meta/main.yml
con un blocco di dependencies
:
dependencies:
- role: common
È anche possibile passare un valore a un parametro / variabile nel ruolo dipendente:
dependencies:
- { role: common, some_parameter: 3 }
O addirittura eseguire il ruolo dipendente in modo condizionale:
dependencies:
- { role: common, some_parameter: 3 }
- { role: sshd, enable_sshd: false,
when: environment == 'production' }
I ruoli dipendenti vengono sempre eseguiti prima dei ruoli che dipendono da essi. Inoltre, vengono eseguiti solo una volta. Se due ruoli indicano lo stesso come dipendenza, viene eseguito solo la prima volta.
Immagina i ruoli role1, role2 e role3 con i seguenti folling meta/main.yml
:
Role1 / meta / main.yml:
dependencies:
- role: role3
Role2 / meta / main.yml:
dependencies:
- role: role3
Quando si eseguono role1 e role2 nella stessa cartella di gioco (con role1 chiamato prima di role2), l'ordine di esecuzione sarebbe il seguente:
role3 -> role1 -> role2
È possibile sovrascrivere questo comportamento specificando allow_duplicates: yes
in meta/main.yml
di role1 e role2. L'ordine di esecuzione risultante sarebbe:
role3 -> role1 -> role3 -> role2
Separazione di compiti e variabili specifici della distribuzione all'interno di un ruolo
Possiamo facilmente separare compiti e variabili specifici della distribuzione in diversi file .yml dedicati. Ansible ci aiuta a identificare automaticamente la distribuzione degli host di destinazione tramite {{ ansible_distribution }}
e {{ ansible_distribution_version }}
, quindi dobbiamo solo nominare i file .yml dedicati alla distribuzione di conseguenza.
Per Ubuntu Xenial il ruolo base dell'albero delle directory sarebbe quindi simile a questo:
role
├── tasks
│ ├── main.yml
│ └── Ubuntu16.04.yml
└── vars
└── Ubuntu16.04.yml
All'interno di tasks/main.yml
ora possiamo includere automaticamente le variabili e le attività corrette per la distribuzione degli host di destinazione.
compiti / main.yml
---
- name: include distribution specific vars
include_vars: "{{ ansible_distribution }}{{ ansible_distribution_version }}.yml"
- name: include distribution specific install
include: "{{ ansible_distribution }}{{ ansible_distribution_version }}.yml"
All'interno delle tasks/Ubuntu16.06.yml
e vars/Ubuntu16.04.yml
possiamo ora definire task e variabili rispettivamente per Uben Xenial.