如何在Salt State文件中使用与谷物匹配的机器的IP地址

时间:2014-09-25 19:23:39

标签: jinja2 salt-stack

我正在创建一个添加iptables规则的公式/州文件:

ipt_allow:
  iptables.append:
    - table: filter
    - chain: INPUT
    - jump: ACCEPT
    - match: state
    - connstate: 'NEW,ESTABLISHED'
    - dport: 6666
    - proto: tcp
    - source: 'ip1, ip2, ip3, ...'

我不想在source中对IP地址进行硬编码。 ip1ip2ip3是与粮食role:role1匹配的小兵的IP地址。这样一来,如果我在路上添加更多具有谷物role1的爪牙,那么一旦我重新运行这个状态文件,它们就会被添加到iptables规则中。我该怎么做?

1 个答案:

答案 0 :(得分:7)

知道了。这可以使用Salt mine函数完成。

  1. /srv/pillar/mines.sls

    mine_functions:
      network.ip_addrs:
        - eth1
    

    这使得network.ip_addrs可供主人和小兵使用,特别是eth1界面。

  2. /srv/pillar/top.sls

    base:
      '*':
        - mines
    

    这将支柱(因此是地雷功能)应用于所有的奴才。

  3. 现在,您可以使用状态文件中的mine.get函数来调用该函数。这是我在我的案例中使用的:

    {% for server, addrs in salt['mine.get']('role:role1', 'network.ip_addrs', expr_form='grain').items() %}
    ipt_allow_{{ server }}:
      iptables.append:
        - table: filter
        - chain: INPUT
        - jump: ACCEPT
        - match: state
        - connstate: 'NEW,ESTABLISHED'
        - dport: 6666
        - proto: tcp
        - source: {{ addrs[0] }}
    {% endfor %}
    

    其中:

    • salt['mine.get']调用mine.get函数
    • ('role:role1', 'network.ip_addrs', expr_form='grain').items()告诉该函数匹配那些role1作为role的值为粮食(expr_form='grain')并获得其network.ip_addrs的仆从。
    • 输出是匹配的小号ID(我相信)和network.ip_addrs的结果,因此我们将其存储在serveraddrs中。
    • for循环遍历每次使用{{ server }}中的值并替换{{ addrs[0] }}中的IP地址时创建新ID。
  4. 有帮助的链接: