Saltstack получить зерна миньона в оркестровке

Я использую солидное облако для развертывания виртуальных машин и пытаюсь зарегистрировать их в своем DNS с помощью системы Saltstack 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

Мне просто нужно знать IP-адрес нового миньона. Но так как оркестровка выполняется на мастере, я не могу просто сделать контент: {{grains ['fqdn_ip4']}}.

Есть идеи, чтобы получить информацию миньонов?

2 ответа

Вы можете использовать Соляную шахту, чтобы получить информацию от миньонов. Чтобы использовать Соляную шахту, вам нужно знать, от какого миньона вы хотите получить информацию. К счастью, реактор получает данные от шины событий. data['id'] содержит идентификатор миньона

В Salt Mine вы можете добавить функцию для получения IP миньонов, например так:

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

Теперь вы можете использовать mine.get в ваших файлах sls, чтобы получить IP-адрес от миньона. В вашем случае это будет идентификатор миньона, который вы только что получили из шины событий, например:

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

Заметки:

  • Я не использую Salt Cloud и оркестровку для DNS, поэтому не могу объединить ваш код с моим и проверить, работает ли он. Я надеюсь, что это будет полезно для вас:)
  • Я назвал мой public_ip4 вместо fqdn_ip4, Это к
    уточнить, что это имя в соляной шахте, а не зерно, которое вы
    просят.

Если вы не хотите добавлять конфигурацию, вы также можете сделать следующее:

      {% 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] %}

Решил добавить это сюда как ссылку для других.

Другие вопросы по тегам