通过 Ansible 设置 icinga2 节点:如何从主节点获取票证?

通过 Ansible 设置 icinga2 节点:如何从主节点获取票证?

我正在尝试编写一个 Ansible 剧本来设置 Icinga2 节点,但每个主机都需要来自 Icinga2 主服务器的唯一票证来进行身份验证。现在,我正在考虑从节点 ssh 到主服务器以获取票证,但这似乎不是一个好主意。我也尝试使用 Ansible 的提示,但我正在从 Ansible Tower 运行剧本,它显然不支持这一点(它只是挂起等待 stdin)。

答案1

Ansible 允许使用参数从其他主机获取事实delegate_to

要从 icinga2 服务器获取票证,您将需要如下内容:

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

此任务将命令的输出存储icinga2 pki ticketticket变量中。您可能需要进行一些过滤才能仅获取票证 ID。请查看Ansible 示例存储库了解更多信息。您还需要拥有 icinga2_server 来inventory进行委派。

答案2

除了 knowhy 的回答之外,您还可以在 Ansible 系统上生成票证,使用名为 PKDF2 的加密/哈希算法。

我在 Puppet 模块中做了类似的事情,您只需要知道“TicketSalt”值,即可计算 FQDN 的票证。(在这种情况下,密码就是 FQDN)

https://github.com/Icinga/puppet-icinga2/blob/daf5d5c859332596dab1e855c13f459698e78218/lib/puppet/functions/icinga2/ticket_id.rb

https://github.com/Icinga/puppet-icinga2/blob/daf5d5c859332596dab1e855c13f459698e78218/lib/puppet_x/icinga2/pbkdf2.rb

似乎还有一个适用于 Python 的模块:https://pypi.python.org/pypi/pbkdf2

答案3

好吧,既然我最终写了这个过滤器,我想我应该分享它。 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

相关内容