Итак, у меня есть apache
модуль (который устанавливает Apache), и я пишу monitoring
модуль. это monitoring
модуль скопирует необходимые файлы, только если пакет apache установлен (или если модуль apache определен, или что-то в этом роде). То же самое для пакета mysql и т. Д.
Приведенный выше дизайн - хорошая идея? Что было бы лучшим способом для такого рода зависимости?
В своем классе apache вы можете определить переменную, которую вы используете в тесте, чтобы увидеть, следует ли вам доставлять файл мониторинга или нет.
class apache {
$apacheconfigured = true;
}
class monitor {
if $apache::apacheconfigured {
file {'blah': ... }
}
}
Вам нужно либо виртуальные ресурсы или нестандартные факты. Если конфигурация одного хоста изменит конфигурацию другого, вам необходимо экспортированные ресурсы. На самом деле у меня есть все это. Вот образец.
В классе мониторинга:
@file { '/path/to/apache/monitoring/conf':
ensure => file,
source => 'puppet:///modules/monitoring/apache.conf',
tag => 'apache-extras',
}
В классе Apache:
File <| tag == 'apache-extras' |>
Exec <| tag == 'apache-extras' |>
etc...
Объявите такой факт и поместите его в соответствующем месте (см. Ссылку выше):
# apache2.rb
Facter.add("apache2") do
setcode do
%x{/usr/bin/test -x /etc/init.d/apache2 && /bin/echo yes || /bin/echo no}.chomp
end
end
В классе Monitoring используйте:
if $apache2 == 'yes' {
# include configuration for apache
}
В классе Apache, включенном в сервер Apache:
@@exec { "config-web $fqdn":
tag => "monitoring-server",
}
В классе Monitoring, включенном в сервер мониторинга:
<<| tag == 'monitoring-server' |>>
В extdata создайте переменную, которая определяет, нужно ли отслеживать сервер. Вот пример включения мониторинга по умолчанию и его отключения для определенного сервера.
extdata / common.csv
use_monitoring,true
extdata / ephemeral.example.com.csv
use_monitoring,false
В своем классе для каждой службы проверьте, включен ли мониторинг. Если это так, включите класс, ответственный за мониторинг этой службы. Это может выглядеть примерно так
class apache {
# Manage your apache setup here
if extlookup("use_monitoring") == 'true' {
include monitoring::apache
}
}
class monitoring::apache {
# Manage your apache monitoring setup here
}
Обновление: когда я впервые прочитал ваш вопрос, я подумал, что вы просите включить мониторинг на некоторых, но не на всех ваших серверах Apache. Если вы хотите отслеживать их все, вам даже не нужно возиться с extlookup. Просто разделите свой класс мониторинга на классы для конкретных услуг и включите их в класс для службы.
Почему бы просто не require => Package['apache']
по ресурсам в модуле мониторинга? Если есть apache
и monitoring
классы, добавленные в узел, файлы, зависящие от apache, будут установлены, если он установлен успешно. Если это не так (например, пакет не удалось установить или модуль apache не добавлен в узел, класс мониторинга просто не сработает).
Или, если вы не хотите, чтобы он потерпел неудачу, вы можете использовать что-то вроде следующего:
if defined(Package['apacge']) {
file {...}
<and so on>
}