puppet - 来自脚本或文件的资源值

时间:2017-10-06 06:13:47

标签: puppet puppet-enterprise

如何将脚本getAgentList.sh的输出作为Puppet中的数组传递给变量list_of_agentsexec中包含的脚本可以生成下面列出的输出,也可以写入文件。

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",
  }
}

1 个答案:

答案 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。这些可以动态,轻松地存储您希望在此问题中使用的数据。