我想在 Puppet 中收集不同类别的变量。这可能吗?
例如我想为一个节点分配两个类:
class { "webapplication1": url => 'webapp1.example.com' }
class { "webapplication2": url => 'webapp2.example.com' }
然后我想包含一个不同的类,webserver
它为这两个类分别设置两个虚拟主机。因此它应该从这两个类中获取两个 URL 变量。我不想将 URL 作为参数传递给新类。为了进一步增加乐趣,也许有时我只想添加一个类,或者有时我想添加一个完全不同的类(所有这些的相似之处只是它们都有一个 url 参数。
我该如何收集这些?我考虑过为每个类添加一个标签,然后通过资源收集器收集它们(好吧,不适用于类)。但我如何访问它们的参数?
因此,我宁愿为 Web 应用程序创建一个定义的资源,例如
webapplication { "webapplication1": url => 'webapp1.example.com' }
webapplication { "webapplication2": url => 'webapp2.example.com' }
但是我怎样才能收集所有 Web 应用程序的所有 URL?
Webapplication <| |>
看起来,这并没有给我带来任何功能。我是否应该在周围放置一个类,webapplications
然后创建资源?
class webapps (
Hash $webapps,
) {
$webapps.each | String $appname, String $parameters | {
webapp { $appname:
* => $parameters,
}
apache::vhost { $parameters["url"]:
#...
}
}
}
class { webapps:
webapps => {
'webapplication1' = {
'url' => 'webapp1.example.com'
},
'webapplication2' = {
'url' => 'webapp2.example.com'
},
}
}
(未经测试,在 YAML 中可能看起来更简单...)。如果能提供一些入门提示,我将不胜感激。只是不知道如何很好地做到这一点。
谢谢!
答案1
金宝博官方网站就是为此而设计的。它可能看起来不是最简单的解决方案,但您可以轻松扩展它以在多个节点上进行搜索等。
Puppetdb查询提供良好的 API 来访问 PuppetDB 中的数据。根据上面的示例,您可以使用类似以下内容:
query_resources('Class["webapps"]{ hostname = 'localhost' }', 'url')
puppet agent
生成给定节点上使用的资源和事实列表,这些数据存储在 PuppetDB 中。因此,您没有执行本地查询(这在 AFIK 中是不可能的),因此传播某些更改可能需要一段时间(取决于代理的运行间隔)。