我已经编写了一个人偶模块,该模块仅在selinux强制执行或允许时才运行。如果禁用,我希望木偶忽略该类。尽管试图找到正确的条件格式,但我遇到了困难。这是我到目前为止的内容:
class some-class {
$selinux='/usr/bin/getenforce'
exec { "some command":
command => "some command",
onlyif => [ $selinux == Enforcing, $selinux == Permissive' ],
timeout => 30
}
}
这在木偶运行中不起作用,并且我得到一个“找不到命令'$ selinux'。我整天都在搜索,但似乎找不到正确的结构。
答案 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
资源的Exec
或onlyif
属性来控制是否运行该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'