3

我正在使用 salt-cloud 部署虚拟机,并尝试使用 Saltstack Reactor 系统将它们注册到我的 DNS 中。

我有一个带有此触发器的reactor.conf :

reactor:
  - 'salt/cloud/*/created':           # Add a VM
    - /srv/reactor/initialize_vm.sls

initilize_vm.sls

invoke_orchestrate_add_to_dns:
  runner.state.orchestrate:
    - mods: orch.add_to_dns
    - pillar:
        event_name: {{ name }}
        event_profile: {{ profile }}

orch/add_to_dns.sls

{% set name = pillar['event_name'] %}
{% set profile = pillar['event_profile'] %}

vm-add-dns-{{ name }}:
  sqlite3.row_present:
    - db: /var/lib/powerdns/pdns.sqlite3
    - table: records
    - where_sql: "name='{{ name }}' and type='A'"
    - data:
        domain_id: 1
        name: {{ name }}
        type: A
        content: {{ ??? }}
        ttl: 300
        prio: 0
        disabled: 0

我只需要知道新minion的IP地址。但是当编排在主服务器上运行时,我不能只做一个内容: {{ grains['fqdn_ip4'] }}

任何想法来获取奴才信息?

4

2 回答 2

4

您可以使用盐矿从奴才那里获取信息。要使用盐矿,你需要知道你想从哪个奴才那里获得信息。幸运的是,反应器从事件总线接收数据。data['id']包含仆从 ID。

在 Salt Mine 中,您可以添加一个函数来检索 minions IP,如下所示:

mine_functions:
  public_ip4:
    - mine_function: grains.get
    - fqdn_ip4

现在你可以mine.get在你的 sls 文件中使用从一个 minion 获取 IP 地址。在您的情况下,它将是您刚刚从事件总线收到的 minion ID,如下所示:

{%- for server, addrs in salt['mine.get'](data['id']', 'public_ip4') %}
  {{ addrs[0] }}
{% endfor %}

笔记:

  • 我不使用 Salt Cloud 和 DNS 编排,因此我无法将您的代码与我的代码结合并检查它是否有效。我希望它对你有用:)
  • 我将矿井命名public_ip4fqdn_ip4. 这是为了
    澄清这是盐矿中​​的名称,而不是您
    要求的谷物。
于 2017-07-07T09:26:39.593 回答
1

如果您不想添加配置,还可以执行以下操作:

{% set ip = salt.saltutil.runner('salt.execute', [data['id']], {'fun': 'grains.get', 'kwarg': {'key':'fqdn_ip4'}})[data['id']] %}

或如评论中所述:

{% set ip = salt['saltutil.runner']('cache.grains', tgt=data['id'])[data['id']]['fqdn_ip4'][0] %}

想我会在这里添加它作为其他人的参考。

于 2021-01-15T17:58:05.727 回答