Background: no Puppet, é possível executar um comando a menos que já tenha sido executado:
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',
}
Objetivo: executar um comando, a menos que já tenha sido executado no Ansible
Métodos
tarefas / main.yml
- name: add vhost sensu
command: rabbitmqctl add_vhost /sensu
Resultados
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": []}
Discussão
pesquisando unless ansible
mostrou este documento sobre when
. Com base nessa documentação, uma instrução when
foi adicionada:
- name: add vhost sensu
command: rabbitmqctl add_vhost /sensu
when: rabbitmqctl list_vhosts | grep sensu
a execução do código resultou em:
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"}
- Antes de tudo, imagine que
when
foi bem-sucedido, então o comando não será executado e, em seguida, será mais parecido com onlyif
no Puppet .
- Em segundo lugar, se o quando for bem-sucedido, uma marcação de escala deve ser usada para simular, a menos que?
-
Uso de
register
. E se esse arquivo for perdido ou o vhost for removido por, por exemplo, um humano? O unless
do Puppet sempre executa os comandos para que fique claro se o comando precisa ser executado.