我可以从collections家的傀儡中积累一系列的价值吗?

我需要实例化一个防火墙相关的类,该类允许一个允许访问数据库服务器上的数据库端口的主机的数组。 该列表中的内容取决于各种networking应用中的哪一个开启了哪些主机。

我想要在应用程序的逻辑中说'确保这个服务器的ip在哪个可以访问数据库'的列表中,但是不能重新声明variables,我不是确定如何积累这些信息。

这就像concat所做的那样,尽pipe这最多只能给我一个我可以在防火墙规则中包含的文件。 我可以重写防火墙模块,所以我可以这样做,但它很杂乱,我希望避免这种情况。

在应用程序逻辑中定义虚拟资源,然后收集它们似乎是一个更好的方法,但我不知道如何从一个收集器实例化一个给定types的资源束从有一个数组每个资源?

WebApp::FirewallHole <| dbhost == $fqdn |> $app_hosts = ??? Firewall::Hole {'mysql': proto => 'tcp', dport => '3306', saddr=> $app_hosts, } 

在这个代码中, WebApp::FirewallHole纯粹是为了吸引这些信息而存在,并且可以用任何有帮助的方式来定义。 Firewall::Hole目前是一个固定的接口。

以上掩盖了防火墙逻辑的一些细节。 我不能只在这里重复实例化Firewall :: Hole类,并且改变接口以允许将问题进一步推入到防火墙逻辑中,所以问题是如何构build一个来自一套收集的资源。

假设你已经为你的集群configuration了PuppetDB ,你可以很容易地使用Puppetdbquery

 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可能看起来相当复杂,但试图浏览RAL会导致很复杂(和较慢)的解决scheme。