是否有可能抑制具体的运行 Puppet 清单时出现错误消息?
如果文件 /etc/sysconfig/iptables 存在,则以下代码片段将激活并启动 iptables。它工作正常,但“检查 iptables 规则文件”会生成一条错误消息,我想隐藏该消息。我查看了 (v2.7) 文档中有关 exec 资源类型的选项,并在 Google 上搜索,但无济于事。
cat init.pp
service { "iptables":
enable => true,
ensure => running,
require => Exec["Check for iptables rulesfile"];
}
exec { "Check for iptables rulesfile":
command => "/usr/bin/test -f /etc/sysconfig/iptables",
returns => "0";
}
puppet apply --debug init.pp
...
err: /Stage[main]//Exec[Check for iptables rulesfile]/returns: change from notrun to 0 failed: /usr/bin/test -f /etc/sysconfig/iptables returned 1 instead of one of [0] at init.pp:12
...
warning: /Stage[main]//Service[iptables]: Skipping because of failed dependencies
有什么想法吗?
PS 是的,我知道这不是使用 Puppet 管理防火墙规则的“正确”方法。
答案1
我了解到您希望 iptables 服务仅在 /etc/sysconfig/iptables 存在时启用并运行。一个简单的选项是创建一个名为 iptables 的自定义事实(或任何您喜欢的名称),并使用该布尔值来决定是否执行服务块。例如:
在模块中的 $module_name/lib/facter 中创建自定义事实:
Facter.add("iptables") do
setcode do
if Facter::Util::Resolution.exec('test -f /etc/sysconfig/iptables') then
"true"
else
"false"
end
end
end
然后,在您的服务块中有类似这样的内容:
if $::iptables == "true" {
service { "iptables":
enable => true,
ensure => running,
}
}
如果该文件存在,则仅执行该服务块。我想这就是你想要的。
答案2
博斯科提出了一个非常好的解决方案。
你的 hack 可能也能起作用,尝试使用日志级别元参数。
exec { "Check for iptables rulesfile":
command => "/usr/bin/test -f /etc/sysconfig/iptables",
loglevel => "debug",
returns => "0";
}
请注意服务资源将要抱怨依赖失败。