使用salt的输出作为SLS状态或支柱的输入?

时间:2014-01-03 06:19:34

标签: python salt-stack

例如,我想查找具有特定标记的所有节点,获取其IP地址,然后生成配置文件以分发给这些节点。

用例可能是需要了解每个其他节点的数据库,但可以随时添加和删除节点。

2 个答案:

答案 0 :(得分:4)

您可以使用 Salt Mine 来执行此操作。首先,将此配置分发给所有Minions:

mine_functions:
  grains.item:
    - roles
    - fqdn_ip4

通过这种配置,每个Minion都会将这两个谷物发布给所有其他小兵。关于我的更多细节here

现在,我们可以使用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

答案 1 :(得分:1)

我有一个hacky解决方案,所以希望其他人可以找到更好的答案。

该方法是创建一个运行salt的Python脚本来获取network.ip_addrs eth0的YAML输出,然后使用它来调用带有支柱的特定sl。

我做了一个示例原型,仍然需要实现和调整:

#!/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与master通信以在其他节点上运行db.configure。我可以简单地执行类似于上面脚本的命令。