仅在满足条件的情况下运行人偶类

时间:2019-03-07 03:50:41

标签: arrays if-statement puppet

我已经编写了一个人偶模块,该模块仅在selinux强制执行或允许时才运行。如果禁用,我希望木偶忽略该类。尽管试图找到正确的条件格式,但我遇到了困难。这是我到目前为止的内容:

 class some-class {

 $selinux='/usr/bin/getenforce'     

 exec { "some command":
      command => "some command",
      onlyif => [ $selinux == Enforcing, $selinux == Permissive' ],
      timeout => 30
      }
      }

这在木偶运行中不起作用,并且我得到一个“找不到命令'$ selinux'。我整天都在搜索,但似乎找不到正确的结构。

2 个答案:

答案 0 :(得分:1)

您确定getenforce/usr/bin/中吗?

尝试进行以下验证:

root@lab:~# which getenforce
/sbin/getenforce

由于未引用字符串,您试图从boolean比较中获取string,因此您的代码也会遇到其他几个错误。

放置$selinux变量,并仅使用下面的代码

exec {
    "rasg":
        command => "echo rasg > /tmp/rasg.txt",
        onlyif  => "getenforce | egrep -q 'Enforcing|Permissive'",
        path    => [ "/bin", "/sbin", "/usr/bin" ],
        timeout => 30,
    ;
}

答案 1 :(得分:1)

首先,惯用的方法是创建一个custom fact来确定节点的SELinux强制执行状态。然后,您将在Puppet清单中使用基于该事实值的普通Puppet条件。例如,

if $selinux_enforcement in ['Permissive', 'Enforcing'] {
  exec { "some command":
    timeout => 30
  }
}

但是,如果您想专门使用unless资源的Execonlyif属性来控制是否运行该Exec的命令,那么您必须了解这些属性指定了< em>操作系统命令运行以执行评估。它们的退出代码传达是否继续执行主命令。对于Linux目标,使用默认的Exec提供程序posix,您可以执行以下操作:

exec { "some command":
  path => [ '/bin', '/usr/bin', '/sbin', '/usr/sbin' ],
  timeout => 30,
  onlyif => 'bash -c "case $(getenforce) in Enforcing|Permissive) exit 0;; *) exit 1;; esac"' ,
}

此外,请注意,SELinux软件套件通常包含命令selinuxenabled,该命令比getenforce更直接地解决了该问题。该命令旨在用于脚本中,通过其退出状态传达其结果,因此它可能是您的onlyif的更好选择,并将其简化为:

  onlyif => 'selinuxenabled'