我有什么:厨师;
我需要:为node[:deploy][:user][:name]
安装 RVM 。我需要用户范围的安装,而不是系统范围。
我最近尝试的内容:
script 'install_rvm' do
user = node[:deploy][:user][:name]
interpreter '/bin/bash'
code "su -l #{user} -c '\curl https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer | bash -s stable'"
not_if { ::File.exists? "/home/#{user}/.rvm" }
end
当我在测试服务器上手动运行su -l <username> -c '\curl <long_url> | bash -s stable'
肯定时,它可以正常运行。
我希望Chef运行相同的代码,并且在日志中看起来像它一样,但下一个execute
资源失败,因为实际上没有/home/<username>/.rvm
存在。
是的我知道在Chef中我可以将用户指定为user node[:deploy][:user][:name]
,而不是使用su
更改用户,但出于某种原因,如果我这样做rvm
会尝试在/root/.rvm
中安装自己(环境没有正确重置?)。
好吧,我想问一下,为什么即使是这么简单的任务,厨师也非常糟糕,但看起来我选择了错误的地方,所以问题是我做错了什么或者我错过了显而易见的事情?
答案 0 :(得分:1)
为什么不使用chef-rvm中的Fletcher Nichol - 这是在Chef中处理RVM的受支持方式。
答案 1 :(得分:0)
嗯,至少那个有用,如果所有更好的方法与Chef失败的话,可能会有用。这是安装ruby的资源
execute 'install_rvm' do
user('root')
user = node[:deploy][:user][:name]
command "su -l #{user} -c '\curl https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer | bash -s stable'"
not_if { ::File.exists? "/home/#{user}/.rvm" }
end
如果奖励不存在,则创建gemset
的奖励:
execute 'rvm_install_ruby' do
user('root')
user = node[:deploy][:user][:name]
ruby = node[:deploy][:ruby]
gemset = node[:deploy][:gemset]
command "su -l #{user} -c 'rvm use #{ruby}@#{gemset} --install --create'"
not_if do
if latest_patchlevel = `rvm list`.scan(/(ruby-#{ruby}-p)(\d+)/).map{ |a| a.last.to_i }.sort.last
`rvm list gemsets`.match /ruby-#{ruby}-p#{latest_patchlevel}@#{gemset}/
end
end
end