在由谷物过滤的盐模板中获取 minions IP
Get minions IP inside a salt template filtered by grains
我找到了这个答案 here,告诉我如何在模板中获取另一个 minions 的 IP,但我无法获取 host.fqdn
或 host.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 %}
我找到了这个答案 here,告诉我如何在模板中获取另一个 minions 的 IP,但我无法获取 host.fqdn
或 host.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 %}