2014-10-24 19 views
37

Ist es möglich, eine Rolle in einer Rolle wiederzuverwenden? Ich meine nicht durch Definieren einer Abhängigkeit in der meta/main.yml-Datei einer Rolle, sondern durch einschließlich die Rolle in der tasks/main.yml einer anderen Rolle direkt?ansible: Rolle in einer Rolle einschließen?

Zum Beispiel, ich definiere ein paar grundlegende Rollen in Rollenbüchern und einige höhere Rollen in Rollen. Ich möchte, dass die High-Level-Rollen einige der grundlegenden Rollen zusätzlich zu bestimmten Aufgaben enthalten.

playbooks/ 

    rolebooks/ 
    some_role/ 

    roles/ 
    webtier/ 
     tasks/ 
     main.yml 

In Playbooks/Rollen/webtier/Aufgaben/main.yml:

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

Dank

Antwort

11

AFAIK, können Sie nicht. Das sind Abhängigkeiten.

Wenn Sie möchten, um Abhängigkeiten vermeiden (weil Sie zum Beispiel die Rolle von X 'wollen zwischen zwei Aufgaben ausgeführt werden), können Sie dies im Textbuch tun können, selbst wenn Sie die Aufgaben denken beziehen:

Rollen /webtier/tasks/main.yml:

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

alles in allem hängt es davon ab, was Sie versuchen genau das zu tun. Aber in Ihrem Beispiel scheint "immer noch beschäftigt" zu implizieren, dass die rolebooks/some_role noch läuft, was nicht möglich ist (hier gibt es keine Nebenläufigkeit).

Natürlich können Sie auch Rollen in einem Master-Playbook-Sequenz (was wahrscheinlich ist, was Sie tun bereits):

- 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

Sie können nicht, aber man kann etwas Art ähnlich tun.

Für ein Layout:

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

Beachten Sie, dass, weil Sie die typische Importstruktur unter Verwendung sind nicht, Sie laufen in vielleicht:

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

In nginx/tasks/main.yml, können Sie Ihre gemeinsame Aufgabe aufrufen einige "Seltsamkeiten" wie Rollenstandardvariablen sind nicht zugänglich, es sei denn, Sie haben die Rolle früher in die Standardfunktion aufgenommen.

+1

Wie bereits erwähnt, können Rollenvorgaben, Handler usw. nicht importiert werden, was die Verwendbarkeit stark einschränkt. – augurar

+0

Yep, diese Notiz wurde aus einem Grund enthalten. Sie sind die Pausen. Playbooks oder das "meta/main.yml" sollen die Einheit der Struktur sein, obwohl einige von uns denken, dass Rollen diesen Zweck besser erfüllen. –

+2

Diese Lösung zeigt * nicht *, wie eine Rolle eingefügt wird. Es zeigt, wie man das Haupt-Playbook einer Rolle einbindet, was sehr unterschiedlich ist. – marcv81

1

Ich schätze, dass Sie das nicht Meta-Abhängigkeiten verwenden, aber die beste Lösung, die ich mit kommen haben, ist eine Rolle zu erstellen, dass nur enthält meta/dependency.yml

Diese beliebige Anzahl von Rollen können einbezogen werden in der richtigen Reihenfolge.

Stellen Sie sicher, dass Sie allow_duplicates gesetzt: ja

--- 
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'] } 

Diese uns im Wesentlichen zu können, eine Rolle aus einer Rolle nennen.

37

Alte Frage ABER für den Rekord: Verwenden Sie Ansible 2.2 + und Sie sind gut mit include_role gehen. Genau zu diesem Zweck ... siehe Dokumentation here.

Verwandte Themen