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

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

1
задан 4 May 2016 в 22:11
3 ответа

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

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

https://github.com/Icinga/puppet-icinga2/blob/master/lib/puppet/parser/functions/icinga2_ticket_id.rb 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

1
ответ дан 3 December 2019 в 17:37

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 в вашем инвентаре для делегирования.

3
ответ дан 3 December 2019 в 17:37

Хорошо, раз уж я написал этот фильтр, я решил поделиться им. 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,
    )

сохранить это в папке фильтров вашего плагина ansible. plugins / 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
0
ответ дан 3 December 2019 в 17:37

Теги

Похожие вопросы