你能帮帮我吗?我在木偶清单中从 hiera 获得字典,然后尝试过滤它们并以 args 的形式传入 python 脚本。但不知道该怎么做。
我的希拉:
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命令资源。
谢谢!
Ask PuppetLabs论坛上有一个很好的例子:在清单中迭代来自hiera的嵌套哈希。
该解决方案使用运行 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堆变得足够复杂,以至于你真的必须考虑了解正在发生的事情,你应该考虑开发一个自定义资源类型,因为它将更加可预测和可维护。