2015-03-18 11 views
13

Używam Vagrant + VirtualBox do skonfigurowania maszyny wirtualnej dla mojej aplikacji Rails. Pracuję na sprzątanie skrypt .sh rezerw, który jest wymieniony w Vagrantfile tak:Udostępnianie VM Vagrant/VirtualBox: rbenv instaluje się pomyślnie, ale kolejne zastosowania w przypadku błędu skryptu

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

Skrypt Przepis robi wiele rzeczy, ale w końcu jest to podobno zainstalować rbenv Ruby wersjonowanie, a następnie użyć rbenv zainstalować Ruby 2.2.1. Że część skryptu przepis wygląda następująco:

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 

Wszystko do rbenv install... część działa poprawnie. Zainstalowanie ruby ​​kończy się niepowodzeniem z następującym błędem:

==> 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 

Scenariusz kończy się. Mogę otworzyć vm z vagrant ssh, a następnie z powodzeniem uruchomić rbenv install 2.2.1, więc domyślam się, że podczas udostępniania nowej powłoki włóczęgi w rzeczywistości nie jest uruchamiany. Miałem wrażenie, że powinno się to zdarzyć z su vagrant tuż przed rbenv install 2.2.1.

Co mogę zrobić, aby upewnić się, że nowa powłoka zostanie zainicjowana podczas tej konfiguracji i czy polecenie rbenv zadziała?

+0

Proszę oznaczyć flagę jako prawidłową. Dzięki –

Odpowiedz

23

miałem podobny problem, ponieważ starałem się zainstalować rbenv i włóczęga provisioning dawał mi błąd:

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

Przede wszystkim bardzo ważne jest zrozumienie, że skrypty obsługi migracji w sieci działają w trybie sudo. Tak więc, kiedy do skryptu odwołujemy się do ~/path, odnosimy się do/root/path, a nie do/home/vagrant/path. Problem polega na tym, że instalowałem rbenv dla użytkownika root i po próbie wywołania polecenia rbenv od użytkownika vagrant i oczywiście to nie zadziałało!

Więc co zrobiłem, to podać do Vagrant uruchomić Provisioner w NOT sudo użytkownikowi dodanie uprzywilejowany: fałszywy:

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

Potem do mojego skryptu Zastanawiałem się, że wszystko jest wywoływana z Vagrant użytkownika. Tutaj @Casper odpowiedź bardzo mi pomogło, ponieważ działa tylko specifing: sudo -H -u włóczęga -i bash -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.

Poniżej moim ostatnim 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 

Nadzieję, że będzie to pomocne dla kogoś innego.

+1

Awesome! Zrobiłeś mój dzień z tą wskazówką, dziękuję. To powinna być zaakceptowana odpowiedź. – soutoner

+0

Nie ma za co! :) –

3

Jestem zaskoczony, że skrypt obsługujący kończy działanie, ponieważ uruchomienie su vagrant powinno teoretycznie zawiesić skrypt w tym miejscu (używasz polecenia su, które normalnie nie znika samoczynnie).

Problem polega na tym, że nie można zmienić użytkownika, który uruchamia skrypt powłoki "w locie", uruchamiając su.
Jedyną opcją jest użycie sudo.

Od momentu aktualizacji .bashrc z nową ścieżką i innymi ustawieniami, będziesz chciał uruchomić "sudo bash" z opcją -i. Zmusi to bash do symulacji interaktywnej powłoki logowania, a zatem odczyta .bashrc i załaduje poprawną ścieżkę dla rbenv.

Tak, coś takiego powinno nadzieją pracy:

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