模块的函数输出到saltstack状态的变量

时间:2017-08-15 08:03:30

标签: function module iptables salt salt-stack

我正在尝试为Saltstack开发一个简单的公式,它将刷新所有iptables规则并应用另一个带有更新规则的公式,因为我需要将INPUT策略切换为ACCEPT然后刷新规则。我试图通过以下方式验证:

{% set policy = salt['pillar.get']('iptables.get_policy','') %}
{% if policy == "ACCEPT" %}
flush rules:
  iptables.flush:
    require:
      - default to accept
{% endif %}

我的sls的完整代码如下:

include:
  - iptables

default to accept:
  iptables.set_policy:
    - chain: INPUT
    - policy: ACCEPT


{% set policy = salt['iptables.get_policy'] %}
{% if policy == "ACCEPT" %}
flush rules:
  iptables.flush:
    require:
      - default to accept
{% endif %}

iptables reapply:
  require:
    - sls: iptables

显然,这不起作用,任何人都可以告诉我我做错了什么,如果可能的话?

解决

如果有人需要类似的公式,这里有适合我的公式:

include:
  - iptables

default to accept:
  iptables.set_policy:
    - chain: INPUT
    - policy: ACCEPT
    - order: 1

iptables.flush:
  module.run:
    - name: iptables.flush
    - order: 2

3 个答案:

答案 0 :(得分:1)

我没有对此进行测试,但我认为您需要实际调用该函数。

{% set policy = salt['iptables.get_policy']() %}

确保添加()以实际调用该函数

答案 1 :(得分:0)

在我的案例中看起来以下语法有效:

{{ salt.iptables.flush() }}

该公式的其他部分尚未发挥作用,但此问题的主要问题已得到解决。

答案 2 :(得分:0)

依靠Salt本身来做这件事有一个缺点。

如果Salt master和Salt minion之间的连接因任何原因(例如应用了错误的规则)被iptables阻止,则无效。

所以我认为最好运行系统命令来做到这一点,我的解决方案是通过at cron完成,它以测试模式运行。

iptables_flush_testing_mode:
  module.run:
    - name: at.at
    - args:
      - "now +1 min"
      - |
        # IPv4
        iptables -P INPUT ACCEPT;
        iptables -P OUTPUT ACCEPT;
        iptables -P FORWARD ACCEPT;
        iptables -F INPUT;
        iptables -F OUTPUT;
        iptables -F FORWARD;
        # IPv6
        ip6tables -P INPUT ACCEPT;
        ip6tables -P OUTPUT ACCEPT;
        ip6tables -P FORWARD ACCEPT;
        ip6tables -F INPUT;
        ip6tables -F OUTPUT;
        ip6tables -F FORWARD;

完整状态为flush.sls