2014-03-01 165 views
27

我想使用Ansible在我的VPS上安装Bundler。使用Ansible安装Bundler gem

我已经有rbenv设置和全球红宝石2.1.0。

如果我以root身份进入服务器并运行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=yes并与user_install=no也不做任何差异。

任何想法如何让它通过Ansible正确安装Bundler?

我一直在为此工作了一小会儿,并且安装了1个ruby版本:2.1.0和ahve发现rbenv的shim目录不包含bundle的垫片。

bundle应该放在哪里?我只是感到困惑,为什么capistrano无法找到bundle命令,因为它在我运行sudo gem list时列出,但不是当我运行gem list时?

[email protected]:/usr/local/rbenv/shims# echo $PATH 
/usr/local/rbenv/shims:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 
[email protected]:/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 
    

为什么不能捆放置在何处?

+0

右键我发现运行'gem list'不显示Bundler而是'sudo gem list'!为什么是这个,以及Capistrano能够使用它的地方? – rctneil

回答

43

的问题是,在运行时gem install bundler通过ansible,你没有初始化rbenv正确,因为rbenv init.bashrc.bash_profile运行。所以使用的gem命令是系统命令,而不是作为rbenv垫片安装的命令。所以无论何时你安装一个gem,它都被安装在整个系统中,而不是在你的rbenv环境中。

要有rbenv正确初始化,您必须执行的bash本身并明确地指出,这是一个登录shell,所以它读取它的初始化文件:

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

离开-u your_rbenv_user的一部分,如果你真的想这样做,因为根。

如果上述命令的作品,你可以很容易地把它变成一个剧本行动:

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

这是很麻烦的,但它是我迄今发现的唯一途径。

+1

嘿,完美!这是有道理的,它工作正常。这是另一部分解决。接下来是试图找出为什么在capistrano部署期间无法找到捆绑命令,但我认为这个问题可以沿着相同的路线。 – rctneil

+0

请您澄清lc标志在bash命令上做了什么? – rctneil

+2

-l:告诉bash如同通过登录shell调用bc/-c:要执行的命令。它在'man bash'的第一页:) – leucos

3

当我试图以另一个用户身份运行命令时,我遇到了类似的环境问题。正如在feature request中提到的那样,您有两个选项可以在登录shell中执行命令(这将加载用户环境)。例如i'ld要安装打捆作为导轨用户:

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

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

由于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的
+0

工作,谢谢! –

+0

谢谢,这帮了我。 – Alberick0

+0

有最佳答案。 – ipeacocks

0

这个工作对我来说:

- name: rubygems | install bundler 
    shell: gem install bundler 

- name: rbenv | rehash 
    shell: RBENV_ROOT={{ rbenv_root }} rbenv rehash 

有时,安装捆绑,用rbenv后在系统上,您需要通过运行rbenv rehash来更新您的$PATH。我只用同样的方法尝试了同样的事情,而且它很有效。重新散列后,Bundler可在我的$PATH中找到。