0

自動化にはchefを使いました。

私のシナリオの 1 つで、システムにインストールされている rvm からパッセンジャーのバージョン番号を抽出する必要があります。

これには「pasver」変数を使用しました。

pasver = `/usr/local/rvm/bin/gem リスト | grep パッセンジャー`.sub /.*\((.*)\).*/, '\1'    

しかし、この変数を使用すると、この場合:

もしも !::File.exists?("/usr/local/rvm/gems/#{node['redmine']['rubyversion']}/gems/passenger-#{pasver}/buildout/apache2/mod_passenger.so")それから

次に、この条件は常に false であり、if ブロックのコードは実行されません。

これは、pasver 変数に new of line が含まれているためです。

この新しい行を削除するにはどうすればよいですか?

私は次の方法を使用しましたが、成功しませんでした:

pasver = `/usr/local/rvm/bin/gem リスト | 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 に答える
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 に答える