例如,我想找到所有带有特定标签的节点,获取它们的 IP 地址,然后生成一个配置文件以分发给这些节点。
一个用例可能是一个需要了解每个其他节点的数据库,但可以随时添加和删除节点。
例如,我想找到所有带有特定标签的节点,获取它们的 IP 地址,然后生成一个配置文件以分发给这些节点。
一个用例可能是一个需要了解每个其他节点的数据库,但可以随时添加和删除节点。
你可以使用盐矿来做到这一点。首先,将此配置分发给所有 Minions:
mine_functions:
grains.item:
- roles
- fqdn_ip4
使用该配置,每个 Minion 都会将这两个颗粒发布给所有其他 Minion。更多关于我的细节在这里。
现在,我们可以创建一个所有名称为 role=db 的文件。
/tmp/mydbhosts:
file:
- managed
- source: salt://example/myhosts
- template: mako
模板示例/myhosts:
% for minion, peer_grains in salt['mine.get']('*', 'grains.items').items():
% if "db" in peer_grains["role"]:
minion peer_grains["fqdn_ip4"]
% endif
% endfor
我有一个hacky解决方案,所以希望其他人能找到更好的答案。
该方法是创建一个 Python 脚本,该脚本运行salt
以获取 YAML 输出,network.ip_addrs eth0
然后使用该脚本调用具有支柱的特定 sls。
我做了一个示例原型,它仍然需要实现和调整:
#!/usr/bin/env python
import subprocess
import yaml
# Query all db nodes for their ip addresses
data = subprocess.check_output(
'salt -G "role:db" network.ip_addrs eth0',
shell=True
)
data = yaml.load(data)
# Parse and reshuffle for pillar input
addrs = []
for a in data.values():
addrs.append(a[0])
addrs = yaml.dump({'db_peers': addrs})
# Update configuration file on each node
data = subprocess.check_output(
'salt -G "role:db" state.sls db.configure pillar="{}"'.format(addrs),
shell=True
)
这将执行以下内容:
salt -G "role:db" state.sls db.configure pillar="db_peers: [1.2.3.4, 2.3.4.5]"
这可能会被放入一个模块中,但我不确定如何很好地要求 salt-minion 与主节点通信以db.configure
在其他节点上运行。我可以简单地执行类似于上面脚本的命令。