Puppet:尝试检索可执行文件的默认路径时生成语句失败

时间:2016-01-27 21:27:33

标签: ruby puppet auto-generate

我已经构建了一个节来从我们的服务器中删除ruby gem包。问题是ruby gem可执行文件安装在服务器上的不同路径中,所以在一台服务器上,它可以在/ opt / ruby​​ / bin / gem中的其他服务器上,位于/usr/local/rvm/rubies/ruby-2.0 0.0-P353 / bin中/宝石

我的节使用puppet中的generate函数来提取默认的ruby gem安装,如下所示:

$ruby_gem_location = generate('which', 'gem')
exec { "remove-remote_syslog":
        command => "gem uninstall remote_syslog",
        path    => "$ruby_gem_location:/opt/ruby/bin:/usr/bin:/usr/sbin",
        onlyif  => "$ruby_gem_location list|grep remote_syslog"
        }

当我运行puppet agent时,我收到以下错误:

生成器必须完全符合****编辑*

我还尝试为which命令提供默认路径,如下所示:

$ruby_gem_location = generate('/usr/bin/which', 'gem') 

现在错误说:无法评估:无法找到命令'/ usr / bin / gem

我检查了目标服务器,并且gem命令在

/usr/local/rvm/rubies/ruby-2.0.0-p353/bin/gem

我做错了什么?

如何在我们的服务器上提取默认的ruby gem位置?

提前谢谢

1 个答案:

答案 0 :(得分:1)

您的代码

$ruby_gem_location = generate('/usr/bin/which', 'gem')

将生成gem命令的完整路径(如果成功)。根据您描述的结果,我认为它正在生成' / usr / bin / gem',这可能是真实gem命令的符号链接。您将它放入命令路径而不仅仅是目录部分,这将没有用。但是,它不是您报告的错误消息的来源。

这里真正的问题是generate()与所有DSL功能一样,在目录构建期间运行。我从您的搜索结果中推断出您正在使用主设置/代理设置,因此generate()正在为您提供gem的完整路径 - 显然/usr/bin/gem - 在主设备上< / em>的。由于重点是不同的服务器在不同的地方安装gem,这是无益的。实际的错误消息来自于尝试使用错误的onlyif路径执行gem命令。

您最好的方法可能是创建一个自定义事实,每个节点都可以使用该事实报告gem二进制文件的相应位置。然后,您可以在Exec中使用该事实的值,也许:

exec { "remove-remote_syslog":
  command => "$::ruby_gem_path uninstall remote_syslog",
  onlyif  => "$::ruby_gem_path list | grep remote_syslog"
}

请注意,如果您首先提供可执行文件的完整路径,则不需要path属性。

创建$::ruby_gem_path自定义事实的详细信息取决于多个因素,并且在一般情况下,它们对SO来说过于宽泛,但PL提供good documentation