Configurando icinga2 nós via Ansible: como faço para obter o ticket do master?

1

Estou tentando escrever uma apostila Ansible para configurar os nós Icinga2, mas cada host precisa de um ticket exclusivo do mestre Icinga2 para autenticar. No momento, estou pensando em sair do nó para o mestre para pegar o ingresso, mas isso não parece uma boa ideia. Eu também tentei usar os prompts do Ansible, mas eu estou rodando o playbook do Ansible Tower, que aparentemente não suporta isso (ele simplesmente fica esperando pelo stdin).

    
por wmassingham 04.05.2016 / 21:11

3 respostas

3

Ansible permite obter fatos de outros hosts com o parâmetro delegate_to .

Para pegar o ticket do servidor icinga2, você precisará de algo assim:

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

Esta tarefa armazenará a saída do comando icinga2 pki ticket na variável ticket . Talvez seja necessário filtrar um pouco para obter apenas o ID do ticket. Dê uma olhada no repositório de exemplos Ansible para mais informações. Você também precisará ter o icinga2_server em você inventory para a delegação.

    
por 10.05.2016 / 10:28
1

Além da resposta do know-how, você também pode gerar o ticket no sistema Ansible, com um algoritmo crypto / hash chamado PKDF2.

Eu fiz algo semelhante no módulo Puppet, você só precisa saber o valor "TicketSalt", para calcular o ticket para o FQDN. (A senha é o FQDN nesse caso)

link link

Também parece haver um módulo para o Python: link

    
por 13.05.2016 / 12:22
0

Tudo bem, desde que acabei escrevendo este filtro, apesar de que deveria compartilhá-lo. link

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,
    )

armazene isso na localização dos filtros de plug-in do seu ansible plugins / filter / icinga.py

e usá-lo assim

- 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
    
por 06.02.2018 / 19:52