2015-03-18 21 views
13

我使用Vagrant + VirtualBox爲我的Rails應用程序設置虛擬機。我正在清理了在Vagrantfile引用像這樣一個.sh配置腳本:Vagrant/VirtualBox虛擬機配置:rbenv安裝成功,但腳本失敗後續使用

config.vm.provision "shell", path: "script/provision-script.sh" 

的提供腳本做了一些事情,但在接近年底它應該安裝rbenv紅寶石版本,然後使用rbenv安裝Ruby 2.2.1。提供腳本的那部分看起來是這樣的:

echo "setting up rbenv" 
# execute the remaining commands as vagrant user, instead of root 
sudo -H -u vagrant bash -c "git clone https://github.com/sstephenson/rbenv.git ~vagrant/.rbenv" 
sudo -H -u vagrant bash -c "git clone https://github.com/sstephenson/ruby-build.git ~vagrant/.rbenv/plugins/ruby-build" 
sudo -H -u vagrant bash -c "git clone https://github.com/sstephenson/rbenv-gem-rehash.git ~vagrant/.rbenv/plugins/rbenv-gem-rehash" 
echo "setting up rbenv environment in bash" 
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~vagrant/.bashrc 
echo 'eval "$(rbenv init -)"' >> ~vagrant/.bashrc 

# start new vagrant shell so rbenv will work 
echo "building ruby" 
su vagrant 
rbenv install 2.2.1 && rbenv global 2.2.1 && rbenv rehash && cd /path/to/my/app && gem install bundler rake && rbenv rehash && bundle && rbenv rehash 

一切行動rbenv install...部分正常工作。安裝紅寶石失敗,出現以下錯誤:

==> default: setting up rbenv 
==> default: Cloning into '/home/vagrant/.rbenv'... 
==> default: Cloning into '/home/vagrant/.rbenv/plugins/ruby-build'... 
==> default: Cloning into '/home/vagrant/.rbenv/plugins/rbenv-gem-rehash'... 
==> default: setting up rbenv environment in bash 
==> default: building ruby 
==> default: /tmp/vagrant-shell: line 73: rbenv: command not found 

然後腳本結束。我可以用vagrant ssh打開虛擬機,然後成功運行rbenv install 2.2.1,所以我猜測在配置過程中,實際上並沒有啓動新的流浪外殼。我的印象是,這應該發生在su vagrant之前rbenv install 2.2.1之前。

我能做些什麼來確保在此配置過程中初始化新shell,並且rbenv命令可以正常工作?

+0

請考慮將我的答案標記爲有效答案。謝謝 – 2016-03-21 12:44:55

回答

23

我有類似的問題,因爲我試圖安裝rbenv和無業遊民配置是給我的錯誤:

==> default: /tmp/vagrant-shell: line 10: rbenv: command not found 

首先,要了解流浪配置腳本在sudo模式下運行非常重要。 因此,當我們引用〜/ path時,我們引用/ root/path而不是/ home/vagrant/path。 問題是我爲root用戶安裝了rbenv,並試圖從流浪用戶調用rbenv命令,當然它沒有奏效!

因此,我所做的就是指定到無業遊民運行供應方在不須藤用戶添加特權:假

config.vm.provision :shell, privileged: false, inline: $script 

然後到我的劇本我正在考慮這一切都是從遊民用戶調用。 這裏@Casper答案對我幫助很大,因爲它只能specifing: 須藤-H -u流浪漢的bash -i -c '......'

Since you just updated .bashrc with a new path and other settings, you will want to run "sudo bash" with the -i option. This will force bash to simulate an interactive login shell, and therefore read .bashrc and load the correct path for rbenv.

下面我最後Vagrantfile 。

# -*- mode: ruby -*- 
# vi: set ft=ruby : 

$script = <<SCRIPT 
    sudo apt-get -y update 
    sudo apt-get -y install curl git-core python-software-properties ruby-dev libpq-dev build-essential nginx libsqlite3-0 libsqlite3-dev libxml2 libxml2-dev libxslt1-dev nodejs postgresql postgresql-contrib imagemagick 

    git clone https://github.com/sstephenson/rbenv.git ~/.rbenv 
    echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc 
    echo 'eval "$(rbenv init -)"'    >> ~/.bashrc 
    source ~/.bashrc 

    git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build 
    sudo -H -u vagrant bash -i -c 'rbenv install 2.1.3' 
    sudo -H -u vagrant bash -i -c 'rbenv rehash' 
    sudo -H -u vagrant bash -i -c 'rbenv global 2.1.3' 
    sudo -H -u vagrant bash -i -c 'gem install bundler --no-ri --no-rdoc' 
    sudo -H -u vagrant bash -i -c 'rbenv rehash' 
    sudo -u postgres createdb --locale en_US.utf8 --encoding UTF8 --template template0 development 
    echo "ALTER USER postgres WITH PASSWORD \'develop\';" | sudo -u postgres psql 
SCRIPT 

VAGRANTFILE_API_VERSION = "2" 

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| 
    config.vm.box = "hashicorp/precise64" 
    config.vm.network "forwarded_port", guest: 3000, host: 3000 

    # config.vm.provider :virtualbox do |vb| 
    # vb.customize ["modifyvm", :id, "--memory", "1024"] 
    # end 

    config.vm.provision :shell, privileged: false, inline: $script 
end 

希望能對別人有所幫助。

+1

太棒了!你已經用這個提示寫了我的一天,謝謝。這應該是被接受的答案。 – soutoner 2015-11-22 19:37:06

+0

不客氣! :) – 2016-01-21 15:36:37

3

我很驚訝配置腳本退出,因爲運行su vagrant理論上應該在該點掛起腳本(您正在運行通常不會自行退出的命令su)。

問題是,您無法通過運行su來更改正在運行shell腳本的用戶。
您唯一的選擇是使用sudo

由於您剛剛使用新路徑和其他設置更新了.bashrc,因此您需要使用-i選項運行"sudo bash"。這將強制bash模擬交互式登錄shell,因此讀取.bashrc並加載rbenv的正確路徑。

所以,這樣的事情應該有希望的工作:

echo "building ruby" 
sudo -H -u vagrant bash -i -c 'rbenv install 2.2.1 ...'