Мне нужно создать экземпляр класса, связанного с брандмауэром, который принимает массив хостов, которым разрешен доступ к порту базы данных на сервере 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 приведет к гораздо более сложному (и более медленному) решению.