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

Могу ли я накопить в марионетке массив значений от коллектора

Мне нужно создать экземпляр класса, связанного с брандмауэром, который принимает массив хостов, которым разрешен доступ к порту базы данных на сервере db. То, что находится в этом списке, зависит от того, какие из различных веб-приложений включены и на каких хостах.

Я хотел бы добавить что-то в логику приложения, которая гласит: «Убедитесь, что IP-адрес этого сервера находится в списке, из которых можно получить доступ к базе данных», но, не имея возможности повторно объявлять переменные, я не уверен, как накапливать эту информацию.

Это похоже на то, что делает concat, хотя в лучшем случае это даст мне файл, который я мог бы @include в правилах брандмауэра. Я мог бы переписать модуль брандмауэра, чтобы сделать это таким образом, но это довольно беспорядочно, и я надеюсь этого избежать.

Определение виртуальных ресурсов в логике приложения, а затем их сбор кажется более приятным способом, но я не уверен, хотя я не уверен, как я получу от коллектора, создающего экземпляр группы ресурсов данного типа, чтобы иметь массив некоторого значения из каждый из этих ресурсов?

WebApp::FirewallHole <| dbhost == $fqdn |>

$app_hosts = ???

Firewall::Hole {'mysql':
  proto => 'tcp',
  dport => '3306',
  saddr=> $app_hosts,
}

В этом коде WebApp::FirewallHole Существуют исключительно для получения этой информации и могут быть определены любым удобным способом. Firewall::Hole для текущих целей имеет фиксированный интерфейс.

Вышеизложенное скрывает некоторые детали логики брандмауэра. Я не могу просто создать экземпляр класса Firewall :: Hole здесь несколько раз и изменить интерфейс, чтобы разрешить это, просто подтолкнуло бы проблему к логике брандмауэра, поэтому вопрос заключается в том, как я могу построить массив значений из набор собранных ресурсов.

Предполагая, что вы настроили PuppetDB для вашего кластера вы можете легко использовать Puppetdbquery

puppet module install dalen-puppetdbquery

то в коде Puppet вы можете запросить различную информацию, например исходя из фактов, в данном случае все серверы Linux:

   $ary = query_nodes('(kernel="Linux")')

результатом будет массив FQDN:

['foo.example.org', 'bar.example.org']

В приведенном выше примере kernel это просто марионеточный факт. Видеть facter -y -p для фактов о вашем узле. Вы можете использовать, например:

query_nodes('(processors.count=12 and os.architecture=amd64)')

Запрос может быть гораздо более сложным, учитывая ваш пример, и использование CLI должно сработать:

puppet query nodes '(Firewall::Hole['mysql'])'

PuppetDB может выглядеть довольно сложным, но при попытке просмотра RAL приведет к гораздо более сложному (и более медленному) решению.