Hash 如何过滤傀儡清单中的哈希?

Hash 如何过滤傀儡清单中的哈希?,hash,puppet,hiera,Hash,Puppet,Hiera,你能帮帮我吗。我在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'

你能帮帮我吗。我在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中的值获取哈希):

因此,我有:

{\"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'
我正在尝试使用map函数来实现:

$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论坛上似乎有一个很好的例子:

该解决方案使用运行exec的。然后,只需使用自动迭代哈希,即可将哈希转换为一组资源并将其添加到目录中。此函数可以轻松地从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集合来管理现有资源类型未涵盖的资源是一种普遍趋势。这对于简单的任务来说是很好的,但是一旦你的Excel堆变得足够复杂,你真的必须要想知道发生了什么,你应该考虑开发一个自定义的资源类型,因为它将更加可预测和可维护。
在Ask PuppetLabs论坛上似乎有一个很好的例子:

该解决方案使用运行exec的。然后,只需使用自动迭代哈希,即可将哈希转换为一组资源并将其添加到目录中。此函数可以轻松地从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集合来管理现有资源类型未涵盖的资源是一种普遍趋势。这对于简单的任务来说是很好的,但是一旦你的Excel堆变得足够复杂,你真的必须要想知道发生了什么,你应该考虑开发一个自定义的资源类型,因为它将更加可预测和可维护。
我需要使用exec命令来运行python脚本(它使用api在服务器上创建一些配置):python.py$serv\u name$serv\u hostname$test\u url。我是否可以通过运行create\u resources为第一个服务和第二个服务运行它?是的。我将编辑我的答案,以便更清楚地了解它,但是create_resource()函数会在散列上迭代,并使用散列中的键/值创建资源的新实例。因此,我给您的示例代码将运行notify()并输出testname和testname2。我在这种情况下遇到错误:错误:无法从远程服务器检索目录:服务器上的错误400:重复声明:Exec[server_config]已在/etc/puppet/modules/server/master.pp:355文件中声明;无法在节点上重新声明/etc/puppet/modules/server/master.pp:355,因为每次运行exec时,exec的名称必须是唯一的。在其名称中使用$name,这应该会为其迭代的哈希提取密钥。我不太理解“在其名称中使用$name”在其下的含义是什么?我需要使用exec命令来运行python脚本(使用api在服务器上创建一些配置):python.py$serv_name$serv_hostname$test_url。我是否可以通过运行create\u resources为第一个服务和第二个服务运行它?是的。我将编辑我的答案,以便更清楚地了解它,但是create_resource()函数会在散列上迭代,并使用散列中的键/值创建资源的新实例。因此,我给您的示例代码将运行notify()并输出testname和testname2。我在这种情况下遇到错误:错误:无法从远程服务器检索目录:服务器上的错误400:重复声明:Exec[server_config]已在/etc/puppet/modules/server/master.pp:355文件中声明;无法在节点上重新声明/etc/puppet/modules/server/master.pp:355,因为每次运行exec时,exec的名称必须是唯一的。在名称中使用$name,这应该会为它所迭代的哈希提取密钥。我不太理解“在名称中使用$name”在下面是什么意思?