Назад | Перейти на главную страницу

Настройка узлов icinga2 через Ansible: как получить билет от мастера?

Я пытаюсь написать Ansible playbook для настройки узлов Icinga2, но каждому узлу требуется уникальный билет от мастера Icinga2 для аутентификации. Прямо сейчас я думаю о ssh'инге от узла к мастеру, чтобы получить билет, но это не кажется хорошей идеей. Я также пробовал использовать подсказки Ansible, но я запускаю playbook от Ansible Tower, который, очевидно, не поддерживает это (он просто зависает в ожидании stdin).

Ansible позволяет получать факты от других хостов с delegate_to параметр.

Чтобы получить билет с сервера icinga2, вам понадобится что-то вроде этого:

- name: Get ticket.
  command: icinga2 pki ticket --cn 'your cn'
  register: ticket
  delegate_to: icinga2_server

Эти задачи сохранят вывод icinga2 pki ticket команда в ticket переменная. Возможно, вам придется немного отфильтровать, чтобы получить только идентификатор билета. Взгляни на Репозиторий примеров Ansible Чтобы получить больше информации. Вам также понадобится icinga2_server. inventory для делегации.

В дополнение к известному ответу вы также можете сгенерировать билет в системе Ansible с помощью алгоритма шифрования / хеширования, называемого PKDF2.

Я сделал нечто подобное в модуле Puppet, вам нужно было знать только значение TicketSalt, чтобы рассчитать билет для FQDN. (В этом случае пароль - это полное доменное имя)

https://github.com/Icinga/puppet-icinga2/blob/master/lib/puppet/parser/functions/icinga2_ticket_id.rb https://github.com/Icinga/puppet-icinga2/blob/develop/lib/puppet/icinga2/pbkdf2.rb

Кажется, есть и модуль для Python: https://pypi.python.org/pypi/pbkdf2

Хорошо, так как я закончил писать этот фильтр, я должен поделиться им. https://gist.github.com/byoungb/35c8bbed924bb34f557023992b9b67d3

from ansible.errors import AnsibleError


def icinga_ticket(value, salt):
    try:
    from pbkdf2 import PBKDF2
    except ImportError:
    raise AnsibleError('pbkdf2 library is required for `icinga_ticket` filter "pip install pbkdf2"')
    return PBKDF2(str(value), str(salt), iterations=50000).hexread(20)


class FilterModule(object):
    def filters(self):
    return dict(
        icinga_ticket=icinga_ticket,
    )

сохраните это в плагине вашего ансибла. Плагины местоположения фильтров / filter / icinga.py

и используйте это так

- name: setup icinga node
  command: icinga2 node setup --ticket {{ 'web1.domain'|icinga_ticket('salt') }} --cn web1.domain --endpoint master.domain --zone web1.domain --master_host master.domain --trustedcert /var/lib/icinga2/certs/master.domain.crt --accept-commands --accept-config
  notify: restart icinga