Я пытаюсь написать сценарий Ansible для настройки узлов Icinga2 , но для аутентификации каждому хосту нужен уникальный билет от мастера Icinga2. Сейчас я думаю о ssh ' выходить из узла к мастеру, чтобы получить билет, но это не кажется хорошей идеей. Я также пробовал использовать подсказки Ansible, но я запускаю playbook из Ansible Tower, который явно не поддерживает это (просто зависает в ожидании stdin).
В дополнение к известному ответу вы также можете сгенерировать билет в системе 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
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 в вашем инвентаре
для делегирования.
Хорошо, раз уж я написал этот фильтр, я решил поделиться им. 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