Назад | Перейти на главную страницу

Как определить ресурс Puppet, который объединяет значения в массив другого ресурса?

Я хочу иметь ресурс (или что-то еще), который я могу использовать в нескольких классах Puppet, чтобы заставить другой ресурс получать список значений, определенных в исходных классах. Я не знаю, как лучше это сделать.

Более конкретно:

У меня есть ресурс, который создает Nagios определение хоста. Каждое определение хоста включает один или несколько группы хостов. [0] Я хотел бы определить вещи в общем, чтобы группы хостов для хоста определялись динамически на основе классов, назначенных узлу Puppet.

Например, допустим, у меня есть узел:

node www.example.com {
  include common_definitions
  include web_server
  include ftp_server
}

Я бы хотел что-нибудь в web_server и ftp_server классы, которые добавляют соответствующие группы хостов в определения Hagios. Возможно что-то вроде этого:

class web_server {
  ...
  nagios::hostgroup { 'web-servers': hostname => $facts['hostname'] }
}
class ftp_server {
  ...
  nagios::hostgroup { 'ftp-servers': hostname => $facts['hostname'] }
}

Тогда определение хоста Nagios будет примерно таким:

class nagios {
  $hostgroups = collect_exported_hostgroups_for($facts['hostname'])
  $hostgroup_string = join($hostgroups, ',')
  nagios:host_definition { $facts['hostname']:
    hostgroups => $hostgroup_string,
    ...
  }
}

Ключевой факт в том, что nagios class ничего не знает о том, какие группы хостов использовать, пока Puppet не обработает все другие классы узла. Это управляет процессом из классов, назначенных узлу.

Как я могу это сделать?

[0] Технически определение хоста включает в себя ноль или более групп хостов, но в моих определениях всегда будет хотя бы одна группа хостов.

Вы, вероятно, захотите использовать модуль datacat. Фактически, README для него показывает пример управления группами хостов Nagios.