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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow