【问题标题】:VagrantFile inline script and rvm provisioningVagrantFile 内联脚本和 rvm 配置
【发布时间】:2015-01-15 10:53:45
【问题描述】:

我正在尝试使用以下脚本在 vagrant 文件中使用 rvm 设置 vagrant 用户的 ruby​​ 版本:

 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   

Vagrant 正在向我返回以下消息:

 /tmp/vagrant-shell: line 10: rvm: command not found

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

/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.

到底有没有在日志模式下执行内联脚本或其他方式使用rvm设置默认版本?

谢谢:)

【问题讨论】:

标签: ruby rvm vagrant provisioning vagrantfile


【解决方案1】:

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

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

变更说明:

  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 身份运行;由于 shell 脚本上的 privileged 选项,默认情况下会发生这种情况;见Shell Provisioner。如果您不确定哪个用户正在运行,您可以在脚本中执行whoami。如果您通过设置privileged =&gt; false 来降低权限,该脚本将以流浪用户身份运行。
  3. 在 rvm GPG 密钥和安装周围添加了一个条件块。除非您需要在每个配置上都安装 rvm。有人可能会提出您可能试图使其保持最新的论点,但这可能会引入未知数并破坏可重复的结果。
  4. 在安装 ruby​​ 版本时添加了一个条件块。这可以防止有关软件包已安装的警告,请使用重新安装。
  5. 清理了您正在安装的软件包。您可能会重新查看此内容,但您使用 apt-get 安装的软件包将由 rvm 安装程序自动安装,并为您的脚本添加额外的绒毛。

另一种更灵活的方法

如果您不坚持使用内联脚本。我会按照Using RVM with 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

【讨论】:

    猜你喜欢
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多