Hintergrund: In Puppet kann ein Befehl ausgeführt werden, sofern er nicht bereits ausgeführt wurde:
exec { '/bin/echo root >> /usr/lib/cron/cron.allow': path => '/usr/bin:/usr/sbin:/bin', unless => 'grep root /usr/lib/cron/cron.allow 2>/dev/null', }
Ziel: Ausführen eines Befehls, sofern dieser nicht bereits in Ansible ausgeführt wurde
Methoden
Aufgaben / main.yml
- name: add vhost sensu
command: rabbitmqctl add_vhost /sensu
Ergebnisse
TASK [ansible-rabbitmq : add vhost sensu] **************************************
fatal: [111.222.333.444]: FAILED! => {"changed": true, "cmd": ["rabbitmqctl",
"add_vhost", "/sensu"], "delta": "0:00:00.210140", "end":
"2016-07-29 12:55:19.384455", "failed": true, "rc": 2, "start":
"2016-07-29 12:55:19.174315", "stderr": "Error: vhost_already_exists: /sensu",
"stdout": "Creating vhost \"/sensu\" ...", "stdout_lines":
["Creating vhost \"/sensu\" ..."], "warnings": []}
Diskussion
Googeln unless ansible
zeigte dieses Dokument überwhen
. Basierend auf dieser Dokumentation wurde eine when
Erklärung hinzugefügt:
- name: add vhost sensu
command: rabbitmqctl add_vhost /sensu
when: rabbitmqctl list_vhosts | grep sensu
Das Ausführen des Codes führte zu:
fatal: [192.168.0.9]: FAILED! => {"failed": true, "msg": "The conditional
check 'rabbitmqctl list_vhosts | grep sensu' failed. The error was: template
error while templating string: expected token 'end of statement block', got
'list_vhosts'. String: {% if rabbitmqctl list_vhosts | grep sensu %} True {%
else %} False {% endif %}\n\nThe error appears to have been in '/etc/ansible
/roles/ansible-rabbitmq/tasks/main.yml': line 10, column 3, but may\nbe
elsewhere in the file depending on the exact syntax problem.\n\nThe
offending line appears to be:\n\n\n- name: add vhost sensu\n ^ here\n"}
- Stellen Sie sich zunächst vor, dass dies
when
erfolgreich war, dann wird der Befehl nicht ausgeführt und sieht dann eher wieonlyif
in Puppet aus . - Zweitens, wenn das Wann erfolgreich wäre, sollte ein Eskalationszeichen verwendet werden, um ein Es sei denn?
- Verwendung von
register
. Was ist, wenn diese Datei verloren geht oder der vhost beispielsweise von einem Menschen entfernt wurde? Puppetunless
führt die Befehle immer aus, so dass klar ist, ob der Befehl ausgeführt werden muss.
fatal: [IP]: FAILED! => {"changed": true, "cmd": ["rabbitmqctl", "add_vhost", "/sensu"], "delta": "0:00:00.198681", "end": "2016-07-29 13:43:00.870193", "failed": true, "rc": 2, "start": "2016-07-29 13:43:00.671512", "stderr": "Error: vhost_already_exists: /sensu", "stdout": "Creating vhost \"/sensu\" ...", "stdout_lines": ["Creating vhost \"/sensu\" ..."], "warnings": []}
.stdout
bearbeitete meine Antwort.Die
when
Option ist das einzige, was Ansible in Bezug auf die Bedingungen hat. Sie können dort jedoch keinen Befehl direkt definieren.when
erwartet einen Jinja-Ausdruck und wird außerdem auf dem Ansible-Kontrollhost ausgewertet. Sie müssen also zuerst eine Aufgabe ausführen, um das Ergebnis abzurufen und zu registrieren.stdout_lines
ist ein Array aller Zeilen, die die Shell-Task zurückgegeben hat. Sie können also die Anzahl der Einträge zählen und Ihre Aufgabe nur ausführen, wenn 0 Elemente zurückgegeben wurdenquelle
fatal: [IP]: FAILED! => {"changed": true, "cmd": "rabbitmqctl list_vhosts | grep sensu", "delta": "0:00:00.198769", "end": "2016-07-29 13:45:59.069981", "failed": true, "rc": 1, "start": "2016-07-29 13:45:58.871212", "stderr": "", "stdout": "", "stdout_lines": [], "warnings": []}