我已经构建了一个节来从我们的服务器中删除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位置?
提前谢谢
答案 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。