我正在创建一个添加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地址进行硬编码。 ip1
,ip2
和ip3
是与粮食role:role1
匹配的小兵的IP地址。这样一来,如果我在路上添加更多具有谷物role1
的爪牙,那么一旦我重新运行这个状态文件,它们就会被添加到iptables规则中。我该怎么做?
答案 0 :(得分:7)
知道了。这可以使用Salt mine函数完成。
/srv/pillar/mines.sls
:
mine_functions:
network.ip_addrs:
- eth1
这使得network.ip_addrs
可供主人和小兵使用,特别是eth1
界面。
/srv/pillar/top.sls
:
base:
'*':
- mines
这将支柱(因此是地雷功能)应用于所有的奴才。
现在,您可以使用状态文件中的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
的仆从。 network.ip_addrs
的结果,因此我们将其存储在server
和addrs
中。for
循环遍历每次使用{{ server }}
中的值并替换{{ addrs[0] }}
中的IP地址时创建新ID。有帮助的链接: