我需要实例化一个防火墙相关类,该类采用允许访问数据库服务器上数据库端口的主机数组。该列表中的内容取决于在哪些主机上启用了哪些 Web 应用。
我想在应用程序的逻辑中添加一些内容,例如“确保该服务器的 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 类,更改接口以允许这样做只会将问题进一步推入防火墙逻辑,所以问题在于我如何从一组收集的资源中构造一个值数组。
答案1
假设您已配置金宝博官方网站对于您的集群,您可以轻松使用Puppetdb查询
puppet module install dalen-puppetdbquery
然后在 Puppet 代码中你可以查询各种信息,例如基于事实,在本例中是所有 Linux 服务器:
$ary = query_nodes('(kernel="Linux")')
结果将是一个 FQDN 数组:
['foo.example.org', 'bar.example.org']
上面的例子中kernel
只是一个 Puppet 事实。请参阅facter -y -p
有关您节点的事实。您可以使用例如:
query_nodes('(processors.count=12 and os.architecture=amd64)')
查询可能会复杂得多,鉴于您的示例并使用 CLI,类似这样的操作应该可以完成工作:
puppet query nodes '(Firewall::Hole['mysql'])'
PuppetDB 可能看起来相当复杂,但尝试浏览劳尔将导致更复杂(且更慢)的解决方案。