ansible: mit with_items mit notify-handler
Möchte ich übergeben Sie eine variable, um eine Benachrichtigung handler, kann aber nirgendwo finden werden Sie es hier auf, SO dass die docs oder die Probleme in der github repo, wie es zu tun. Was ich Tue, ist die Bereitstellung von webapps, und wenn Sie den code für eines dieser webapps geändert wird, wird es neu starten soll der Dienst für die webapp.
Vom diese Frage ALSO, habe ich diese zu arbeiten, etwas:
- hosts: localhost
tasks:
- name: "task 1"
shell: "echo {{ item }}"
register: "task_1_output"
with_items: [a,b]
- name: "task 2"
debug:
msg: "{{ item.item }}"
when: item.changed
with_items: task_1_output.results
(Legen Sie es in test.yml und führen Sie es mit ansible-playbook test.yml -c local
.)
Aber dadurch wird das Ergebnis von der ersten Aufgabe und bedingt Schleifen über, die in der zweiten Aufgabe. Mein problem ist, es wird chaotisch, wenn Sie zwei oder mehr Aufgaben, die Notwendigkeit zu informieren, die zweite Aufgabe! Zum Beispiel, starten Sie den Webdienst neu, wenn entweder der code wurde aktualisiert, oder die Konfiguration wurde geändert.
AFAICT, gibt es keine Möglichkeit, übergeben Sie eine variable an eine Prozedur. Das würde sauber für mich zu beheben. Ich fand einige Themen auf github, wo andere Leute das gleiche problem haben, und manche Schreibweisen werden vorgeschlagen, aber keiner von Ihnen wirklich funktionieren.
Einschließlich einer sub-playbook wird nicht funktionieren, weil mit with_items
zusammen mit include
war veraltet.
In meinem playbooks, ich habe eine site.yml
dass die Listen der Rollen, in der Gruppe, dann in der group_vars
für diese Gruppe definiere ich die Liste der webapps (einschließlich der Versionen), die installiert werden soll. Dies scheint korrekt zu mir, denn auf diese Weise kann ich mit dem gleichen Textbuch für die Inszenierung und Produktion. Aber vielleicht die einzige Lösung ist, um zu definieren, die Rolle mehrere Male, und duplizieren Sie die Liste der Rollen für die Inszenierung und Produktion.
Also, was ist die Weisheit hier?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Variablen in Ansible sind global, so dass es keinen Grund gibt, übergeben Sie eine variable, um handler. Wenn Sie versuchen, einen handler so parametrisiert, dass Sie versuchen, eine variable zu verwenden, im Namen einer Prozedur, werden Sie nicht in der Lage, das zu tun, Ansible.
Was Sie tun können, ist einen handler erstellen, die loops über eine Liste von Dienstleistungen, die leicht genug, hier ist ein funktionierendes Beispiel, die getestet werden können lokal:
Ich schließlich löste es, indem die Aufteilung der apps über mehrere Instanzen derselben Rolle. Auf diese Weise werden die handler in der Rolle beziehen sich auf Variablen, die definiert sind als variable Rolle.
Ort.yml:
In Rollen/etwas/tasks/main.yml:
In Rollen/etwas/Handler/main.yml:
Scheint viel weniger hackish als die erste Lösung!
name
nach der ersten Rolle, die Anrufung, dera
hier, auch ausgelöst durch eine anschließende Rolle-Aufruf. Da die handler und die Benachrichtigung sind global über die Rolle aufrufen, können Sie einstellen, wie diese."something happened to {{ name }}"
im Aufgaben/main.yml und durch eine änderung der name der Prozedur, die zu"something happened to {{ name }}"
.Aktualisieren jarv die Antwort von oben. Ansible 2.5 ersetzt
with_items
mitloop
. Wenn erste Ergebnisseitem
von selbst wird das nicht funktionieren. Sie müssen explizit den Namen, z.B.item.name
.