mine.get没有返回柱子的价值(使用支柱堆栈)

时间:2016-06-21 17:16:10

标签: salt-stack

情况:

使用saltstack salt 2016.3.1 (Boron)。全新安装到新的Ubuntu 14.04 x64 VM

使用带有以下配置的pillarstack。

# Set up environment
environments/{{ pillar.get('environment', '') }}.sls

#Set up roles
roles/defaults.sls
{% for role in pillar.get('roles', []) -%}
roles/{{ role }}.sls
roles/{{ role }}_{{ pillar.get('environment', '') }}.sls
{% endfor -%}

# The exception is the rule
{% set hostname, domainname = minion_id.split('.',1) %}
minions/{{ domainname | replace('.','_') }}/{{ hostname }}.sls

/srv/pillar

下的salt master上的支柱文件

这是目前在一台机器上最简单的盐主人/小兵的设置。

使用我的收集内部ip地址,支柱中的minion配置,如下所示。

# Configure all minions to report internal ip addresses to mine
mine_functions:
  network.interfaces: []
  internal_ip_addrs:
    mine_function: network.ip_addrs
    interface: eth1
    cidr: '10.0.0.0/8'

到目前为止,非常好。

# salt \* mine.get '*' internal_ip_addrs
mgt001.mon.haraka-services.com:
    ----------
    mgt001.mon.haraka-services.com:
        - 10.131.23.164
我似乎有我想要的数据。

也很好通过盐主人(同一台机器,但我认为值得检查)

# salt-run mine.get '*' internal_ip_addrs
mgt001.mon.haraka-services.com:
    - 10.131.23.164

为什么?有人会问。我正在使用DigitalOcean和内部网络,虽然不是面向互联网,但不是私有的,我需要确保安全性使用iptables来隔离我的系统。 (无论如何,我可能会做很多这个,但这次是具体的动机:))

现在麻烦的部分。

在支柱(iptables公式的配置,严格限制对我的小兵的主人的访问)

firewall:
  services:
    '4505':
      block_nomatch: False
      ips_allow:
        {%- for server, ip in __salt__['mine.get']('*', 'internal_ip_addrs') %}
        - {{ ip[0] }}/32
        {%- endfor %}
      interfaces:
        - eth1
    '4506':
      block_nomatch: False
      ips_allow:
        {%- for server, ip in __salt__['mine.get']('*', 'internal_ip_addrs') %}
        - {{ ip[0] }}/32
        {%- endfor %}
      interfaces:
        - eth1

注意,发现我必须使用__salt__而不是salt(与pillarstack有关的事情?),但除此之外,根据示例我'在网上看到了。

问题:

可悲的是,没有工作。这会产生以下支柱数据

# salt \* pillar.get firewall
mgt001.mon.haraka-services.com:
    ----------
    enabled:
        True
    install:
        True
    services:
        ----------
        4505:
            ----------
            block_nomatch:
                False
            interfaces:
                - eth1
            ips_allow:
                None
        4506:
            ----------
            block_nomatch:
                False
            interfaces:
                - eth1
            ips_allow:
                None
        ssh:
            ----------
            block_nomatch:
                False
            interfaces:
                - eth1
            ips_allow:
                - /32

注意 ssh的最终条目在其他地方配置如下。

firewall:
  enabled: True
  install: True
  services:
    ssh:
      block_nomatch: False
      ips_allow:
         - {{ __salt__['mine.get']('mgt001.mon.*', 'internal_ip_addrs')[0] }}/32
      interfaces:
        - eth1

正如您所看到的,我从__salt__['mine.get']('*', 'internal_ip_addrs')

中得不到任何结果

我一直在抨击这个头几个小时,我想我错过了一些令人目眩的事情。任何想法都非常赞赏。

1 个答案:

答案 0 :(得分:1)

好的,经过多一点挖掘,这就是我提出的解决方案。

salt.saltutil.runner

使用__salt__.saltutil.runner似乎是关键(修改为salt,因为Error in feed_push_parser(readBin(con, raw(), n), reset = TRUE) : parse error: trailing garbage " : "SUCCESS" } /* 1 */ { "_id" : "b736c374-b8ae-4e9 (right here) ------^ 未在支柱堆栈中定义(似乎)。

对于那些对我是如何到达这里感兴趣的人,简单来说,关键部分是thisthis盐问题讨论主题的评论。