繁体   English   中英

人偶:尝试检索可执行文件的默认路径时,generate语句失败

[英]Puppet: generate statement fails when trying to retrieve default path of an executable

我建立了一个节,从我们的服务器中删除一个红宝石宝石包。 问题是ruby gem可执行文件安装在服务器上的不同路径中,因此在一个服务器上,它可能位于其他服务器上的/ opt / ruby​​ / bin / gem中,而在/usr/local/rvm/rubies/ruby-2.0中.0-p353 / bin / gem

我的节使用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"
        }

当我运行人偶代理时,出现以下错误:

发电机必须经过****修订*

我还尝试为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_location = generate('/usr/bin/which', 'gem')

将生成您gem命令的完整路径(如果成功)。 从您描述的结果来看,我认为它正在生成'/ usr / bin / gem',这也许是真正的gem命令的符号链接。 您将其放入命令路径中,而不仅仅是目录部分,这将无济于事。 但是,它不是您报告的错误消息的来源。

真正的问题是, generate()与所有DSL功能一样,在目录构建期间运行。 我从您的结果推断出您正在使用master / agent设置,因此generate()为您提供了master上 gem的完整路径-显然是/usr/bin/gem 由于整个问题是不同的服务器在不同的位置安装了gem ,因此这无济于事。 实际的错误消息是由于尝试以错误的gem路径执行onlyif命令而引起的。

最好的前进方法可能是创建一个自定义事实,每个节点都可以使用该事实来报告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定制事实的详细信息取决于许多因素,并且就其$::ruby_gem_path ,它们对于SO而言过于宽泛,但是PL提供了很好的文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM