2014-10-24 20 views
37

È possibile riutilizzare un ruolo in un ruolo? Non intendo tramite la definizione di una dipendenza nel file meta/main.yml di un ruolo ma per incluso il ruolo nelle attività/main.yml di un altro ruolo direttamente?ansible: include il ruolo in un ruolo?

Ad esempio, definisco un paio di ruoli di base nei rolebooks e alcuni ruoli di alto livello nei ruoli. Desidero che i ruoli di alto livello includano alcuni ruoli di base oltre ad alcune attività specifiche.

playbooks/ 

    rolebooks/ 
    some_role/ 

    roles/ 
    webtier/ 
     tasks/ 
     main.yml 

In Playbook/ruoli/webtier/attività/main.yml:

- shell: echo 'hello' 
- { role: rolebooks/some_role } 
- shell: echo 'still busy' 

Grazie

risposta

11

AFAIK, non si può. Questo è il motivo delle dipendenze.

Se si vuole evitare le dipendenze (perché, per esempio, si vuole 'ruolo X' a correre tra due attività), si può fare questo nel playbook per sé, se si pensa che i compiti sono legati:

ruoli /webtier/tasks/main.yml:

- shell: echo 'hello' 
- include: webtier.yml 
- shell: echo 'role done' 

tutto sommato, dipende da quello che stai cercando di fare esattamente. Ma nel tuo esempio, 'ancora occupato' sembra implicare che il rolebooks/some_role sia ancora in esecuzione, il che non è possibile (non c'è concorrenza qui).

Ovviamente, si può anche Fasi ruoli in un maestro playbook (che è probabilmente quello che si fa già):

- name: Polite foo stuff 
    hosts: foo_hosts 
    roles: 
    - say_hello 
    - rolebooks/some_role 
    - say_bye 

- name: Unpolite foo stuff 
    hosts: !foo_hosts 
    roles: 
    - rolebooks/some_role 
5

Non è possibile, ma si può fare qualcosa di simile tipo.

Per un layout di:

roles/ 
    ... 
    common/tasks/main.yml 
    nginx/tasks/main.yml 
    ... 

In nginx/tasks/main.yml, è possibile chiamare il compito comune:

- name: Call the 'common' role to do some general setup 
    include: ../../common/tasks/main.yml 

Nota che, poiché non si sta usando la struttura tipica di importazione, si potrebbe incorrere in alcune "stranezze" come le variabili di default del ruolo non sono accessibili a meno che tu non abbia incluso il ruolo nella moda standard in precedenza.

+1

Come indicato, questo non riesce ad importare i valori predefiniti di ruolo, i gestori, ecc. Che ne limitano notevolmente l'utilità. – augurar

+0

sì, quella nota è stata inclusa per un motivo. loro sono le pause. i playbook o il 'meta/main.yml 'sono pensati per essere l'unità di struttura, anche se alcuni di noi pensano che i ruoli riempiano meglio questo scopo. –

+2

Questa soluzione * non * mostra come includere un ruolo. Mostra come includere il playbook principale di un ruolo, che è molto diverso. – marcv81

1

Mi rendo conto che non ha detto usando i meta dipendenze, ma la soluzione migliore che ho messo a punto è quello di creare un ruolo che solo contiene meta/dependency.yml

Questo consente a qualsiasi numero di ruoli da includere nell'ordine corretto.

Assicurarsi di impostare allow_duplicates: sì

--- 
allow_duplicates: yes 
dependencies: 
    - { role: app-install-rpms,   tags: ['rpms'] } 
    - { role: app-java-config,   tags: ['config'] } 
    - { role: app-directories,   tags: ['dirs'] } 
    - { role: app-config-site_management, tags: ['site_management'] } 
    - { role: app-config-initd,   tags: ['initd'] } 
    - { role: tomcat-boapp,    tags: ['config'] } 

Questo ci permette di chiamare in sostanza un ruolo da un ruolo.

37

Vecchia domanda MA per il record: usare Ansible 2.2+ e sei pronto per andare con include_role. Esattamente per questo scopo ... vedi la documentazione here.

Problemi correlati