![](https://habrastorage.org/getpro/habr/upload_files/b81/c04/e76/b81c04e768cba93d5dd3ab0c4462da7c.png)
Как-то раз я решил задействовать ansible (очень популярный инструмент управления конфигурациями) в системе, развернутой в продакшене. Когда дело доходит до систем, развернутых в продакшене, нам очень важно знать, какие конфигурации применились успешно, а какие нет.
Некоторое время поискав решение на просторах сети, я так и не смог найти простой способ отслеживать неудачное выполнение. Поэтому я придумал следующее решение.
Базовый рабочий процесс решения
Сохранение вывода плейбука в специальный файл (на каждом хосте) с помощью log_plays.
Передача логов в elasticsearch с помощью filebeat.
Наконец, визуализация информации с помощью kibana.
![Базовая структура решения для мониторинга работы плейбука Базовая структура решения для мониторинга работы плейбука](https://habrastorage.org/getpro/habr/upload_files/2c2/750/c41/2c2750c41a243f1be516ec17c8863819.jpg)
Реализация решения
Весь код можно найти здесь: monitor-ansible-playbook-executions
Ansible предоставляет нам колбек, который записывает вывод плейбука в специальный файл на каждом хосте с помощью следующей конфигурации:
-- ansible.cfg
[defaults]
stdout_callback = log_plays
Вывод в логах плейбука будет в следующем формате:
time - path-to-playbook - task-name - task-command - task-status - task-output
time - path-to-playbook - task-name - task-command - task-status - task-output
Затем эти логи парсит filebeat (с помощью обработчика dissect). Поскольку между двумя сообщениями есть пустая строка, мы будем выполнять условный парсинг.
processors:
- dissect:
when:
not:
equals:
message: ""
tokenizer: "%{time} - %{playbook_path} - %{task_name} - %{task_cmd} - %{task_status} - %{task_output}"
field: "message"
target_prefix: "ansible"
Обработчик script добавит в логи информацию о хостах:
- script:
lang: javascript
source: >
function process(event) {
var ansible_path = event.Get("log.file.path");
var host = ansible_path.split("/").pop();
event.Put('ansible.host', host)
}
Наконец, логи публикуются в elasticsearch.
output.elasticsearch:
enabled: true
hosts: ["elasticsearch-1:9200"]
Теперь можно визуализировать эту информацию с помощью kibana и добавить наблюдателей, чтобы информировать команду о сбоях.
![Статус выполнения Ansible — успех или сбой Статус выполнения Ansible — успех или сбой](https://habrastorage.org/getpro/habr/upload_files/c95/6b8/4d6/c956b84d6d1dc53cdf305337dc42d1c9.jpg)
Спасибо за внимание.
Уже завтра вечером в рамках онлайн-курса OTUS «Observability: мониторинг, логирование, трейсинг» состоится открытый урок «Организация мониторинга с помощью Grafana stack». На уроке рассмотрим следующие темы: установка, настройка Loki и Tempo. Визуализация логов и трейсов в Grafana. Регистрация доступна для всех желающих на странице курса.
Комментарии (3)
strangeman
21.10.2022 14:30Есть же коллбэк-плагины, которые умеют складывать логи напрямую в хранилища, https://docs.ansible.com/ansible/latest/collections/community/general/logstash_callback.html например.
Там поддерживается огромное количество сервисов, можно логи складывать, можно прям профилировать выполнение через Elastic APM например. Полный список тут: https://docs.ansible.com/ansible/latest/collections/community/general/index.html#callback-plugins
lazyest
а чем AWX не подходит?
maksasila
Свой велик интереснее.