Справочная информация: в Puppet можно выполнить команду, если она еще не была выполнена:
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', }
Цель: выполнить команду, если она еще не запущена в Ansible
методы
Задачи / main.yml
- name: add vhost sensu
command: rabbitmqctl add_vhost /sensu
Результаты
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": []}
обсуждение
Гугл unless ansible
показал этот документ оwhen
. На основании этой документации when
было добавлено заявление:
- name: add vhost sensu
command: rabbitmqctl add_vhost /sensu
when: rabbitmqctl list_vhosts | grep sensu
выполнение кода привело к:
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"}
- Во-первых, представьте, что все
when
прошло успешно, тогда команда не запустится, и тогда это будет выглядеть какonlyif
в Puppet . - Во-вторых, если было бы успешным, следует ли использовать знак эскалации для имитации разве?
- Использование
register
. Что, если этот файл потерян или vhost был удален, например, человеком? Puppet'sunless
всегда выполняет команды, чтобы было ясно, нужно ли выполнять команду.
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
отредактированный мой ответwhen
Вариант является единственным анзибль имеет относительно условий. Но вы не можете напрямую определить команду там.when
ожидает выражение Jinja и, кроме того, оценивается на управляющем хосте Ansible. Поэтому сначала нужно запустить задачу, чтобы получить результат и зарегистрировать его.stdout_lines
является массивом всех строк, возвращаемых задачей оболочки. Таким образом, вы можете посчитать количество записей и запустить вашу задачу только тогда, когда 0 элементов были возвращеныисточник
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": []}