1

请你帮助我好吗。我在 puppet manifest 中从 hiera 获取 dict,然后尝试过滤它们并将 python 脚本作为 args 传递。但不知道该怎么做。

我的希拉:

myclass::server_conf:
 'first_serv':
   'serv_name': 'testname'
   'serv_hostname': 'testhost'
   'test_url': 'test@url.com'
 'second_serv':
   'serv_name': 'testname2'
   'serv_hostname': 'testhost2'
   'test_url': 'test@url.com2'

我的木偶清单(我从 hiera 中的值获取哈希):

 $server_conf = hiera_hash('myclass::server_conf', {})

结果我有:

{\"first_serv\"=>{\"serv_name\"=>\"testname\", \"serv_hostname\"=>\"testhost\", \"test_url\"=>\"test@url.com\"}, \"second_serv\"=>{\"serv_name\"=>\"serv2\", \"serv_name\"=>\"testname2\", \"serv_hostname\"=>\"testhost2\", \"test_url\"=>\"test@url.com2\"}}

然后我想从这个列表中只选择值:

'testname' 'testhost' 'test@url.com' 'testname2' 'testhost2' 'test@url.com2'

我正在尝试使用地图功能来做到这一点:

$transforrmed_data = map(server_conf) |$key,$value| { $value }

并得到错误:

Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not match |$key,$value| at /manifests/server.pp:26 on node test.node

我怎么解决这个问题?我还需要转移到另一个变量 'testname2' 'testhost2' 'test@url.com2' 并将其传递给 exec 命令资源。

谢谢!

4

1 回答 1

4

看起来在 Ask PuppetLabs 论坛上有一个很好的例子:Iterate nested hash from hiera in manifest

该解决方案使用运行您的 exec的已定义类型。然后只需使用create_resources()自动迭代您的哈希,它将哈希转换为一组资源并将它们添加到目录中。此函数可以轻松地一次从 Hiera 数据源创建许多资源,而不必编写自己的循环函数。它最好与定义的类型一起使用,因为它们可以在许多不同的时间实现。

我已经根据您的目的调整了他们的示例:

define run_my_exec($serv_name, $serv_hostname, $test_url) {
  notify { "$serv_name": }
}

$server_conf = hiera_hash('myclass::server_conf', {})
create_resources( run_my_exec, $server_conf )

此外,在 puppet 中使用 exec 是一种代码味道。并不是说它总是不好,但它通常是解决问题的最不优雅的方法。例如,这个 exec 是否在配置您的服务器?如果是这样,也许使用模板来编写配置文件会更好。这是该类型的 puppet 文档中关于 exec 的另一种观点:

警告:使用 exec 集合来管理现有资源类型未涵盖的资源的趋势很普遍。这适用于简单的任务,但是一旦您的 exec 堆变得足够复杂以至于您真的必须考虑了解正在发生的事情,您应该考虑改为开发自定义资源类型,因为它将更可预测和可维护。

于 2016-01-24T19:48:49.250 回答