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

时间:2015-08-01 05:36:28

标签: jinja2 salt-stack

我找到了这个答案here,告诉我如何在模板中获取另一个小兵的IP,但我无法获得KeyErrorhost.fqdn。当我使用host.ip时,我获得了完整的域名而不是IP。当我在控制台上运行它时,它获取了ips,但在模板中它确实返回host

str object

我尝试了这个here,但这个甚至没有显示结果。

我希望能够构建主机文件。每个小兵都有一些角色,如下:

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

我希望能够获得所有roles: - backend - cdn - ... 。但当我将此行添加到roles:backend and not roles:cdn时,我收到此错误:

publish.publish

我不知道自己做错了什么,我在主人身上添加了同行发布,但它不起作用。我已经阅读了文档,但他们并没有帮我找到问题。

编辑 版本报告

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

编辑2 sls片段

   $ 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 个答案:

答案 0 :(得分:3)

找到解决方案:

在minion config中添加这段代码:

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 %}

答案 1 :(得分:0)

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"
    ]
}