I used chef for automation.
In one of my scenarios I need to extract a version number of passenger from rvm installed in my system.
I used 'pasver' variable for this:
pasver = `/usr/local/rvm/bin/gem list | grep passenger`.sub /.*\((.*)\).*/, '\1'
But If I use this variable, in this case:
if ! ::File.exists?("/usr/local/rvm/gems/#{node['redmine']['rubyversion']}/gems/passenger-#{pasver}/buildout/apache2/mod_passenger.so") then
Then this condition is always false, and code in if block does not run.
This is because pasver variable contains new of line.
How I can remove this new of line ?
I used next way, but without successfully:
pasver = `/usr/local/rvm/bin/gem list | grep passenger`.sub /.*\((.*)\).*/, '\1'.gsub("\n",'')
Chef-users mailing list suggested to me a solution for regexp
pasver = /usr/local/rvm/bin/gem list | grep passenger
.sub /.((.)).*/m, '\1'
But It is not all, there was a problem with using this code in erb template itself. Variable value disappears, but I don'k know why.
For example this code isn't worked.
<% 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
This file generates:
LoadModule passenger_module /usr/local/rvm/gems/ruby-2.0.0-p247/gems/passenger-4.0.19
/buildout/apache2/mod_passenger.so
I don't get strange behaviour in IRB never. But chef runtime is something else.
My solution is using variables in recipe and then pass it to template resource:
template ".." do
variables ({
:pasver => pasver
})
end