当前位置: 首页>>技术教程>>正文


ruby – 使用Ansible安装Bundler gem

, , , ,

问题描述

我正在尝试使用Ansible在我的VPS上安装Bundler。

我已经设置了rbenv,全局红 gems 是2.1.0。

如果我以root用户身份SSH进入服务器并运行gem install bundler,则它将完美安装。

我已经尝试了以下三种使用Ansible来安装Bundler gem的方法,并且这三种方法均不会产生错误,但是当我通过SSH并运行gem list时,Bundler却无处可见。

尝试1:

---
- name: Install Bundler
  shell: gem install bundler

尝试2:

---
- name: Install Bundler
  shell: gem install bundler

尝试3:

---
- name: Install Bundler
  gem: name=bundler
       state=latest

我还尝试了user_install=yesuser_install=no的最后一次尝试,但都没有任何区别。

关于如何通过Ansible正确安装Bundler的任何想法?

我已经为此工作了一段时间,并且安装了1个ruby版本:2.1.0和ahve发现rbenv的shims目录不包含bundle的填充程序。

bundle的垫片应该在那里吗?我只是困惑为什么为什么capistrano在运行sudo gem list时找不到列出的bundle命令,而在运行gem list时却找不到呢?

root@weepingangel:/usr/local/rbenv/shims# echo $PATH
/usr/local/rbenv/shims:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
root@weepingangel:/usr/local/rbenv/shims# gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 2.2.0
  - RUBY VERSION: 2.1.0 (2013-12-25 patchlevel 0) [x86_64-linux]
  - INSTALLATION DIRECTORY: /usr/local/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0
  - RUBY EXECUTABLE: /usr/local/rbenv/versions/2.1.0/bin/ruby
  - EXECUTABLE DIRECTORY: /usr/local/rbenv/versions/2.1.0/bin
  - SPEC CACHE DIRECTORY: /root/.gem/specs
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-linux
  - GEM PATHS:
     - /usr/local/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0
     - /root/.gem/ruby/2.1.0
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
     - :sources => ["http://gems.rubyforge.org", "http://gems.github.com"]
     - "gem" => "--no-ri --no-rdoc"
  - REMOTE SOURCES:
     - http://gems.rubyforge.org
     - http://gems.github.com
  - SHELL PATH:
     - /usr/local/rbenv/versions/2.1.0/bin
     - /usr/local/rbenv/libexec
     - /usr/local/rbenv/shims
     - /usr/local/sbin
     - /usr/local/bin
     - /usr/sbin
     - /usr/bin
     - /sbin
     - /bin
     - /usr/games

有任何想法吗?

因此,我认为我有两个主要问题:

  1. 为什么仅在运行sudo gem list时才显示捆绑器?

  2. 我的部署说:

    INFO [18d5838c] Running /usr/bin/env bundle install --binstubs  
    /var/rails_apps/neiltonge/shared/bin --path  
    /var/rails_apps/neiltonge/shared/bundle --without development test
    --deployment --quiet on 188.226.159.96 DEBUG [18d5838c] Command: cd /var/rails_apps/neiltonge/releases/20140301205432 && ( PATH=$PATH
    /usr/bin/env bundle install --binstubs
    /var/rails_apps/neiltonge/shared/bin --path
    /var/rails_apps/neiltonge/shared/bundle --without development test
    --deployment --quiet ) DEBUG [18d5838c]     /usr/bin/env: bundle: No such file or directory
    

    这是我的$PATH

    /usr/local/rbenv/shims:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
    

为什么找不到捆绑包?

最佳思路

问题在于,当通过ansible运行gem install bundler时,由于rbenv init.bashrc.bash_profile中运行,因此无法正确初始化rbenv。因此,使用的gem命令是系统命令,而不是作为rbenv填充程序安装的命令。因此,无论何时安装gem,它都将安装在system-wide中,而不是在rbenv环境中。

为了正确初始化rbenv,您必须执行bash本身并明确声明它是一个登录shell,因此它将读取它的初始化文件:

ansible your_host -m command -a 'bash -lc "gem install bundler"' -u your_rbenv_user 

如果您真的想以root用户身份离开,请保留-u your_rbenv_user部分。

如果上述命令有效,则可以轻松地将其转换为剧本操作:

- name: Install Bundler
  become_user: your_rbenv_user
  command: bash -lc "gem install bundler"

这很麻烦,但这是我到目前为止发现的唯一方法。

次佳思路

由于可以使用Ansible 1.3以下本机解决方案:

- name: requirements for installing gems
  apt:
    name: {{ item }}
  with_items:
    - ruby
    - ruby-dev
    - make

- name: install gem with proper $PATH
  gem:
    name: xyz
    user_install: no

提及user_install参数!此外,捆绑程序安装的某些依赖项可能还需要进一步的软件包依赖项:

  • zlib1g-dev

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/10032.html,未经允许,请勿转载。