12

我们的 saltstack 基于主机名(webN. 、 dbN.等)。但是对于各种事情,我需要这些服务器的 IP。现在我将它们存储在柱子中,但我需要同步的位置数量增加了。

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

我假设我可以以某种方式为它编写一个模块,但我的 python 技能非常有限。

4

6 回答 6

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] }}
于 2013-08-22T09:32:03.930 回答
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
于 2014-02-15T18:40:03.280 回答
4

这是一篇很老的帖子,但它在谷歌中获得 ipv4 地址的排名很高。从 salt 2015.5.8 开始,获取主 ipv4 地址的最佳方法是{{ grains['ipv4'][0] }}.

于 2016-05-13T12:36:04.803 回答
2

通过阅读 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
于 2017-06-20T18:34:10.633 回答
1

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

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

于 2013-10-23T19:18:19.377 回答
0

只是提醒一下,您始终可以从 Flask 应用程序传递它。

import os

host = os.uname()[1]

return render_template("template.html", host=host)
于 2019-01-14T14:53:04.897 回答