Vagrant / VirtualBox虚拟机configuration:rbenv成功安装,但随后在脚本中使用失败

我正在使用Vagrant + VirtualBox为我的Rails应用程序设置一个虚拟机。 我正在清理在Vagrantfile引用的.shconfiguration脚本, Vagrantfile所示:

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

规定脚本会做很多事情,但最后它应该安装rbenv Ruby版本控制,然后使用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打开vm,然后成功运行rbenv install 2.2.1 ,所以我猜测configuration期间一个新的vagrant shell并没有真正启动。 我以前rbenv install 2.2.1rbenv install 2.2.1之前rbenv install 2.2.1发生这种情况。

我能做些什么来确保在这个configuration过程中初始化一个新的shell,并且rbenv命令可以工作?

我有类似的问题,因为我正在试图安装rbenv和流浪配给给我的错误:

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

首先要了解的是,流浪脚本在sudo模式下运行是非常重要的 。 所以,当进入脚本时,我们引用〜/ path,我们引用/ root / path而不是/ home / vagrant / path。 问题是,我为root用户安装了rbenv,并试图从流浪用户调用rbenv命令,当然它没有奏效!

所以我所做的是指定vagrant在NOT sudo用户中运行provisioner添加特权:false

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

然后进入我的剧本,我正在考虑所有的东西都是来自流浪者的使用者。 这里@Casper的答案帮了我很大的忙,因为它的工作原理仅仅是指定:sudo -H -u vagrant bash -i -c'……'

由于您刚刚使用新路径和其他设置更新了.bashrc,因此您需要使用-i选项运行“sudo bash”。 这将迫使bash模拟交互式登录shell,因此读取.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来改变正在运行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 ...'