2013-08-21 163 views
11

我们的saltstack是基于主机名(webN。,dbN。等)。但对于我需要这些服务器的IP的各种事情。现在我已经将它们存储在支柱中,但我需要同步的地方数量增加。如何获取jinja模板中主机名的IP地址

我试图使用发布+ network.ip_addrs,但有点糟糕,因为它需要做整个salt-roundtrip来解析主机名。它也依赖于小伙子的回应。因此,我正在寻找的方式来将模板中的主机名解析为IP。

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

+1

为什么收盘票? –

回答

12

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

import socket 

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

模板:

{{ grains.fqdn_ip }} 

另一种方法是使用dnsutil模块(要求在仆从挖命令):

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

这将返回盐运行的机器的IP地址,对不对?这不完全是我需要的。我需要解析诸如'{{host2ip(pillar.db.hostname)}}'的任意主机名。 –

+0

我给答案增加了另一种方法。 – kubus

+0

此外,你可以创建[宏](http://docs.saltstack.com/ref/renderers/all/salt.renderers.jinja.html#macros)host2ip – kubus

1

当前 - 要汇总所有IP地址的列表,需要使用盐矿或询问所有的小兵。我更喜欢盐矿。

有一个公认的问题来扩展新的名单系统,以维护所有奴才的地址,而不仅仅是基于ssh的主机。 https://github.com/saltstack/salt/issues/7759

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

这是一个很老的文章,但它是在谷歌排名很高用于获取IPv4地址。从salt 2015.5.8开始,获得主ipv4地址的最好方法是{{grains ['ipv4'] [0]}}

+1

您能否更详细地解释{{grains ['ipv4'] [0]}}是什么意思? –

+0

它是谷物ipv4密钥中的第一个条目(https://docs.saltstack.com/en/latest/topics/targeting/grains.html) - 显然,您可以以任何方式访问它;) –

+0

在salt grain是一组值(或hashmap或类似的)。使用'ipv4'粮食,你可以访问所有的IPv4地址。为了我的目的,我需要主要的IPv4地址或第0个条目。 –

1

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

输入以下到模板:

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 
相关问题