在由谷物过滤的盐模板中获取 minions IP

Get minions IP inside a salt template filtered by grains

我找到了这个答案 here,告诉我如何在模板中获取另一个 minions 的 IP,但我无法获取 host.fqdnhost.ip。当我使用 host 时,我得到的是完整的域名而不是 IP。当我 运行 它在控制台上获得 ips 时,但在模板内部它确实 return a str object

Unable to manage file: Jinja variable 'str object' has no attribute 'fqdn'

我试过这个 here 但是这个甚至没有显示结果。

我希望能够构建主机文件。每个 minion 都有一些角色设置为 grains,像这样:

roles:
  - backend
  - cdn
  - ...

我希望能够得到全部roles:backend and not roles:cdn。但是当我将这一行添加到我的 publish.publish 时,我得到了这个错误:

Unable to manage file: Jinja error: 'NoneType' object is not iterable

我不知道我做错了什么,我在 master 上添加了 peer publish 但它不起作用。我已经阅读了文档,但它们没有帮助我找到问题。

编辑 版本报告

   $ salt-minion --versions-report
                 Salt: 2015.5.3
               Python: 2.7.6 (default, Mar 22 2014, 22:59:56)
               Jinja2: 2.7.2
             M2Crypto: 0.21.1
       msgpack-python: 0.3.0
         msgpack-pure: Not Installed
             pycrypto: 2.6.1
              libnacl: Not Installed
               PyYAML: 3.10
                ioflo: Not Installed
                PyZMQ: 14.0.1
                 RAET: Not Installed
                  ZMQ: 4.0.4
                 Mako: Not Installed
              Tornado: Not Installed
Debian source package: 2015.5.3+ds-1trusty1

编辑 2 sls 片段

{% for host in salt['publish.publish']('roles:backend', 'network.ip_addrs', 'eth0', 'grain') %}
  server {{ host.ip }}; # {{ host.fqdn }}
{% endfor %}

network.ip_addrs 没有给你 fqdn。它只给你一个IP地址列表。

[boucha@elsapo ~]$ sudo salt dasalt network.ip_addrs --out json
{
    "dasalt": [
        "10.0.3.1", 
        "10.4.156.81", 
        "172.17.42.1"
    ]
}

找到解决方案:

在 minion 配置中添加这段代码:

mine_interval: 2
mine_functions:
  network.ip_addrs:
    - eth1 # or any other eth-n you might want

要匹配所有后端而不是 load_balancers 我们需要一个复合匹配器

G@roles:backend and not G@roles:load_balancer

之后只需使用 salt.mine

将它们全部放在模板中
{%- for server, addrs in salt['mine.get']('G@roles:backend and not G@roles:load_balancer', 'network.ip_addrs', 'compound').items() %}
  # {{ server }}
  server {{ addrs|last }};
{%- endfor %}