Я пытаюсь написать 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