【问题标题】:Installing rbenv through shell script通过 shell 脚本安装 rbenv
【发布时间】:2016-12-13 14:59:24
【问题描述】:

我创建了一个 shell 脚本来将 rbenv 安装到一个新的虚拟机上,每个人似乎都工作正常,但是,有时 rbenv 似乎无法安装。我想在整个过程中添加一些额外的错误检查以确保安装发生,如果出现故障,请重新开始安装。

一些注意事项:

  • 这是较大脚本的一小部分
  • 这一切都是通过whiptail 对话框完成的
  • 我将输出重定向到 events.log 文件 >&$log_fd...

这是我目前拥有的:

set_rbenv(){
  # install rbenv
  RUBY_VERSION="2.1.4"
  RBENV_ROOT="/root/.rbenv"
  PROFILE="/root/.bashrc"

  # check if rbenv is installed
  if [[ ! `which rbenv` ]]; then

    if [[ ! -d "$RBENV_ROOT" ]]; then
      echo "Cloning rbenv..." >&$log_fd 2>&1
      git clone https://github.com/rbenv/rbenv.git $RBENV_ROOT >&$log_fd 2>&1
    fi

    if [[ ! -d "$RBENV_ROOT/plugins/ruby-build" ]]; then
      git clone https://github.com/rbenv/ruby-build.git $RBENV_ROOT/plugins/ruby-build >&$log_fd 2>&1
    fi

    if [[ ! `grep -e '/.rbenv\/bin' $PROFILE` ]]; then
      echo "rbenv not in PATH ... adding..." >&$log_fd 2>&1
      echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> $PROFILE 2>&1
    fi
    if [[ ! `grep -e '^\eval "$(rbenv init -)"' $PROFILE` ]]; then
      echo "rbenv init not in .bashrc... adding..." >&$log_fd 2>&1
      echo 'eval "$(rbenv init -)"' >> $PROFILE 2>&1
    fi
    . $PROFILE
    echo "Finished Installing rbenv..." >&$log_fd 2>&1
  else
    echo "rbenv already installed... skipping!" >&$log_fd 2>&1
  fi

  if [ ! -d "$RBENV_ROOT/versions" ]; then
    echo "$RBENV_ROOT/versions doesn't exist ... creating..."
    mkdir $RBENV_ROOT/versions >&$log_fd 2>&1
  fi

  if [ ! -d "$RBENV_ROOT/versions/$RUBY_VERSION" ]; then
    echo "$RBENV_ROOT/versions/$RUBY_VERSION doesn't exist ... creating..." >&$log_fd 2>&1
    mkdir $RBENV_ROOT/versions/$RBENV_VERSION >&$log_fd 2>&1
  fi

  # check if ruby version is installed
  if [[ ! `rbenv version | grep $RUBY_VERSION` ]]; then
    echo "installing ruby 2.1.4" >&$log_fd 2>&1
    rbenv install $RUBY_VERSION >&$log_fd 2>&1
    rbenv global $RUBY_VERSION >&$log_fd 2>&1

    if [ ! -d "$RBENV_ROOT/versions/$RUBY_VERSION/etc" ]; then
      echo "$RBENV_ROOT/versions/$RUBY_VERSION/etc doesn't exist ... creating..." >&$log_fd 2>&1
      mkdir $RBENV_ROOT/versions/$RUBY_VERSION/etc >&$log_fd 2>&1
    fi

  else
    echo "ruby $RUBY_VERSION already exists... skipping!" >&$log_fd 2>&1
  fi
  (( STATUS += 35 ))
  echo $STATUS
}

虽然安装本身可能随时在新 VM 上失败,但如果安装了 rbenv,我就搞砸了,但没有其他操作(如 ruby​​-build)或 $PATH 等。

将每个命令包含在初始 if which rbenv 之外的自己的 if 语句中是否更有意义,或者是否有更可靠的方法来确保安装成功完成?

【问题讨论】:

    标签: ruby linux bash shell rbenv


    【解决方案1】:

    您实际上可以使用 Ansible、puppet 或 Chef 等配置管理工具更轻松地执行此任务。与其尝试指定“如何”来检查和使用无休止的 IF 语句,不如指定“什么”来检查并使用现有框架来执行此操作。

    例如,在 Ansible 中,您可以指定使用 apt 模块更新缓存并安装最新版本的 foo

    - hosts: all
      remote_user: root
      tasks:
      - name: Install the package foo
        apt:
          name: foo
          state: present
          update_cache: yes
    

    More information

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 2013-05-15
      • 1970-01-01
      相关资源
      最近更新 更多