Puppet:尝试检索可执行文件的默认路径时生成语句失败
Puppet: generate statement fails when trying to retrieve default path of an executable
我构建了一个节来从我们的服务器中删除 ruby gem 包。问题是 ruby gem 可执行文件安装在服务器上的不同路径中,因此在一台服务器上它可能在 /opt/ruby/bin/gem 在其他服务器上它在 /usr/local/rvm/rubies/ruby-2.0.0 -p353/bin/gem
我的节使用puppet中的generate函数拉出默认的rubygem安装如下:
$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"
}
当我 运行 傀儡代理时,我收到以下错误:
生成器必须完全符合 ****redacted*
我还尝试为 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 位置?
提前致谢
您的代码
$ruby_gem_location = generate('/usr/bin/which', 'gem')
将生成 gem
命令的完整路径(如果成功)。根据您描述的结果,我认为它正在生成“/usr/bin/gem”,这可能是真正的 gem
命令的符号链接。您将其放入命令路径而不仅仅是目录部分,这将无济于事。但是,它不是您报告的错误消息的来源。
这里真正的问题是 generate()
,像所有 DSL 功能一样,在目录构建期间运行。我从您的结果推断您正在使用主/代理设置,因此 generate()
为您提供了 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
自定义事实的详细信息取决于许多因素,并且就其全面的一般性而言,它们对于 SO 而言过于宽泛,但 PL 提供了 good documentation.
我构建了一个节来从我们的服务器中删除 ruby gem 包。问题是 ruby gem 可执行文件安装在服务器上的不同路径中,因此在一台服务器上它可能在 /opt/ruby/bin/gem 在其他服务器上它在 /usr/local/rvm/rubies/ruby-2.0.0 -p353/bin/gem
我的节使用puppet中的generate函数拉出默认的rubygem安装如下:
$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"
}
当我 运行 傀儡代理时,我收到以下错误:
生成器必须完全符合 ****redacted*
我还尝试为 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 位置?
提前致谢
您的代码
$ruby_gem_location = generate('/usr/bin/which', 'gem')
将生成 gem
命令的完整路径(如果成功)。根据您描述的结果,我认为它正在生成“/usr/bin/gem”,这可能是真正的 gem
命令的符号链接。您将其放入命令路径而不仅仅是目录部分,这将无济于事。但是,它不是您报告的错误消息的来源。
这里真正的问题是 generate()
,像所有 DSL 功能一样,在目录构建期间运行。我从您的结果推断您正在使用主/代理设置,因此 generate()
为您提供了 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
自定义事实的详细信息取决于许多因素,并且就其全面的一般性而言,它们对于 SO 而言过于宽泛,但 PL 提供了 good documentation.