В настоящее время я перехожу с марионетки на 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
Когда выполняется вышеуказанное:
- Установлены модули Apache
- Vhosts позволяет
- PHP пытается остановиться и терпит неудачу
- Выход из сценария
- (Где уведомления?)
На этом этапе все кажется логичным, но снова Ansible пытается быть умным (нет! *) Стеки уведомлений, и, таким образом, перезагрузка и перезапуск apache приведет к однократному перезапуску запуска apache в конце подготовки. Это означает, что все уведомления не будут работать !!!
Для некоторых это тоже нормально. Они скажут: `` Эй, просто перезапустите подготовку '', и уведомления будут запущены, таким образом, apache будет, наконец, перезагружен, и сайт снова будет работать. Это не так.
При втором запуске скрипта после исправления кода для установки php уведомления не будут запускаться из-за дизайна. Почему?
Вот почему: Ansible будет иметь задачи, которые были успешно выполнены, помеченные как Done / Green, таким образом, не регистрируя никаких уведомлений для этих задач. Подготовка будет успешной, и для того, чтобы вызвать уведомление и, следовательно, перезапустить apache, вы можете выполнить одно из следующих действий:
- Запустите прямую команду на сервер через ansible или ssh
- Отредактируйте сценарий, чтобы запустить задачу
- Добавьте для этого отдельную задачу
- Уничтожить экземпляр коробки и перепроверить
Это довольно неприятно, потому что требует полной очистки коробки, или я что-то неправильно понимаю с Ansible?
Есть ли другой способ «вернуть» / воспроизвести / принудительно выполнить уведомления?
- Было бы разумно либо пометить задачу как незавершенную и затем перезапустить уведомления, либо сохранить отдельную очередь с уведомлениями как собственными задачами *.