Ansible中的任意主机名解析

evo*_*vah 6 python sockets postgresql ansible ansible-playbook

有没有办法在Ansible group_vars文件或Ansible使用的Jinja2模板中将任意字符串解析为主机名?让我们说,我想定义一个变量,global_vars/all其中包含www.google.com解析的几个IP地址之一.在这个例子中,我www.google.com只是作为一个字符串的例子,可以解析为多个IP地址但我不能使用Ansible hostvars作为地址,因为我不能ssh到它.

我试图连接Pythonic,socket.gethostbyname()但无法正确使用语法.最多,我的变量变成了一个文字"socket.gethostbyname('my-host-1')".

我知道我可以回退到shell脚本并利用shell中可用的工具但我想看看在Ansible中是否有一种优雅的方法来实现这一点.

问题的更多细节是我需要使用允许主机的IP地址填充Postgres HBA配置文件.我无法使用其主机名,因为目标部署没有基于主机名的HBA所需的反向DNS.

我真的希望Postgres解析配置文件中的名称并将其与客户端的IP地址进行匹配,而不是反向查找客户端的IP地址,然后匹配主机名字符串.但这太过于期待,而且等待时间太长.我现在需要一个解决方法,我想留在Ansible中,而不必将其卸载到外部脚本中.

感谢您阅读这篇文章!

udo*_*dan 10

您可以为此创建一个查找插件:

Ansible 1.x:

import ansible.utils as utils
import ansible.errors as errors
import socket

class LookupModule(object):

    def __init__(self, basedir=None, **kwargs):
        self.basedir = basedir

    def run(self, terms, inject=None, **kwargs):

        if not isinstance(terms, basestring):
            raise errors.AnsibleError("ip lookup expects a string (hostname)")

        return [socket.gethostbyname(terms)]
Run Code Online (Sandbox Code Playgroud)

Ansible 2.x:

import ansible.utils as utils
import ansible.errors as errors
from ansible.plugins.lookup import LookupBase
import socket

class LookupModule(LookupBase):

    def __init__(self, basedir=None, **kwargs):
        self.basedir = basedir

    def run(self, terms, variables=None, **kwargs):

        hostname = terms[0]

        if not isinstance(hostname, basestring):
            raise errors.AnsibleError("ip lookup expects a string (hostname)")

        return [socket.gethostbyname(hostname)]
Run Code Online (Sandbox Code Playgroud)

将此相对于您的剧本保存为lookup_plugins/ip.py.

然后用它作为 {{ lookup('ip', 'www.google.com') }}

  • 感谢您提供非常有帮助的答案@udondan!这正是我所需要的。作为附带说明,我想提及一下我在“ usenet”上收到的回复。有人向我指出了这个基于dig的非常灵活的查找插件:https://github.com/ansible/ansible/blob/devel/lib/ansible/plugins/lookup/dig.py (2认同)