2014-09-25 36 views
3

我创建一个公式/状态文件,增加了一个iptables规则的IP地址:如何使用机器盐状态文件匹配粮食

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

我不想硬编码IP地址为sourceip1,ip2ip3是匹配谷物role:role1的小爪子的IP地址。这样,如果我在路上添加了更多的小兽role1,那么一旦我重新运行这个状态文件,他们就会被添加到iptables规则中。我该怎么做呢?

回答

6

明白了。这可以使用盐矿功能完成。

  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函数来调用该mine函数。这是我在我的情况下使用:

    {% 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()告诉函数匹配有role1role值是奴才一粒谷物(expr_form='grain')并得到它的network.ip_addrs
    • 输出结果是匹配minion id(我相信)和network.ip_addrs的结果,所以我们将其存储在serveraddrs中。
    • for循环无处不在创建一个新的ID,每次使用{{ server }}中的值并替换{{ addrs[0] }}中的IP地址。

链接,帮助: