如果selinux强制执行或允许,我编写了一个我只想运行的木偶模块。如果它被禁用,我希望木偶忽略这个课程。虽然我试图找到合适的条件格式,但我遇到了困难。这是我到目前为止所拥有的:
class some-class {
$selinux='/usr/bin/getenforce'
exec { "some command":
command => "some command",
onlyif => [ $selinux == Enforcing, $selinux == Permissive' ],
timeout => 30
}
}
这不适用于木偶运行,我得到一个“找不到命令'$ selinux'。我一整天都在谷歌搜索,但似乎无法找到如何正确构造这个。
你确定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,
;
}
首先,执行此操作的惯用方法是创建一个custom fact,用于确定节点的SELinux强制执行状态。在您的Puppet清单中,您将根据该事实的值使用普通的Puppet条件。例如,
if $selinux_enforcement in ['Permissive', 'Enforcing'] {
exec { "some command":
timeout => 30
}
}
但是,如果您想要专门使用unless
资源的onlyif
或Exec
属性来控制是否运行该Exec命令,那么您必须了解这些属性指定要运行以执行评估的操作系统命令。它们的退出代码表示是否继续运行主命令。对于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'