VagrantFile内联脚本和rvm配置

POL*_*LOX 3 ruby provisioning rvm vagrant vagrantfile

我试图使用以下脚本在流浪汉文件中使用rvm在vagrant用户中设置versiónruby版本:

 config.vm.provision "shell", inline: <<-SHELL
     sudo apt-get -y update
     sudo apt-get -y install git ruby libgdbm-dev libncurses5-dev automake libtool bison libffi-dev
 nodejs
     #Install ruby environment
     curl -sSL https://rvm.io/mpapis.asc | gpg --import -
     curl -L https://get.rvm.io | bash -s stable
     sudo "source ~/.rvm/scripts/rvm"
     echo "source ~/.rvm/scripts/rvm" >> ~/.bashrc
     sudo /usr/local/rvm/bin/rvm install 2.1.5
     rvm 2.1.5 --default
     sudo chown -R vagrant:vagrant /usr/local/rvm/gems/
     gem install middleman   
     git clone  XXXX
     SHELL
END   
Run Code Online (Sandbox Code Playgroud)

Vagrant给我回复了以下信息:

 /tmp/vagrant-shell: line 10: rvm: command not found
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用完整路径运行命令,它将返回以下消息:

/usr/local/rvm/bin/rvm 2.1.5 --default

RVM is not a function, selecting rubies with 'rvm use ...' will not work.

You need to change your terminal emulator preferences to allow login shell.
Sometimes it is required to use `/bin/bash --login` as the command.
Please visit https://rvm.io/integration/gnome-terminal/ for an example.
Run Code Online (Sandbox Code Playgroud)

无论如何以记录模式或其他方式执行内联脚本以使用rvm来设置默认版本?

谢谢 :)

Rya*_*ick 6

对所提供脚本的更改将阻止上述代码以退出状态错误退出.

Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"

  config.vm.provision "shell", inline: <<-SHELL
    RUBY_VERSION="2.1.5"
    sudo apt-get -y update
    sudo apt-get -y install git nodejs
    # Install ruby environment
    if ! type rvm >/dev/null 2>&1; then
      curl -sSL https://rvm.io/mpapis.asc | gpg --import -
      curl -L https://get.rvm.io | bash -s stable
      source /etc/profile.d/rvm.sh
    fi

    if ! rvm list rubies ruby | grep ruby-${RUBY_VERSION}; then
      rvm install ${RUBY_VERSION}
    fi

    rvm --default use ${RUBY_VERSION}
    rvm all do gem install middleman
    git clone <REPLACE_WITH_YOUR_REPO>
SHELL
end
Run Code Online (Sandbox Code Playgroud)

变更说明:

  1. 无需提供"〜/ .rvm/scripts/rvm".首先,它失败了,因为由于vagrant作为非登录shell运行,它不像前面提到的那样存在.其次,rvm的安装会在/etc/profile.d/rvm.sh中创建启动文件,为您处理这种情况.请参阅https://rvm.io/integration/gnome-terminal.您仍会在vagrant的控制台输出中看到警告(红色),但脚本不会因为退出状态错误而失败.因此,我们需要在安装RVM后立即获取/etc/profile.d/rvm.sh,因为我们当前的shell尚未加载rvm.sh.这在RVM安装输出中提到过.另一种方法是将脚本分解为多个部分,以强制尾随脚本获取新路径.
  2. 由于vagrant作为非登录shell运行,因此无需更改/ usr/local/rvm/gems /文件夹的所有权.我认为在某些时候,vagrant确实以vagrant用户身份运行脚本,但在最近的版本中这已经发生了变化.脚本实际上将以root身份运行; 由于privilegedshell脚本上的选项,默认情况下会发生这种情况; 请参阅Shell Provisioner.如果您不确定哪个用户正在运行,您可以whoami在脚本中执行操作.如果通过设置降级权限,脚本将作为vagrant用户运行privileged => false.
  3. 在rvm GPG密钥和安装周围添加了条件块.除非你需要在每个条款上安装rvm.可以提出一个论点,即你可能试图让它保持最新,但这可能会引入未知因素并打破从一天到下一天的可重复结果.
  4. 在ruby版本的安装周围添加了一个条件块.这可以防止有关包的警告已经安装,使用重新安装.
  5. 清理您正在安装的软件包.您可能会重新查看此内容,但是您使用apt-get安装的软件包将由rvm安装程序自动安装,并为您的脚本添加额外的漏洞.

替代和更灵活的方法

如果您不停留使用内联脚本.我会按照使用RVM和Vagrant中的描述去路线.我在上面提出的一些建议将重新应用于本文中脚本的一般逻辑.需要进行的一项更改是在install-rvm.sh脚本中.添加GPG密钥导入; 如下所示:

#!/usr/bin/env bash

curl -sSL https://rvm.io/mpapis.asc | gpg --import -
curl -sSL https://get.rvm.io | bash -s $1
Run Code Online (Sandbox Code Playgroud)