Ansible Как воспроизвести уведомления

В настоящее время я перехожу с марионетки на Ansible, и меня немного смущают некоторые концепции или, по крайней мере, то, как работает ansible.

Немного информации о настройке:

Я использую примеры из Ansible Best Practices и структурировал свой проект аналогично с несколькими ролями (playbooks ) и так далее.

Я использую Vagrant для обеспечения, а поле - Saucy64 VBox.

Где возникает путаница:

Когда я инициализирую и запускаю ansible, начинают выполняться задачи, а затем - стек уведомлений.

Пример:

Последняя задача:

TASK: [mysql | delete anonymous MySQL server user for localhost] ************** 
<127.0.0.1> REMOTE_MODULE mysql_user user='' state=absent 
changed: [default] => {"changed": true, "item": "", "user": ""}

Затем первое уведомление:

NOTIFIED: [timezone | update tzdata] ****************************************** 
<127.0.0.1> REMOTE_MODULE command /usr/sbin/dpkg-reconfigure --frontend noninteractive tzdata
changed: [default] => {"changed": true, "cmd": ["/usr/sbin/dpkg-reconfigure", "--frontend", "noninteractive", "tzdata"], "delta": "0:00:00.224081", "end": "2014-02-03 22:34:48.508961", "item": "", "rc": 0, "start": "2014-02-03 22:34:48.284880", "stderr": "\nCurrent default time zone: 'Europe/Amsterdam'\nLocal time is now:      Mon Feb  3 22:34:48 CET 2014.\nUniversal Time is now:  Mon Feb  3 21:34:48 UTC 2014.", "stdout": ""}

Теперь все в порядке. По мере увеличения ролей появлялось все больше и больше уведомлений.

Вот и проблема.

В случае сбоя уведомления подготовка останавливается как обычно. Но тогда стек уведомлений пуст! Это означает, что все уведомления о том, что после неисправного, выполняться не будут!

Если это так, то, если вы измените параметр vhosts для apache и получите уведомление для перезагрузки службы apache, это будет потеряно.

Приведем пример (псевдоязык):

- name: Install Apache Modules
  notify: Restart Apache

- name: Enable Vhosts
  notify: Reload Apache

- name: Install PHP
  command: GGGGGG # throws an error

Когда выполняется вышеуказанное:

  1. Установлены модули Apache
  2. Vhosts позволяет
  3. PHP пытается остановиться и терпит неудачу
  4. Выход из сценария
  5. (Где уведомления?)

На этом этапе все кажется логичным, но снова Ansible пытается быть умным (нет! *) Стеки уведомлений, и, таким образом, перезагрузка и перезапуск apache приведет к однократному перезапуску запуска apache в конце подготовки. Это означает, что все уведомления не будут работать !!!

Для некоторых это тоже нормально. Они скажут: `` Эй, просто перезапустите подготовку '', и уведомления будут запущены, таким образом, apache будет, наконец, перезагружен, и сайт снова будет работать. Это не так.

При втором запуске скрипта после исправления кода для установки php уведомления не будут запускаться из-за дизайна. Почему?

Вот почему: Ansible будет иметь задачи, которые были успешно выполнены, помеченные как Done / Green, таким образом, не регистрируя никаких уведомлений для этих задач. Подготовка будет успешной, и для того, чтобы вызвать уведомление и, следовательно, перезапустить apache, вы можете выполнить одно из следующих действий:

  1. Запустите прямую команду на сервер через ansible или ssh
  2. Отредактируйте сценарий, чтобы запустить задачу
  3. Добавьте для этого отдельную задачу
  4. Уничтожить экземпляр коробки и перепроверить

Это довольно неприятно, потому что требует полной очистки коробки, или я что-то неправильно понимаю с Ansible?

Есть ли другой способ «вернуть» / воспроизвести / принудительно выполнить уведомления?

  • Было бы разумно либо пометить задачу как незавершенную и затем перезапустить уведомления, либо сохранить отдельную очередь с уведомлениями как собственными задачами *.

person Jimmy Kane    schedule 03.02.2014    source источник


Ответы (2)


Да, это один из недостатков Ansible по сравнению с Puppet. Puppet является декларативным и не вызывает ошибок, как Ansible (или Chef) в этом отношении. У него есть свои плюсы и минусы, например, Puppet требует немного времени, прежде чем он начнет работать, потому что ему нужно скомпилировать свой каталог.

Итак, вы правы, если ваш скрипт Ansible выдает ошибки, то ваши уведомления не обновляются. Единственный способ обойти это - использовать условные операторы. В своей пьесе вы можете сделать что-то вроде этого:

- name: My cool playbook
  hosts: all

  vars:
      force_tasks: 0

  tasks:
    - name: Apache install
      action: apt pkg=$item state=latest
      with_items:
       - apache2
       - apache2-mpm-prefork

    - name: Restart apache
      action: service name=apache2 state=restart
      when: force_tasks

Затем, когда вы запустите свой playbook, вы можете передать force_tasks в качестве переменной среды:

ansible-playbook -i my_inventory -e "force_tasks=True" my_ansible_playbook.yml

Вы можете сделать это аналогичным образом с помощью тегов.

person Rico    schedule 07.02.2014
comment
Танки Рико. Это почти тот подход, который я использовал. Я добавил, правда, не как переменную, а как тег. Я считаю, что это более подходящее. - person Jimmy Kane; 08.02.2014

Запустите ansible-playbook с флагом --force-handlers. Это указывает Ansible запускать любые обработчики в очереди, даже если задача не выполняется и дальнейшая обработка останавливается. Разработчики Ansible планируют добавить это в качестве опции в файл ansible.cfg, чтобы его можно было настроить глобально и забыть о нем. Я не знаю, каковы временные рамки для этого.

person John McNulty    schedule 06.03.2015