0

我使用厨师进行自动化。

在我的一个场景中,我需要从系统中安装的 rvm 中提取乘客的版本号。

我为此使用了“pasver”变量:

pasver = `/usr/local/rvm/bin/gem list | grep 乘客`.sub /.*\((.*)\).*/, '\1'    

但是如果我使用这个变量,在这种情况下:

如果 !::File.exists?("/usr/local/rvm/gems/#{node['redmine']['rubyversion']}/gems/passenger-#{pasver}/buildout/apache2/mod_passenger.so")然后

那么这个条件总是假的,并且 if 块中的代码不会运行。

这是因为 pasver 变量包含新行。

我怎样才能删除这条新线?

我使用了下一种方式,但没有成功:

pasver = `/usr/local/rvm/bin/gem list | grep 乘客`.sub /.*\((.*)\).*/, '\1'.gsub("\n",'')

4

4 回答 4

2

为什么不使用

pasver.chomp!

在系统调用之后,或者,

if ! ::File.exists?("/usr/local/rvm/gems/#{node['redmine']['rubyversion']}/gems/passenger-#{pasver.chomp}/buildout/apache2/mod_passenger.so") then
于 2013-10-04T11:23:05.233 回答
1

这个怎么样:

irb> require 'rubygems'
irb> g = Gem::Specification.find_all_by_name 'passenger'
irb> g.first.version.version
=> "4.0.19"
于 2013-10-04T13:34:57.660 回答
0

您可以在任何字符串上使用 rstrip() 来删除尾随空格。

于 2013-10-04T11:23:52.520 回答
0
  1. Chef-users 邮件列表向我建议了正则表达式的解决方案

    pasver = /usr/local/rvm/bin/gem list | grep passenger.sub /。((. )).*/m, '\1'

  2. 但这还不是全部,在 erb 模板本身中使用此代码存在问题。变量值消失了,但我不知道为什么。

例如,此代码不起作用。

 <% pasver = `/usr/local/rvm/bin/gem list | grep passenger`.sub /.*\((.*)\).*/, '\1'.chomp %>
    PassengerRoot <%= "/usr/local/rvm/gems/#{node['redmine']['rubyversion']}/gems/passenger-#{pasver.chomp!}" %>
    PassengerDefaultRuby /usr/local/rvm/wrappers/<%= node['redmine']['rubyversion']%>/ruby

该文件生成:

    LoadModule passenger_module /usr/local/rvm/gems/ruby-2.0.0-p247/gems/passenger-4.0.19
    /buildout/apache2/mod_passenger.so

我从来没有在 IRB 中遇到过奇怪的行为。但是厨师运行时是另一回事。

我的解决方案是在配方中使用变量,然后将其传递给模板资源:

template ".." do
variables ({
:pasver => pasver
})
end
于 2013-10-08T07:56:51.297 回答