Что эквивалентно «разве что» в Puppet в Ansible?

9

Справочная информация: в 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"}
  1. Во-первых, представьте, что все whenпрошло успешно, тогда команда не запустится, и тогда это будет выглядеть как onlyifв Puppet .
  2. Во-вторых, если было бы успешным, следует ли использовать знак эскалации для имитации разве?
  3. Использованиеregister . Что, если этот файл потерян или vhost был удален, например, человеком? Puppet's unlessвсегда выполняет команды, чтобы было ясно, нужно ли выполнять команду.
+030
источник

Ответы:

9

Я думаю, что вы ищете, это:

- name: get vhosts
  command: rabbitmqctl list_vhosts
  register: vhosts
  changed_when: false

- name: add vhost sensu
  command: rabbitmqctl add_vhost /sensu
  when: "'/sensu' not in vhosts.stdout"

Re: # 3 registerне создает файл. Если вы записываете выходные данные rabbitmqctl list_vhostsчерез register, содержимое будет таким же действительным, как и текущее состояние системы.

jscott
источник
3

Проблема в линии when: rabbitmqctl list_vhosts | grep sensu. Здесь невозможно использовать bash.

Вам необходимо поместить rabbitmqctl list_vhosts | grep sensuотдельное задание и зарегистрировать результат, чтобы использовать его в предложении when. Вы можете использовать notфильтр, чтобы получить unlessподобное поведение.

Примерно так должно работать:

- name: Get rabbitmq vhosts.
  command: rabbitmqctl list_vhosts | grep sensu
  register: rabbitmq_vhosts

- name: add vhost sensu
  command: rabbitmqctl add_vhost /sensu
  when: not 'sensu' in rabbitmq_vhosts.stdout

В Get rabbitmq vhosts.этом примере всегда будет выполняться. add vhost sensuТолько если строка зепзи не в учете rabbitmq_vhosts.

Обратитесь к документации по условным фильтрам и фильтрам jinja для получения дополнительной информации.

Хенрик Пингел
источник
Проблема сохраняется: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": []}
030
хм, наверное моя вина. Я думаю, это был пропущенный .stdoutотредактированный мой ответ
Хенрик Пингел
0

whenВариант является единственным анзибль имеет относительно условий. Но вы не можете напрямую определить команду там. whenожидает выражение Jinja и, кроме того, оценивается на управляющем хосте Ansible. Поэтому сначала нужно запустить задачу, чтобы получить результат и зарегистрировать его.

- shell: rabbitmqctl list_vhosts | grep sensu
  register: sensu_vhosts

- name: add vhost sensu
  command: rabbitmqctl add_vhost /sensu
  when: sensu_vhosts.stdout_lines < 1

stdout_linesявляется массивом всех строк, возвращаемых задачей оболочки. Таким образом, вы можете посчитать количество записей и запустить вашу задачу только тогда, когда 0 элементов были возвращены

udondan
источник
2
если / Sensu vhost не существует, это приводит к: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": []}
030