Инициализация виртуальной машины Vagrant/VirtualBox: rbenv успешно устанавливается, но последующие использования в скрипте завершаются ошибкой
Я использую Vagrant + VirtualBox для настройки виртуальной машины для моего приложения Rails. Я работаю над очисткой .sh
сценарий подготовки, на который ссылается Vagrantfile
вот так:
config.vm.provision "shell", path: "script/provision-script.sh"
сценарий предоставления делает несколько вещей, но к концу предполагается установить rbenv Ruby versioning, а затем использовать 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...
часть работ правильно. Установка ruby завершается со следующей ошибкой:
==> 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
, поэтому я предполагаю, что во время подготовки новая оболочка vagrant фактически не запускается. У меня сложилось впечатление, что это должно произойти с su vagrant
перед rbenv install 2.2.1
.
что я могу сделать, чтобы убедиться, что новая оболочка инициализируется во время этой подготовки и тем, что будет работать?
2 ответов
у меня была аналогичная проблема, потому что я пытался установки rbenv и бродячая провизия давала мне ошибку:
==> default: /tmp/vagrant-shell: line 10: rbenv: command not found
прежде всего, очень важно понять, что сценарий инициализации vagrant работает в режиме sudo. Итак, когда в скрипте мы ссылаемся на ~/ path, мы ссылаемся на /root/ path, а не на /home/vagrant/ path. Проблема в том, что я устанавливал rbenv для пользователя root и после попытки вызвать команду rbenv из пользователь vagrant и, конечно же, это не сработало!
Так что я сделал, это указать бродяге, чтобы запустить provisioner в не sudo user adding привилегированный: false:
config.vm.provision :shell, privileged: false, inline: $script
тогда в моем скрипте я рассматривал, что все вызывается от пользователя vagrant. здесь @Casper ответ мне очень помог, потому что он работает только с указанием: sudo-H-u vagrant bash-i-c '......'
Так как вы только что обновили .bashrc с новым путем и другие настройки, вы захочется запустить "sudo bash" с опцией-i. Это заставит bash для имитации интерактивной оболочки входа в систему и, следовательно, чтения .bashrc и и загрузить правильный путь для 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
надеюсь это будет полезно кому-то еще.
Я удивлен, что сценарий подготовки завершается, как работает su vagrant
теоретически должен повесить скрипт в этот момент (Вы запускаете команду su
который обычно не выходит сам по себе).
проблема в том, что вы не можете изменить пользователя, который запускает сценарий оболочки "на лету", запустив su
.
Ваш единственный вариант-использовать sudo
.
так как вы только что обновили .bashrc
С новым путем и другими настройками вы захотите запустить "sudo bash"
С . Это заставит bash имитировать интерактивную оболочку входа в систему и, следовательно, читать .bashrc
и загрузите правильный путь для rbenv
.
так, что-то вроде этого должно работать:
echo "building ruby"
sudo -H -u vagrant bash -i -c 'rbenv install 2.2.1 ...'