2014-03-01 162 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中找到。