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

Tom*_*far 11 python jinja2 salt-stack

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

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

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

kub*_*bus 12

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

import socket

def fqdn_ip():
    return {
        'fqdn_ip': socket.gethostbyname(socket.getfqdn())
    }
Run Code Online (Sandbox Code Playgroud)

在模板中:

{{ grains.fqdn_ip }}
Run Code Online (Sandbox Code Playgroud)

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

{{ salt['dnsutil.A']('host.name.tld')[0] }}
Run Code Online (Sandbox Code Playgroud)


Jos*_*ñez 5

我看到了这个: 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'] }}
Run Code Online (Sandbox Code Playgroud)

进而:

#In proxy-server.conf

...

[filter:cache]
use = egg:swift#memcache
memcache_servers = {{ proxy_ip }}:11211
Run Code Online (Sandbox Code Playgroud)