Saltstack 使用 mine.get 检索 IP 地址

Saltstack retrieve IP address using mine.get

我正在尝试创建一个模板,它将使用 mine.get 检索 consul 服务器的 IP 地址作为 DNS。在命令行上它似乎工作正常,但在模板上下文中使用时它不返回任何东西

这是我的设置

在/srv/pillar中我添加了mines.sls并修改了top.sls如下

mines.sls

mine_functions:
  network.ip_addrs: []

top.sls

base:
  '*':
    - mines

刷新支柱并使用 mine.sendmine.update 后,我可以从 saltmaster 服务器查询 consul

的 IP 地址
sudo salt 'redis*' mine.get 'consul*' network.ip_addrs
redis-001-stage.c.project-gce.internal:
    ----------
    consul-001-adm.c.project-gce.internal:
        - 192.16.0.1
    consul-002-adm.c.project-gce.internal:
        - 192.16.0.2

我尝试使用模板在状态文件中应用相同的原则

# Resolver Configuration
resolv-file:
  file.managed:
    - name: /etc/resolv.conf
    - user: root
    - group: root
    - mode: '0644'
    - source: salt://resolver/files/resolv.conf
    - template: jinja
    - defaults:
        nameservers: {{ salt['mine.get']('*', 'network.ip_addrs', 'eth1').items() }}

并在 resolve.conf

{%- for nameserver in nameservers %}
nameserver {{ nameserver }}
{%- endfor %}

但是名称服务器总是空着,请问有人可以指点一下吗?

您一直将接口名称 eth1 作为第三个参数传递给 mine.get,但此参数用于 the matching type you want to have for the first parameter

将其保留,您将检索到 IP 地址列表。一旦这个 returns 值,我就无法将完整的地址列表传递给 jinja 模板。相反,我评估了 resolv.conf 模板中的 mine.get

这让我开始工作:

resolv-file:
  file.managed:
    - name: /tmp/resolv.conf
    - source: salt://resolv.conf
    - template: jinja

然后

{%- for server, addr in salt['mine.get']('*', 'network.ip_addrs').items() %}
nameserver {{ addr[0] }} # {{ server }}
{%- endfor %}

顺便说一下:您还可以选择 运行 本地的领事代理,并将特定于领事的 DNS 请求转发给您当地的领事代理(反过来从服务目录中解析它们)。 Using dnsmasq and Network Manager this might look like this script I uploaded to Github