Contexte: dans Puppet, il est possible d'exécuter une commande à moins qu'elle n'ait déjà été exécutée:
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', }
Objectif: exécuter une commande à moins qu'elle n'ait déjà été exécutée dans Ansible
Les méthodes
tâches / main.yml
- name: add vhost sensu
command: rabbitmqctl add_vhost /sensu
Résultats
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": []}
Discussion
Google a unless ansible
montré ce documentwhen
. Sur la base de cette documentation, une when
déclaration a été ajoutée:
- name: add vhost sensu
command: rabbitmqctl add_vhost /sensu
when: rabbitmqctl list_vhosts | grep sensu
l'exécution du code a entraîné:
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"}
- Tout d'abord, imaginez que cela
when
a réussi, puis la commande ne s'exécutera pas, puis elle ressemble plusonlyif
à Puppet . - Deuxièmement, si le moment est couronné de succès, faut-il utiliser une marque d'escalade pour simuler un à moins?
- Utilisation de
register
. Que faire si ce fichier est perdu ou si le vhost a été supprimé par exemple par un humain? Puppetunless
exécute toujours les commandes de sorte qu'il soit clair si la commande doit être exécutée.
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
modification manquante de ma réponse.L'
when
option est la seule chose qu'Ansible a concernant les conditions. Mais vous ne pouvez pas y définir directement une commande.when
attend une expression Jinja et est en outre évalué sur l'hôte de contrôle Ansible. Vous devez donc d'abord exécuter une tâche pour récupérer le résultat et l'enregistrer.stdout_lines
est un tableau de toutes les lignes renvoyées par la tâche shell. Vous pouvez donc compter le nombre d'entrées et exécuter votre tâche uniquement lorsque 0 élément a été retournéla source
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": []}