如何在jinja模板中获取主机名的IP地址

时间:2013-08-21 14:42:16

标签: python jinja2 salt-stack

我们的saltstack基于主机名(webN。,dbN。等)。但对于各种事情我需要那些服务器的IP。现在我把它们存放在支柱中,但我需要同步的地方数量增加了。

我尝试使用publish + network.ip_addrs,但这有点糟糕,因为它需要完成整个salt-roundtrip才能解析主机名。它也取决于仆从的反应。因此,我正在寻找方法将主机名解析为模板中的IP

我认为我可以为它编写一个模块,但我的python技能非常有限。

6 个答案:

答案 0 :(得分:12)

您可以使用自定义谷物。在状态树目录中创建文件_grains / fqdn_ip.py:

import socket

def fqdn_ip():
    return {
        'fqdn_ip': socket.gethostbyname(socket.getfqdn())
    }

在模板中:

{{ grains.fqdn_ip }}

另一种方法是使用dnsutil模块(需要在minion上使用dig命令):

{{ salt['dnsutil.A']('host.name.tld')[0] }}

答案 1 :(得分:4)

我看到了这个: http://cnygaard.blogspot.com.es/2012/11/how-to-template-eth0-address-with.html

这是我找到的简单方法。

#init.sls:

...
...

/etc/swift/proxy-server.conf:              
   file:
     - managed                              
     - source: salt://swift/proxy-server.conf
     - template: jinja
     - context:
         proxy_ip: {{ salt['network.interfaces']()['eth0']['inet'][0]['address'] }}

然后:

#In proxy-server.conf

...

[filter:cache]
use = egg:swift#memcache
memcache_servers = {{ proxy_ip }}:11211

答案 2 :(得分:4)

这是一篇非常古老的帖子,但在获取ipv4地址方面,它在Google中排名很高。从盐2015.5.8开始,获得主要ipv4地址的最佳方法是{{grain [' ipv4'] [0]}}

答案 3 :(得分:1)

目前 - 聚合所有IP地址的列表需要盐矿或询问所有的小兵。我更喜欢盐矿。

有一个被接受的问题是扩展新的名册系统以维护所有小兵的地址,而不仅仅是基于ssh的主机。 https://github.com/saltstack/salt/issues/7759

答案 4 :(得分:1)

通过ansible文档阅读,我找到了一个更简单的解决方案。这是我的结果。

在模板中输入以下内容:

lookup hostname: {{ lookup('dig', 'google.ca.') }}

我的jinja2模板:

# mytemplate.j2
## lookup directly
lookup hostname: {{ lookup('dig', 'google.ca.') }}

## in a variable
{% set fqdn = 'google.ca' %}
lookup hostname: {{ lookup('dig', fqdn) }}

结果:

# mytemplate.j2
## lookup directly
lookup hostname: 172.217.2.163

## in a variable
lookup hostname: 172.217.2.163

答案 5 :(得分:0)

提醒一下,您始终可以从Flask应用中传递它。

import os

host = os.uname()[1]

return render_template("template.html", host=host)