Я создаю конфигурацию в 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. Как это сделать правильно?
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"],
}
}
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 в наши дни.