2015-03-18 29 views
13

Sto utilizzando Vagrant + VirtualBox per configurare una macchina virtuale per la mia app Rails. Sto lavorando sulla pulizia uno script .sh provisioning a cui fa riferimento Vagrantfile in questo modo:Provisioning VM Vagrant/VirtualBox: rbenv installa correttamente ma gli usi successivi nello script falliscono

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

Lo script disposizione fa un certo numero di cose, ma verso la fine si suppone di installare rbenv Rubino controllo delle versioni e quindi utilizzare rbenv installare Ruby 2.2.1. Quella parte dello script disposizione simile a questa:

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 

Tutto fino alla parte rbenv install... funziona correttamente. L'installazione di ruby ​​non riesce con il seguente errore:

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

La sceneggiatura termina quindi. Posso aprire il VM con vagrant ssh e quindi eseguire correttamente rbenv install 2.2.1, quindi suppongo che durante il provisioning non venga effettivamente avviata una nuova shell vagabonda. Ho avuto l'impressione che ciò dovesse accadere con su vagrant subito prima del rbenv install 2.2.1.

Cosa posso fare per assicurarmi che una nuova shell sia inizializzata durante questo provisioning e che il comando rbenv funzioni?

+0

Si prega di considerare di contrassegnare la mia risposta come valida. Grazie –

risposta

23

ho avuto problema simile, perché stavo cercando di installare rbenv e il provisioning vagabonda stava dando a me l'errore:

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

Prima di tutto è molto importante capire che lo script di provisioning vagabondo è in esecuzione in modalità sudo. Quindi, quando all'interno dello script facciamo riferimento a ~/path, ci riferiamo a/root/path e non a/home/vagrant/path. Il problema è che stavo installando rbenv per l'utente root e dopo aver provato a chiamare il comando rbenv da utente vagabondo e ovviamente non ha funzionato!

Quindi quello che ho fatto è specificare di Vagrant per eseguire il provisioner in NOT utente sudo aggiungendo privilegiata: false:

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

Poi nel mio script stavo considerando che tutto si chiama dall'utente vagabonda. Qui risposta @Casper mi ha aiutato molto, perché funziona solo specificando: sudo -H -u vagabondo 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.

Di seguito la mia ultima 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 

sperando che sia utile a qualcun altro.

+1

Fantastico! Hai reso la mia giornata con questo suggerimento, grazie. Questa dovrebbe essere la risposta accettata. – soutoner

+0

Prego! :) –

3

Mi sorprende che lo script di provisioning esca, in quanto l'esecuzione di su vagrant dovrebbe in teoria bloccare lo script in quel momento (si sta eseguendo il comando su che normalmente non esce da solo).

Il problema è che non è possibile modificare l'utente che esegue uno script di shell "al volo" eseguendo su.
L'unica opzione è utilizzare sudo.

Dato che hai appena aggiornato .bashrc con un nuovo percorso e altre impostazioni, ti consigliamo di eseguire "sudo bash" con l'opzione -i. Ciò costringerà bash a simulare una shell di login interattiva, quindi leggere .bashrc e caricare il percorso corretto per rbenv.

Quindi, qualcosa di simile a questo dovrebbe auspicabilmente funzionare:

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