2016-04-04 17 views
2

Ich versuche meinen Weg aus einem Abhängigkeitsdickicht zu finden. Ich benutze Ansible 1.9.2.Führe immer eine ansible Rolle vor einer anderen Rolle

In einem einzigen Playbook möchte ich in der Lage sein, eine Galaxy-Rolle (in dem Fall die Rolle Datadog.datadog) zu installieren und zu konfigurieren. Aber Ansible barrt immer; Da die Datadog.datadog-Rolle nicht existiert, bis eine andere Rolle, die ich geschrieben habe, die Galaxy-Rolle installiert, wird sie nicht ausgeführt. Dies ist, wie ich wirklich würde, wie es zu sein, die anderen Rollen Ausschneiden, dass mein Textbuch verwendet:

- hosts: all 
    roles: 
    - install_datadog 
    - (some other roles...) 
    - { role: Datadog.datadog, sudo: true } 
    vars: 
    datadog_api_key: "somekey" 

ich alle folgenden versucht habe, und keiner von ihnen arbeiten, um die ansible Galaxy Datadog.datadog für die Installation Rolle zuerst:

  • Ich habe einen früheren Block im selben Playbook, der meine Rolle install_datadog ausführt.
  • Verwenden Sie eine 'include'-Anweisung früher im Playbook, die die main.yml der install_datadog-Rolle enthält.
  • Erstellen einer pre_task-Anweisung im obigen Playbook.
  • Das Definieren einer Rollenabhängigkeit macht keinen Sinn, da Datadog.datadog noch nicht existiert, daher kann ich keine Abhängigkeiten darin definieren. Es gibt immer ein Fehler verwandt dies:

    ERROR: cannot find role in /etc/ansible/roles/Datadog.datadog 
    

    Das einzige, was ich an die Arbeit kann in einem vorherigen Lauf der install_datadog Rolle ausführt. Dies ist keine großartige Lösung, da zuvor ein Playbook mit vielen Ausführungsblöcken und Rollenaufrufen die gesamte Umgebung konfiguriert hat. dies würde die Ausführung von zwei Spielbüchern in einer bestimmten Reihenfolge erfordern, was sehr unelegant ist.

    Wie kann ich also in einer einzelnen Ausführung eine Galaxy-Rolle auflösen, die nicht existiert, bis eine frühere Rolle ausgeführt wurde, um sie zu installieren?

    +0

    Warum benötigen Sie die Rolle jedes installieren Zeit? Arbeiten Sie Ansible im Pull-Modus? – ydaetskcoR

    +0

    Ich muss die Rolle nicht jedes Mal installieren, aber immer wenn dieses Playbook läuft (es ist im Wesentlichen das "configure/reconfigure the environment" playbook), sollte es sicherstellen, dass die Rolle da ist. Und es ist idempotent, also ist das "install_" in seinem Titel vielleicht etwas irreführend. – maxn

    +0

    Ich bin verwirrt von Ihrem Workflow. Ich verwende Galaxy überhaupt nicht, also nicht sicher, wie es sich auf deinen Workflow auswirkt, aber normalerweise speicherst du alle deine Ansible-Spiele und Rollen in der Quellcodeverwaltung und die gezogene Galaxy-Rolle sollte nicht anders sein. Sobald Sie die Rolle zum ersten Mal in Ihrem Quellcodeverwaltungsrepository abgerufen haben, führen Sie Ihre anderen Wiedergaben für diese Kopie aus. – ydaetskcoR

    Antwort

    0

    Vergewissern Sie sich, dass Ihr roles_path korrekt ist. Die Variable roles_path in ansible.cfg gibt an, wo ansible nach Rollen sucht, und die --roles-path-Option zu ansible-galaxy gibt an, wo die Datadog-Rolle installiert wird.

    Zum Beispiel meine Aufgabe installieren sieht wie folgt aus:

    ansible-galaxy install Datadog.datadog --roles-path=/usr/home/vagrant

    und in meiner ansible.cfg Datei Ich habe diese Zeile:

    roles_path = /vagrant/ansible/roles:/usr/home/vagrant