使用 Puppet 配置远程规则集
Configure remote rulesets with Puppet
我正在尝试自动化 Prometheus node_exporter
和我的 Prometheus 服务器。
对于 node_exporter
我已经编写了一个模块来安装所有需要的包,根据 facter
设置 $::ipaddress
等等..
现在我想确保从应用节点收集的信息($hostname
、$job_name
、[...])被导出到相应的远程 Prometheus 配置文件中,但是我想异步完成此步骤,例如,之后在 Prometheus 服务器上使用人偶代理 运行。
我试图将 classes 定位到 puppetlabs/logrotate
模块,它基本上执行以下操作:
logrotate/init.pp
class logrotate (
String $ensure = present,
Boolean $hieramerge = false,
Boolean $manage_cron_daily = true,
Boolean $create_base_rules = true,
Boolean $purge_configdir = false,
String $package = 'logrotate',
Hash $rules = {},
) {
do some stuff
}
logrotate/rules.pp
class logrotate::rules ($rules = $::logrotate::rules){
#assert_private()
create_resources('logrotate::rule', $rules)
}
logrotate/rule.pp
define logrotate::rule(
Pattern[/^[a-zA-Z0-9\._-]+$/] $rulename = $title,
Enum['present','absent'] $ensure = 'present',
Optional[Logrotate::Path] $path = undef,
(...)
) {
do some stuff
}
缩短了我的 ni_trending
(node_exporter) & ni_prometheus
模块目前看起来非常类似于 logrotate
:
ni_trending/init.pp
class ni_trending (
$hostname = $::fqdn,
$listen_address = $::ipaddress,
$listen_port = 51118,
) {
) inherits ni_trending::params {
anchor { 'ni_trending::start': }
->class { 'ni_trending::package': }
->class { 'ni_trending::config':
(...)
listen_address => $listen_address,
listen_port => $listen_port,
(...)
}
->class { 'ni_trending::service': }
->class { ' ni_trending::prometheus':
(...)
hostname => $hostname,
listen_port => $listen_port,
(...)
}
->anchor { 'ni_trending::end': }
}
ni_trending/prometheus.pp
class ni_trending::prometheus (
Hash $options = {},
) {
ni_prometheus::nodeexporterrule { 'node_exporter' :
ensure => pick_default($options['ensure'], 'present'),
hostname => pick_default($options['hostname'], $ni_trending::hostname),
listen_port => pick_default($options['hostname'], $ni_trending::listen_port),
}
}
ni_prometheus/nodeexporterrules.pp
class ni_prometheus::nodeexporterrules ($rules = $::ni_prometheus::nodeexporterrules) {
create_resources('ni_prometheus::nodeexporterrule', $nodeexporterrules)
}
ni_prometheus/nodeexporterrule.pp
define ni_prometheus::nodeexporterrule (
$job_name = $title,
Enum['present','absent'] $ensure = 'present',
$hostname = $hostname,
$listen_port = $listen_port,
) {
file_line { "prometheus-${job_name}" :
path => "/etc/prometheus/${job_name}.list",
after => 'hosts:',
line => "${hostname}:${listen_port}",
}
}
但是,当我在 Prometheus Master 上本地应用 node_exporter
时,这才有效——在外部机器包含 ni_trending::prometheus
class 的情况下,这是有道理的对我来说——因为它清楚地感觉到缺少了什么。 :-) 我怎样才能让它工作?
谢谢!
这听起来像是 exported resources (that makes two 一天就能完成的工作!)。这是一个节点的目录构建工具,用于生成可应用于其他节点(以及可选地应用于导出节点本身)的资源。我仍然没有跟踪您想在何处管理的详细信息,所以这里有一个更通用的示例:维护本地主机文件。
一般示例
假设我们想要自动管理一个主机文件,列出我们管理的所有节点。 Puppet 有一个 built-in 资源,Host
,代表主机文件中的一个条目。我们通过让受管理的每个节点导出适当的主机资源来利用它。像这样的东西会放在每个节点上包含的 class 中:
@@host { "$hostname": ip => $ipaddress; }
@@
前缀将资源标记为已导出。它不应用于当前目标节点,除非通过我稍后将描述的机制。 $hostname
和 $ipaddress
只是目标节点呈现的事实,它们在该上下文中得到解决。另请注意,资源标题是全局唯一的:每个目标节点都有不同的主机名,因此所有导出的 Host
应用于不同目标节点的资源将具有不同的标题。
然后,每个想要应用所有这些 Host
条目的节点将使用 exported resource collector 将它们导入 在自己的目录中:
<<|Host|>>
导出这些资源的节点也可以收集其中的部分或全部。此外,还有一些方法可以更有选择性地收集哪些资源;参见上面的 link。
我正在尝试自动化 Prometheus node_exporter
和我的 Prometheus 服务器。
对于 node_exporter
我已经编写了一个模块来安装所有需要的包,根据 facter
设置 $::ipaddress
等等..
现在我想确保从应用节点收集的信息($hostname
、$job_name
、[...])被导出到相应的远程 Prometheus 配置文件中,但是我想异步完成此步骤,例如,之后在 Prometheus 服务器上使用人偶代理 运行。
我试图将 classes 定位到 puppetlabs/logrotate
模块,它基本上执行以下操作:
logrotate/init.pp
class logrotate (
String $ensure = present,
Boolean $hieramerge = false,
Boolean $manage_cron_daily = true,
Boolean $create_base_rules = true,
Boolean $purge_configdir = false,
String $package = 'logrotate',
Hash $rules = {},
) {
do some stuff
}
logrotate/rules.pp
class logrotate::rules ($rules = $::logrotate::rules){
#assert_private()
create_resources('logrotate::rule', $rules)
}
logrotate/rule.pp
define logrotate::rule(
Pattern[/^[a-zA-Z0-9\._-]+$/] $rulename = $title,
Enum['present','absent'] $ensure = 'present',
Optional[Logrotate::Path] $path = undef,
(...)
) {
do some stuff
}
缩短了我的 ni_trending
(node_exporter) & ni_prometheus
模块目前看起来非常类似于 logrotate
:
ni_trending/init.pp
class ni_trending (
$hostname = $::fqdn,
$listen_address = $::ipaddress,
$listen_port = 51118,
) {
) inherits ni_trending::params {
anchor { 'ni_trending::start': }
->class { 'ni_trending::package': }
->class { 'ni_trending::config':
(...)
listen_address => $listen_address,
listen_port => $listen_port,
(...)
}
->class { 'ni_trending::service': }
->class { ' ni_trending::prometheus':
(...)
hostname => $hostname,
listen_port => $listen_port,
(...)
}
->anchor { 'ni_trending::end': }
}
ni_trending/prometheus.pp
class ni_trending::prometheus (
Hash $options = {},
) {
ni_prometheus::nodeexporterrule { 'node_exporter' :
ensure => pick_default($options['ensure'], 'present'),
hostname => pick_default($options['hostname'], $ni_trending::hostname),
listen_port => pick_default($options['hostname'], $ni_trending::listen_port),
}
}
ni_prometheus/nodeexporterrules.pp
class ni_prometheus::nodeexporterrules ($rules = $::ni_prometheus::nodeexporterrules) {
create_resources('ni_prometheus::nodeexporterrule', $nodeexporterrules)
}
ni_prometheus/nodeexporterrule.pp
define ni_prometheus::nodeexporterrule (
$job_name = $title,
Enum['present','absent'] $ensure = 'present',
$hostname = $hostname,
$listen_port = $listen_port,
) {
file_line { "prometheus-${job_name}" :
path => "/etc/prometheus/${job_name}.list",
after => 'hosts:',
line => "${hostname}:${listen_port}",
}
}
但是,当我在 Prometheus Master 上本地应用 node_exporter
时,这才有效——在外部机器包含 ni_trending::prometheus
class 的情况下,这是有道理的对我来说——因为它清楚地感觉到缺少了什么。 :-) 我怎样才能让它工作?
谢谢!
这听起来像是 exported resources (that makes two 一天就能完成的工作!)。这是一个节点的目录构建工具,用于生成可应用于其他节点(以及可选地应用于导出节点本身)的资源。我仍然没有跟踪您想在何处管理的详细信息,所以这里有一个更通用的示例:维护本地主机文件。
一般示例
假设我们想要自动管理一个主机文件,列出我们管理的所有节点。 Puppet 有一个 built-in 资源,Host
,代表主机文件中的一个条目。我们通过让受管理的每个节点导出适当的主机资源来利用它。像这样的东西会放在每个节点上包含的 class 中:
@@host { "$hostname": ip => $ipaddress; }
@@
前缀将资源标记为已导出。它不应用于当前目标节点,除非通过我稍后将描述的机制。 $hostname
和 $ipaddress
只是目标节点呈现的事实,它们在该上下文中得到解决。另请注意,资源标题是全局唯一的:每个目标节点都有不同的主机名,因此所有导出的 Host
应用于不同目标节点的资源将具有不同的标题。
然后,每个想要应用所有这些 Host
条目的节点将使用 exported resource collector 将它们导入 在自己的目录中:
<<|Host|>>
导出这些资源的节点也可以收集其中的部分或全部。此外,还有一些方法可以更有选择性地收集哪些资源;参见上面的 link。