Так как я использую Sensu для мониторинга, и Ansible для управления конфигурациями, то конечно же я настраиваю Sensu с помощью Ansible.
В этой связке меня смущало только одно - Sensu использует JSON для конфигов, в то время как Ansible использует YAML. Поскольку JSON является подмножеством YAML, и описывать конфигурации в YAML гораздо проще (никаких проблем с запятыми, скобочками), хотелось писать в YAML и транслировать в JSON.
Начал я, конечно, с использования шаблонов Ansible:
:::json
{
"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.
А это дает нам возможность делать такие вещи:
:::yaml
# 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 выглядит так:
:::yaml
sensu_client:
client:
name: "{{ ansible_hostname }}"
subscriptions:
- www
- default
address: "{{ ansible_default_ipv4.address }}"
some_var: "{{ sensu_some_var }}"
Эта схема показалась мне достаточно удобной, и на этом я остановился, так что теперь весь конфиг Sensu, включая проверки, хендлеры и т.д., хранится у меня в формате YAML в Ansible.