首页 > 解决方案 > SaltStack - 如何有条件地执行状态?

问题描述

这是一个自我回答的问题。
如果需要,请提供编辑、额外的观点和输入。

有条件地执行状态的最佳实践是什么(取决于其他命令输出)?

这是我的情况:

# vim: set syntax=yaml:

# Ensures that outbound connections are allowed for httpd
httpd:selinux:
    cmd.run:
        - name: /usr/sbin/setsebool -P httpd_can_network_connect 1

现在,我只想在启用(强制)SELinux 的情况下运行它。

标签: if-statementconditional-statementssalt-stack

解决方案


1)

解决它的一种方法是使用salt.states.cmd.runonlyif的参数:

# Ensures that outbound connections are allowed for httpd
httpd:selinux:
    cmd.run:
        - name: /usr/sbin/setsebool -P httpd_can_network_connect 1
        - onlyif:
            - 'if [[ $(getenforce) == "Disabled" ]]; then exit 1; else exit 0; fi'      # if SELinux is disabled, then don't enforce this state

这是解决这个问题的一种非常快速和简单的方法,并且当我们在这个例子中处理 Shell 命令时,它可能是最可取的方法。
请注意,这onlyif取决于正在测试的命令的返回状态代码,因此如果需要更大的灵活性,那么这可能不是您想要的。

2)

另一种方法是使用 jinja 模板访问执行模块,将您的状态包装在以下条件中:

{% if salt.selinux.getenforce() == "Disabled" %}
    httpd:selinux:
    ...
{% endif %}

这是一个更灵活的解决方案,但也占用了更多空间。
更多信息:salt.modules.selinux.getenforce()


推荐阅读