如何将脚本getAgentList.sh
的输出作为Puppet中的数组传递给变量list_of_agents
? exec
中包含的脚本可以生成下面列出的输出,也可以写入文件。
exec { 'get agent list':
path => '/usr/bin:/bin:/tmp:/usr/sbin',
command => 'bash /opt/getAgentList.sh'
}
getAgentList.sh
的输出:
devagent1: devagent1.example.com
devagent2: devagent2.example.com
testagent3: testagent3.example.com
我可以使用Hiera将它传递给资源。但是,我希望在运行时生成这些值,并在变量中使用它来附加代理。
$list_of_agents.each |String $index, String $value| {
agent { "${index} Agent":
home => "/opt/agent",
trans => "http://${value}:80",
}
}
答案 0 :(得分:0)
您可以使用外部事实:https://docs.puppet.com/facter/3.9/custom_facts.html#external-facts
不幸的是,可执行外部事实的输出仅限于String
这样的简单数据类型。您正在尝试构造Hash
,但您无法执行此操作,因为脚本的标准输出必须采用以下格式:
key1=value1
key2=value2
key3=value3
如果你想要一个哈希,那么你必须使用一个文件作为外部事实。一个yaml的例子是:
list_of_agents:
devagent1: devagent1.example.com
devagent2: devagent2.example.com
testagent3: testagent3.example.com
JSON:
{
"list_of_agents": {
"devagent1": "devagent1.example.com"
"devagent2": "devagent2.example.com"
"testagent3": "testagent3.example.com"
}
}
这些文件和您的可执行文件将放在模块的facts.d
目录中。
旁注是你的:
$list_of_agents.each |String $index, String $value|
问题的开头意味着你期待一个数组。如果需要,您可以将数据结构操作为数组,并且代码仍然可以正常工作,但是当您将其格式化时,它当前是哈希。
另一方面注意,这对于节点分类器或CMDB来说确实是一项工作:https://docs.puppet.com/puppet/5.3/nodes_external.html。这些可以动态,轻松地存储您希望在此问题中使用的数据。