Проблема с тем, что у вас есть, заключается в том, что вы используете require
, который только гарантирует, что указанный ресурс (в данном случае каждый exec
) выполняется перед ресурсом file
.Требуемое поведение больше соответствует отношениям notify
(которые создают событие обновления), однако ресурсы file
не заботятся о событиях обновления.Вы можете прочитать больше об обновлении отношений здесь: https://puppet.com/docs/puppet/latest/lang_relationships.html#refreshing-and-notification.
Есть два возможных способа исправить это.Первым из них будет использование оператора 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 во время компиляции), что означает, что вы можете использовать функцию, чтобы проверить, существует ли файл.У меня не было возможности попробовать эту функцию, но вы можете просмотреть документацию здесь: https://puppet.com/docs/puppet/6.0/integrating_secrets_and_retrieving_agent-side_data.html.