Подтвердить что ты не робот

Предоставление Vagrant/VirtualBox VM: rbenv успешно завершается, но последующее использование в script не работает

Я использую Vagrant + VirtualBox для настройки виртуальной машины для моего приложения Rails. Я работаю над очисткой .sh обеспечения script, на который ссылается в Vagrantfile, например:

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

Предоставление script делает несколько вещей, но к концу предполагается установить rbenv Ruby versioning, а затем использовать rbenv для установки Ruby 2.2.1. Эта часть обеспечения script выглядит так:

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

Затем завершается script. Я могу открыть vm с помощью vagrant ssh, а затем успешно запустить rbenv install 2.2.1, поэтому я предполагаю, что во время инициализации новая бродячая оболочка фактически не запускается. У меня создалось впечатление, что это должно произойти с su vagrant прямо перед rbenv install 2.2.1.

Что я могу сделать, чтобы убедиться, что во время этого инициализации инициализируется новая оболочка и что команда rbenv будет работать?

4b9b3361

Ответ 1

У меня была схожая проблема, потому что я пытался установить rbenv, а бродяжничество предоставляло мне ошибку:

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

Прежде всего, очень важно понять, что брандмауэр script работает в режиме sudo. Итак, когда в script мы ссылаемся на ~/path, мы ссылаемся на/root/путь, а не на /home/vagrant/path. Проблема в том, что я устанавливал rbenv для пользователя root и после попытки вызвать команду rbenv у бродячего пользователя, и, конечно, это не сработало!

Итак, что я сделал, указывается на брандмауэр, чтобы запустить средство обеспечения, в котором пользователь sudo не добавляет привилегированный: false:

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

Затем в мой script я думал, что все вызывается от бродячего пользователя. Здесь @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

Надеясь, что это будет полезно кому-то другому.

Ответ 2

Я удивлен тем, что инициализация script завершается, поскольку запуск su vagrant должен теоретически повесить script в этот момент (вы используете команду su, которая обычно не выходит сама по себе).

Проблема заключается в том, что вы не можете изменить пользователя, который запускает оболочку script "на лету", запустив su.
Ваш единственный вариант - использовать sudo.

Поскольку вы только что обновили .bashrc с новым путем и другими настройками, вам нужно запустить "sudo bash" с опцией -i. Это заставит bash моделировать интерактивную оболочку входа и, следовательно, прочитать .bashrc и загрузить правильный путь для rbenv.

Итак, что-то вроде этого, надеюсь, будет работать:

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

Ответ 3

Существует другое решение для установки rbenv в рамках процесса Vagrant Provisioning, отличное от решений @Casper и @Diego D.

Использование следующих команд перед использованием команд rbenv

export PATH="$HOME/.rbenv/bin:$PATH"
export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"
eval "$(rbenv init -)"

Затем запустите rbenv команды установки без sudo -H -u vagrant bash -i -c

Файл Bootstrap.sh

#!/usr/bin/env bash

sudo apt-get update
echo "========================= install dependencies for install rbenv ==========================="
sudo apt-get install -y autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev
echo "========================= install rbenv =========================================="
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >>  ~/.bashrc
echo 'eval "$(rbenv init -)"' >>  ~/.bashrc
echo "========================= install ruby build plugin for rbenv ======================="
git clone https://github.com/rbenv/ruby-build.git  ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
echo "========================= install ruby v2.5.0 =========================================="
export PATH="$HOME/.rbenv/bin:$PATH"
export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"
eval "$(rbenv init -)"
rbenv install 2.5.0
rbenv global 2.5.0
ruby -v
gem -v
echo "========================= install bundler dependencies manager for ruby ====================="
gem install bundler
rbenv rehash

Затем в файл VagrantFile будет включена бродячая строка обеспечения

deploy_config.vm.provision :shell, privileged: false, path: "bootstrap.sh"

Источник моего ответа от Gits от @creisor