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

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

Базовый рабочий процесс решения

  1. Сохранение вывода плейбука в специальный файл (на каждом хосте) с помощью log_plays.

  2. Передача логов в elasticsearch с помощью filebeat.

  3. Наконец, визуализация информации с помощью kibana.

Базовая структура решения для мониторинга работы плейбука
Базовая структура решения для мониторинга работы плейбука

Реализация решения

Весь код можно найти здесь: 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 — успех или сбой

Спасибо за внимание.


Уже завтра вечером в рамках онлайн-курса OTUS «Observability: мониторинг, логирование, трейсинг» состоится открытый урок «Организация мониторинга с помощью Grafana stack». На уроке рассмотрим следующие темы: установка, настройка Loki и Tempo. Визуализация логов и трейсов в Grafana. Регистрация доступна для всех желающих на странице курса.

Комментарии (3)


  1. lazyest
    20.10.2022 13:24
    +1

    а чем AWX не подходит?


    1. maksasila
      20.10.2022 21:39

      Свой велик интереснее.


  1. 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