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 ansiblezeigte dieses Dokument überwhen . Basierend auf dieser Dokumentation wurde eine whenErklä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
whenerfolgreich war, dann wird der Befehl nicht ausgeführt und sieht dann eher wieonlyifin 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? Puppetunlessfü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": []}