【问题标题】:Install Bundler gem using Ansible使用 Ansible 安装 Bundler gem
【发布时间】:2014-04-02 16:21:21
【问题描述】:

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

我已经设置了 rbenv 并且全局 ruby​​ 是 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 并且发现 rbenv 的 shims 目录不包含 bundle 的 shim。

bundle 的垫片应该在里面吗?我只是对为什么 capistrano 找不到 bundle 命令感到困惑,因为它在我运行 sudo gem list 时列出,但在我运行 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
    

为什么找不到bundle?

【问题讨论】:

  • 是的,我发现运行 gem list 不会显示 Bundler,但 sudo gem list 会显示!为什么会出现这种情况以及宝石应该在哪里让 Capistrano 能够使用它?

标签: ruby ubuntu rubygems bundler ansible


【解决方案1】:

我是这样工作的:

- name: Install jekyll and bundler                                                                                                                      
  become_user: bob                                                                                                                    
  gem:                                                                                                                                                  
    name: "{{ item }}"                                                                                                                                  
  environment:                                                                                                                                          
    GEM_HOME: /home/bob/gems                                                                                                          
    PATH: $PATH:/bin/:/usr/bin/:/home/bob/gems/bin                                                                                    
  with_items:                                                                                                                                           
    - jekyll                                                                                                                                            
    - bundler 

bob 替换为您的本地用户。

然后和bundler模​​块使用同样的原理

- name: Install Gems                                                                                                                                    
  become_user: bob                                                                                                                     
  bundler:                                                                                                                                              
    gemfile: /home/bob/Gemfile                                                                                          
    state: present                                                                                                                                      
  environment:                                                                                                                                          
    GEM_HOME: /home/bob/gems                                                                                                           
    PATH: $PATH:/bin/:/usr/bin/:/home/bob/gems/bin

【讨论】:

    【解决方案2】:

    使用 Ansible 安装 bundler 的最干净、最快捷的方法是:

    使用角色https://github.com/zzet/ansible-rbenv-role 安装rbenv 并像这样配置其插件(显然,要配置的参数不仅仅是插件):

    rbenv_plugins:
    - { name: 'ruby-build',
        repo: 'https://github.com/rbenv/ruby-build.git',
        version: master }
    - { name: 'rbenv-default-gems',
        repo: 'https://github.com/rbenv/rbenv-default-gems.git',
        version: master }
    

    包含的插件rbenv-default-gems会默认添加bundler,在安装过程中你会指定ruby版本的正确目录中。

    然后确保bundlerPATH 中。

    就是这样。

    【讨论】:

      【解决方案3】:

      问题是,当通过 ansible 运行 gem install bundler 时,您没有正确初始化 rbenv,因为 rbenv init.bashrc.bash_profile 中运行。所以使用的gem 命令是系统命令,而不是作为rbenv shim 安装的命令。因此,每当您安装 gem 时,它都会安装在系统范围内,而不是在您的 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"
      

      这很麻烦,但这是我目前找到的唯一方法。

      【讨论】:

      • 嘿,完美!这是有道理的,并且可以正常工作。那是另一部分解决了。接下来是试图弄清楚为什么在 capistrano 部署期间找不到 bundle 命令,但我认为问题可能与此相同。
      • -l :告诉 bash 表现得好像它是通过登录 shell 调用的一样 / -c :要执行的命令。它在man bash 的第一页:)
      • 抱歉,我是故意的。谢谢!
      • 其实很有帮助!让我的流浪者对我的恨少了一点。 :) 再次感谢。
      • 太棒了。从 2.x ansible 开始,使用 become_user 而不是 sudo_user
      【解决方案4】:

      这对我有用:

      - name: rubygems | install bundler
        shell: gem install bundler
      
      - name: rbenv | rehash
        shell: RBENV_ROOT={{ rbenv_root }} rbenv rehash
      

      有时在系统上使用 rbenv 安装 bundler 后,您需要通过运行 rbenv rehash 来更新您的 $PATH。我只是用ansible尝试了同样的事情,它奏效了。重新散列后,Bundler 在我的$PATH 中可用。

      【讨论】:

        【解决方案5】:

        由于 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 参数!此外,bundler 安装的一些依赖项可能需要以下进一步的包依赖项:

        • zlib1g-dev

        【讨论】:

        • 谢谢,这对我有帮助。
        • 那里有最佳答案。
        • user_install: no 仅用于系统范围的安装。
        • @ThomasSteinbach 我可以添加 Gemfile 而不是单个 gem 吗?我基本上想做bundle install
        【解决方案6】:

        当我尝试以其他用户身份运行命令时,我遇到了类似的环境问题。正如feature request 中提到的,您有两个选项可以在登录 shell 中执行您的命令(这将加载用户环境)。例如,我想以 rails 用户身份安装 bundler:

        - name: Install Bundler
          shell: gem install bundler
          sudo_user: rails -i
        

        - name: Install Bundler
          command: sudo -iu rails gem install bundler
        

        【讨论】:

          猜你喜欢
          • 2011-04-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-26
          • 1970-01-01
          • 1970-01-01
          • 2015-03-05
          • 2013-05-02
          相关资源
          最近更新 更多