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') }}