Как получить список всех солончаков в шаблоне?

В основном я создаю состояние Salt, описывающее конфигурацию сервера Munin, и мне нужно получить список всех миньонов, известных мастеру, примерно так:

{% for host in pillar['munin_clients'] %}
[{{ host.fqdn }}]
    address {{ host.ip }}
    use_node_name yes
{% endfor %}

Единственное различие заключается в том, что я не хочу использовать столп для этого, мне нужно, чтобы этот список был заполнен динамически. ret.get_minions кажется актуальным, но я не могу заставить его работать по какой-то причине. Каковы мои варианты?

Ответы

Ответ 1

Мне удалось добиться этого, используя систему Salt Mine (благодаря членам группы пользователей Salt-users Google):

{% for host, hostinfo in salt['mine.get']('*', 'network.interfaces').items() %}
[{{ host }}]
    address {{ hostinfo['eth0']['inet'][0]['address'] if hostinfo['eth0'].has_key('inet') else hostinfo['br0']['inet'][0]['address'] }}
    use_node_name yes
{% endfor %}

Мне пришлось добавить

mine_functions:
  network.interfaces: []

до конца /etc/salt/minion на каждом node, чтобы включить солевую шахту.

Ответ 2

Алекс ответ велик. Соляная шахта даст вам список миньонов, которые исправляются с момента последнего разминирования.

Если вы хотите дожидаться до вторых данных, вы можете использовать одноранговый интерфейс, используя модуль публикации. Опубликовать документы модуля находятся здесь: http://docs.saltstack.com/ref/modules/all/salt.modules.publish.html#module-salt.modules.publish

{% for host in salt['publish.publish']('*', 'network.ip_addrs', 'eth0') %}
[{{ host.fqdn }}]
    address {{ host.ip }}
    use_node_name yes
{% endfor %}

Обязательно установите свою основную конфигурацию, чтобы позволить миньонам выполнять network.ip_addrs.

EDIT:

Чтобы ответить на вопрос ниже, вы должны разрешить хосту запрашивать другие миньоны через интерфейс публикации через peer. Чтобы разрешить всем миньонам запрашивать ip-адреса всех других миньонов, добавьте это в свой /etc/salt/master:

peer:                                                                          
  .*:
    - network.ip_addrs

Ответ 3

Почему бы не использовать модуль minion.list?

В нашей среде столпов у нас есть столбец, который является приватным для каждого миньона (/srv/pillar/hosts/[server_A, server_B, server_C...]/some_pillar.sls).

Чтобы упростить задачу (поскольку некоторые люди забывают добавить новые столпы в верхний файл), наш главный файл столба выглядит следующим образом:

{{ saltenv }}:
  {% for minion in salt['minion.list']()['minions'] -%}
  {{ minion + '*' }}:
    - hosts.{{ minion.split('.')[0] }}
  {% endfor -%}

Таким образом, я могу получить список всех миньонов, известных хозяину, каждый раз, когда обновляется столб.