2

我正在尝试自动化 Prometheusnode_exporter和我的 Prometheus 服务器。对于node_exporter我已经编写了一个模块来安装所有需要的包,设置$::ipaddress基于facter等等。

现在我想确保从应用节点收集的信息($hostname, $job_name, [...])被导出到相应的远程 Prometheus 配置文件中,但我希望这一步异步完成,例如使用木偶代理随后在 Prometheus 服务器上运行。

我试图将类定向到puppetlabs/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该类的情况下,这对我来说很有意义 - 因为它显然感觉缺少了一些东西。:-) 我怎样才能让它工作?

谢谢!

4

1 回答 1

2

这听起来像是一项导出资源的工作(一天两份!)。这是一个节点的目录构建的工具,用于生成可应用于其他节点(以及,可选地,也可应用于导出节点本身)的资源。我仍然没有跟踪你想要在哪里管理的细节,所以这里有一个更通用的例子:维护一个本地主机文件。

通用示例

假设我们想要自动管理一个主机文件,其中列出了我们管理的所有节点。Puppet 有一个内置资源 ,Host代表主机文件中的一个条目。我们通过让管理下的每个节点导出适当的主机资源来利用它。像这样的东西会进入每个节点上包含的类中:

@@host { "$hostname": ip => $ipaddress; }

@@前缀将资源标记为已导出。它不适用于当前目标节点,除非通过我稍后将描述的机制。$hostname$ipaddress只是目标节点呈现的事实,它们在该上下文中被解析。还要注意,资源标题是全局唯一的:每个目标节点都有不同的主机名,因此Host适用于不同目标节点的所有导出资源都将具有不同的标题。

然后,每个想要Host应用所有这些条目的节点将分别使用导出的资源收集器将它们导入到自己的目录中:

<<|Host|>>

导出这些资源的节点也可以收集其中的一部分或全部。此外,还有一些方法可以更有选择性地收集哪些资源;请参阅上面的链接。

于 2018-11-17T13:50:56.963 回答