在木偶中循环内容文件

Loop over content file in puppet

如何使用 Puppet 遍历文件中的行? 我正在尝试在我的清单中做这样的事情:

$tables = file('/home/myhome/tables')

$tables.each |String $table| {
    exec {"/usr/bin/${binary}":
        command => "/bin/echo '${table}'",
    }
}

我得到了错误:

错误:无法从远程服务器检索目录:服务器上出现错误 500:服务器错误:评估错误:评估函数调用时出错,无法从 /home/rraposo/tables 中找到任何文件(文件:/etc/puppetlabs/code/environments/production/manifests/11_fhc/alfresco-para-testes.pp,行:92,列:11) 在节点 fhc-prod-pt-alfresco-para-testes-01

我的文件有这样的行:

act_evt_log
act_evt_log_log_nr__seq
act_ge_bytearray
act_ge_property
act_hi_actinst
act_hi_attachment
act_hi_comment
act_hi_detail
act_hi_identitylink

我假设您的代码位于 Puppet 服务器上并且 /home/myhome/tables 文件位于目标节点上,因此 Puppet 代理 运行 生命周期为;

  1. 代理向Puppet服务器发送事实,您可以在命令行上运行宁facter查看具体是什么事实。 Puppet 服务器唯一了解节点的是代理发送的事实。
  2. Puppet服务器编译目录,这是你的lambda所在的点运行。
  3. 编译好的目录发回节点
  4. 代理商收到目录并纠正与目录的任何偏差。

解决此问题的方法是以某种方式获取包含在发送到 Puppet 服务器的事实中的文件内容。您可以使用外部事实来做到这一点 https://puppet.com/docs/puppet/5.5/custom_facts.html#external-facts.

您可以让 Puppet 部署一个文件 /etc/facter/facts.d/tables.sh 并且在该文件中您有类似的东西;

#!/usr/bin/env bash
tables=($(grep act_ /home/myhome/tables))
echo "tables=${tables[*]}"

这将包括一个名为表的事实,该表将包含一个数组,其中列出了您的 lambda 应该能够使用的文件的内容。

虽然这不是使用 Puppet 的好方法,但我们真正想要的是在代码中指定我们希望节点看起来像什么,然后应用它。从节点有效地读取配置文件允许它确定自己的配置。一个更好的解决方案是在 hiera https://puppet.com/docs/puppet/7.5/hiera_intro.html take a look at the quick start guide here https://puppet.com/docs/puppet/7.5/hiera_quick.html.

中指定该列表