我在Puppet中为Nagios代理(NRPE)创建了一个配置。现在,我试图根据Dirs的存在设置不同的文件源。首先,我检查特定目录是否存在,然后设置特定文件内容。我当前的配置文件如下:
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。如何以正确的方式做到这一点?
答案 0 :(得分:0)
您所拥有的问题是您正在使用require
,这只能确保指定的资源(在这种情况下,每个exec
)在file
资源之前执行。您想要的行为与notify
关系(创建刷新事件)更紧密地对应,但是,file
资源并不关心刷新事件。您可以在这里了解有关刷新关系的更多信息:https://puppet.com/docs/puppet/latest/lang_relationships.html#refreshing-and-notification。
我可以通过2种可能的方式解决此问题。第一个方法是使用exec
语句来管理文件,而不是file
资源。这绝对不是最佳选择,因为您会丢失file
资源中的所有参数(我当然不建议您使用这种方法,但是您可以这样做)。
另一种方法是创建一个自定义的ruby事实,以检查文件是否存在。事实看起来像这样:
Facter.add('nagios_directories') do
confine kernel: 'Linux'
setcode do
paths_to_check = [
'/usr/lib/nagios/plugins',
'/usr/lib32/nagios/plugins',
'/usr/lib64/nagios/plugins',
]
paths_to_check.select { |d| File.directory?(d) }
end
end
此事实将检查paths_to_check
数组中列出的所有目录,并返回包含确实存在的目录的数组。如果没有目录,它将返回一个空数组。
设置好事实后,就可以这样重写代码:
class nagios_client::file_nrpe-cfg {
if (member($fact['nagios_directories'], '/usr/lib/nagios/plugins')) {
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"),
}
}
if (member($fact['nagios_directories'], '/usr/lib32/nagios/plugins')) {
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"),
}
}
if (member($fact['nagios_directories'], '/usr/lib64/nagios/plugins')) {
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"),
}
}
}
以下是一些有关自定义事实的其他文档:https://puppet.com/docs/facter/3.9/fact_overview.html。
最后,如果您正在使用Puppet 6(当前是最新版本),则可以编写自定义Ruby函数并使用新的deferred
类型。此类型使您可以在目录运行时在代理上执行功能(在此发行版之前,所有Puppet函数均在编译时在Puppet Master上执行),这意味着您可以使用函数来检查文件是否存在。我没有机会尝试使用此功能,但是您可以在此处查看文档:{{3}}。