- 我有一些服务器(www 等)
- 我有一个监控系统
- 如果一台机器需要由 apache 监控,则需要安装一些文件。
所以我有一个apache
模块(用于安装 Apache),我正在编写一个monitoring
模块。该monitoring
模块将复制所需的文件,仅有的如果安装了 apache 包(或者定义了 apache 模块,或类似情况)。mysql 包等也一样。
上述设计是个好主意吗?这种依赖关系的最佳方法是什么?
答案1
在 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。只需将你的监控类拆分为特定于服务的类,并将它们包含在服务的类中。
答案2
在您的 apache 类中,您可以定义一个变量,并在测试中使用该变量来查看是否应该提供监控文件。
class apache {
$apacheconfigured = true;
}
class monitor {
if $apache::apacheconfigured {
file {'blah': ... }
}
}
答案3
您需要虚拟资源或者定制事实。如果一个主机的配置会改变另一个主机的配置,那么你需要出口资源。事实上,这些东西我都有。以下是一些示例。
虚拟资源
在监控类上:
@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
在监控类中,使用:
if $apache2 == 'yes' {
# include configuration for apache
}
导出资源
关于Apache类,在Apache服务器中包含:
@@exec { "config-web $fqdn":
tag => "monitoring-server",
}
在监控类上,包括在监控服务器中:
<<| tag == 'monitoring-server' |>>
答案4
为什么不只require => Package['apache']
在监控模块中关注资源?如果节点中添加了apache
类monitoring
,则依赖 apache 的文件将被安装(前提是安装成功)。如果没有(例如包安装失败,或者 apache 模块未添加到节点,监控类将失败)。
或者,如果您不想让它失败,您可以使用类似下面的方法:
if defined(Package['apacge']) {
file {...}
<and so on>
}