我在 Puppet 中为 Nagios 代理 (NRPE) 创建配置。现在我尝试根据目录的存在设置不同的文件源。首先我检查特定目录是否存在,然后设置特定文件内容。我当前的配置文件如下所示:
class nagios_client::file_nagios-check-linux-stats {
include nagios_client::check_location_lib-nagios
file { '/usr/lib/nagios/plugins/check_linux_stats.pl':
ensure => file,
owner => root,
group => root,
mode => 755,
content => template("nagios_client/check_linux_stats.pl.erb"),
require => Exec["check_usr-lib_exists"],
}
file { '/usr/lib64/nagios/plugins/check_linux_stats.pl':
ensure => file,
owner => root,
group => root,
mode => 755,
content => template("nagios_client/check_linux_stats.pl.erb"),
require => Exec["check_usr-lib64_exists"],
}
file { '/usr/lib32/nagios/plugins/check_linux_stats.pl':
ensure => file,
owner => root,
group => root,
mode => 755,
content => template("nagios_client/check_linux_stats.pl.erb"),
require => Exec["check_usr-lib32_exists"],
}
}
这工作正常,但我有一个问题:
class nagios_client::file_nrpe-cfg {
# include nagios_client::check_location_lib-nagios
file { '/etc/nagios/nrpe.cfg.def':
path => '/etc/nagios/nrpe.cfg',
ensure => file,
owner => root,
group => root,
mode => 644,
content => template("nagios_client/nrpe-cfg.erb"),
require => Exec["check_usr-lib_exists"],
}
file { '/etc/nagios/nrpe.cfg.32':
path => '/etc/nagios/nrpe.cfg',
ensure => file,
owner => root,
group => root,
mode => 644,
content => template("nagios_client/nrpe-cfg-32.erb"),
require => Exec["check_usr-lib32_exists"],
}
file { '/etc/nagios/nrpe.cfg.64':
path => '/etc/nagios/nrpe.cfg',
ensure => file,
owner => root,
group => root,
mode => 644,
content => template("nagios_client/nrpe-cfg-64.erb"),
require => Exec["check_usr-lib64_exists"],
}
}
看上去好像require => Exec[...]
被忽略了。
我的支票定义:
class nagios_client::check_location_lib-nagios {
exec { 'check_usr-lib_exists':
command => '/bin/true',
onlyif => '/usr/bin/test -d /usr/lib/nagios/plugins',
}
exec { 'check_usr-lib32_exists':
command => '/bin/true',
onlyif => '/usr/bin/test -d /usr/lib32/nagios/plugins',
}
exec { 'check_usr-lib64_exists':
command => '/bin/true',
onlyif => '/usr/bin/test -d /usr/lib64/nagios/plugins',
}
}
我正在使用 Puppet 3.8.7。如何正确操作?
答案1
Puppet 的工作方式并非如此。您不能将exec
资源用作其他资源的条件逻辑。您的require
参数仅表示exec
应在资源之前处理资源file
,而不是其“返回值”应指示是否创建资源。
如果您想指示这些目录是否存在,您应该创建一个或多个自定义事实来检查这些目录是否存在。一个$nagios_plugin_dir
事实可能就足够了,只需返回主机上存在的三个目录中的第一个目录,然后在资源路径中使用它即可file
:
file { "${nagios_plugin_dir}/check_linux_stats.pl":
ensure => file,
owner => root,
group => root,
mode => 755,
content => template('nagios_client/check_linux_stats.pl.erb'),
}
然后你也可以这样做:
file { '/etc/nagios/nrpe.cfg':
ensure => file,
owner => root,
group => root,
mode => 644,
content => template('nagios_client/nrpe-cfg.erb'),
}
并且在您的 ERB 模板中只需使用这个事实在相同的路径中进行模板化(我认为这就是您首先拥有三个不同模板的原因?)。
你也真的真的现在的 Puppet 版本已经很旧了。
答案2
bodgit 是正确的,因为最好通过一个模板来处理这个问题,该模板检查您所使用的操作系统并以此方式执行,或者通过自定义事实。
但是现在可以运行检查代理端的功能了!在最新版本的 Puppet (Puppet 6+) 中,函数可以推迟到代理上运行。因此,您可以使用 file_exists 函数,延迟运行它并在代码中引用该值:
module Puppet::Parser::Functions
newfunction(:file_exists, :type => :rvalue) do |args|
file = File.expand_path(args[0])
if File.exists?(file)
return true
else
return false
end
end
end
然后您可以在代码中使用它,如下所示:
$lib64nagiosexists = Deferred(“file_exists”, ["/usr/lib64/nagios/plugins”])
然后把你的代码放在那个标志后面
if $lib64nagiosexists {
file { '/etc/nagios/nrpe.cfg.64':
path => '/etc/nagios/nrpe.cfg',
ensure => file,
owner => root,
group => root,
mode => 644,
content => template("nagios_client/nrpe-cfg-64.erb"),
require => Exec["check_usr-lib64_exists"],
}
}