我正在尝试编写一个 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 ticket
在ticket
变量中。您可能需要进行一些过滤才能仅获取票证 ID。请查看Ansible 示例存储库了解更多信息。您还需要拥有 icinga2_server 来inventory
进行委派。
答案2
除了 knowhy 的回答之外,您还可以在 Ansible 系统上生成票证,使用名为 PKDF2 的加密/哈希算法。
我在 Puppet 模块中做了类似的事情,您只需要知道“TicketSalt”值,即可计算 FQDN 的票证。(在这种情况下,密码就是 FQDN)
似乎还有一个适用于 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