Так как я использую Sensu для мониторинга, и Ansible для управления конфигурациями, то конечно же я настраиваю Sensu с помощью Ansible.

В этой связке меня смущало только одно - Sensu использует JSON для конфигов, в то время как Ansible использует YAML. Поскольку JSON является подмножеством YAML, и описывать конфигурации в YAML гораздо проще (никаких проблем с запятыми, скобочками), хотелось писать в YAML и транслировать в JSON.

Начал я, конечно, с использования шаблонов Ansible:

{
    "client": {
        "address": "{{ ansible_default_ipv4.address }}",
        "name": "{{ ansible_hostname }}",
        "subscriptions": [ "{{ sensu_client_subscriptions|join('", "') }}" ]
    }
}

Вроде неплохо, но не слишком удобно, и если одним клиентам захочется добавить что-то, например переменную some_var, надо для них делать новый шаблон, или городить строки такого вида:

{% if some_var is defined %} "some_var": {{ some_var }}, {% endif %}

В общем, я, не особо включая мозг, решил писать модуль для Ansible.

В процессе написания выплыли все те же проблемы: сложно работать с произвольного вида структурами, которые позволяют с такой гибкостью использовать Sensu.

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

И тут я наткнулся на pull-request, из которого узнал, что теперь в Ansible можно использовать = фильтры to_json и to_nice_json.

А это дает нам возможность делать такие вещи:

# task from sensu_client role
- name: configure sensu client
  copy: content='{{ sensu_client | to_nice_json }}'
        owner=sensu
        dest=/etc/sensu/conf.d/client.json
  notify:
    - restart sensu-client

А описание переменной sensu_client где-нибудь в group_vars выглядит так:

sensu_client:
  client:
    name: "{{ ansible_hostname }}"
    subscriptions:
      - www
      - default
    address: "{{ ansible_default_ipv4.address }}"
    some_var: "{{ sensu_some_var }}"

Эта схема показалась мне достаточно удобной, и на этом я остановился, так что теперь весь конфиг Sensu, включая проверки, хендлеры и т.д., хранится у меня в формате YAML в Ansible.


Comments

comments powered by Disqus