如何将一个小黄人的颗粒传递给另一个小黄人



我正在使用Salt来配置许多服务器。其中两个被分配了 DNS 服务器的角色,并使用 dnsmasq-formula 进行配置。其他人具有各种角色,例如 gitlab-server ,这些角色在支柱中定义。

以下是配置方式:

/srv/salt/top.sls
---
base:
  'roles:dns-server':
    - match: pillar
    - dnsmasq
  'roles:gitlab-server'
    - gitlab
/srv/pillar/top.sls
---
{% import_yaml "roles.yaml" as r %}
base:
{% if 'dns-server' in r[grains['id']] %}
    - dns.dnsserv
{% endif %}
/srv/pillar/dns/dnsserv.sls
---
dnsmasq:
  ...
  hosts:
    domain.name:
      git: <GIT_SERVER_IP>
  ...
/srv/pillar/roles.yaml
---
'minion1-id':
  - role1
  - role2
'minion2-id':
  - role3
  - role4
# and so on

现在,<GIT_SERVER_IP>是硬编码的。我宁愿查询工作节点,找到具有正确角色的爪牙并以编程方式提取其 IP 地址。

处理/srv/pillar/dns/dnsserv.sls时,将使用角色为"dns-server"的工作节点可用的信息进行处理。通过在dnsserv.sls内部加载roles.yaml,我可以设法获取 gitlab 服务器的仆从 ID(带有一些非常丑陋的代码)。但是如何从此文件中获取其 IP?

我看过盐矿的提及,但还没有真正找到如何使用此功能的完整示例。

这个问题很可能是XY问题的一个例子。如果是这样,将不胜感激"正确方式"的例子。

要将谷物或柱子从一个仆从传递到另一个仆从,您需要使用"盐矿"(https://docs.saltstack.com/en/latest/topics/mine/)。主题不简单,但很简短:

  • 定义可供仆从使用的新mine_function,例如
mine_functions:
  grains:
    grains.items: []
  • 然后在您的州与 mine.get 一起使用它 https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.mine.html#salt.modules.mine.get

我建议您在开始编写状态之前,先在命令行上尝试 mine.get 以查看您是否能够检索数据。

最新更新