it-swarm.com.de

ansible: Rolle in eine Rolle einbinden?

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

Zum Beispiel definiere ich ein paar grundlegende Rollen in Rollenbüchern und einige Rollen auf höherer Ebene 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/role/webtier/tasks/main.yml:

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

Vielen Dank

58
Michael

Alte Frage, ABER für den Datensatz : Verwenden Sie Ansible 2.2+ und Sie können mit include_role Weitermachen. Genau zu diesem Zweck ... siehe Dokumentation hier .

Schauen Sie sich auch import_role An ... siehe Dokumentation hier

77
masu

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

Wenn Sie Abhängigkeiten vermeiden möchten (z. B. weil 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 tun wollen. Aber in Ihrem Beispiel scheint "immer noch beschäftigt" zu bedeuten, dass die rolebooks/some_role läuft noch, 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
11
leucos

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
    ...

Im nginx/tasks/main.yml können Sie Ihre gemeinsame 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 einige "seltsame" Rollenstandardvariablen stoßen, auf die Sie nur zugreifen können, wenn Sie die Rolle zuvor in die Standardmethode aufgenommen haben.

5
user559633

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

Auf diese Weise können beliebig viele Rollen in die richtige Reihenfolge aufgenommen werden.

Stellen Sie sicher, dass Sie allow_duplicates gesetzt haben: yes

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

Dies ermöglicht es uns, im Wesentlichen eine Rolle von einer Rolle abzurufen.

2
James Morgan