ansible: Rolle in eine Rolle einbeziehen?

73

Ist es möglich, eine Rolle in einer Rolle wiederzuverwenden? Damit meine ich nicht eine Abhängigkeit in der meta / main.yml Datei einer Rolle über die Definition aber einschließlich der Rolle in den Aufgaben / main.yml einer anderen Rolle direkt?

Zum Beispiel definiere ich einige grundlegende Rollen in Rollenbüchern und einige übergeordnete Rollen in Rollen. Ich möchte, dass die übergeordneten Rollen neben bestimmten Aufgaben auch einige der grundlegenden Rollen enthalten.

playbooks/

  rolebooks/
    some_role/

  roles/
    webtier/
      tasks/
        main.yml

In Playbooks / Rollen / Webtier / Tasks / main.yml:

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

Vielen Dank

Michael
quelle
1
Was ist rolebooks?
Peedee

Antworten:

85

Alte Frage, ABER fürs Protokoll : Verwenden Sie Ansible 2.2+ und Sie können loslegen include_role. Genau zu diesem Zweck ... siehe Dokumentation hier .

Schauen Sie sich import_roleauch an ... siehe Dokumentation hier

masu
quelle
11

AFAIK, das kannst du nicht. Dafür sind Abhängigkeiten da.

Wenn Sie Abhängigkeiten vermeiden möchten (weil beispielsweise "Rolle X" zwischen zwei Aufgaben ausgeführt werden soll), können Sie dies im Playbook selbst tun, wenn Sie der Meinung sind, dass die Aufgaben zusammenhängen:

rollen / webtier / aufgaben / main.yml:

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

Alles in allem kommt es darauf an, was Sie genau versuchen. In Ihrem Beispiel scheint "noch beschäftigt" zu bedeuten, dass das rolebooks/some_rolenoch läuft, was nicht möglich ist (hier gibt es keine Parallelität).

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

- 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
Leukos
quelle
6

Sie können nicht, aber Sie können etwas Ähnliches tun.

Für ein Layout von:

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

In nginx/tasks/main.ymlkönnen Sie Ihre allgemeine Aufgabe aufrufen:

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

Beachten Sie, dass Sie, da Sie nicht die typische Importstruktur verwenden, möglicherweise auf eine "Verrücktheit" stoßen, z. B. auf Rollenstandardvariablen, auf die nur zugegriffen werden kann, wenn Sie die Rolle zuvor in die Standardmethode aufgenommen haben.


quelle
1
Wie bereits erwähnt, werden dadurch keine Rollenstandards, Handler usw. importiert, was die Nützlichkeit stark einschränkt.
August
Ja, diese Notiz war aus einem bestimmten Grund enthalten. Sie sind die Pausen. Playbooks oder die meta/main.ymlsollen 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 werden kann. Es zeigt, wie das Hauptspielbuch einer Rolle aufgenommen wird, was sehr unterschiedlich ist.
Marcv81
1
Siehe den Kommentar über deinem und die Notiz, die ich hinterlassen habe. Für manche Menschen ist dies immer noch eine praktikable Sache.
1
Vielen Dank! Der gleiche Hack gilt für das Konsumieren von Dateien / Vorlagen aus der anderen Rolle - template: src=../../common/templates/src.template dest=dest.file
scharf