web-dev-qa-db-ja.com

Ansibleを使用してBundler gemをインストールする

Ansibleを使用してVPSにBundlerをインストールしようとしています。

私はすでにrbenvをセットアップしており、グローバルRubyは2.1.0です。

サーバーにrootとしてSSHで接続し、gem install bundlerを実行すると、完全にインストールされます。

Ansibleを使用してBundler gemをインストールする次の3つの方法を試してみましたが、3つともエラーが発生しませんが、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 version version:2.1.0とahveは、rbenvのshimsディレクトリにbundle

bundleのシムはそこにあるべきですか? Sudo gem listを実行するときではなく、gem listを実行するときにリストされているように、capistranoがbundleコマンドを見つけることができない理由について混乱しています。

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

何か案は?

だから、私が持っている2つの主な問題だと思う:

  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
    

バンドルが見つからないのはなぜですか?

31
rctneil

問題は、gem install bundlerrbenv initまたは.bashrcで実行されるため、ansibleを介して.bash_profileを実行する場合、rbenvを適切に初期化しないということです。したがって、使用されるgemコマンドは、rbenv shimとしてインストールされたものではなく、システムのものです。したがって、gemをインストールするたびに、rbenv環境ではなくシステム全体にインストールされます。

Rbenvを適切に初期化するには、bash自体を実行し、ログインシェルであることを明示的に指定する必要があります。そのため、初期化ファイルを読み取ります。

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"

面倒ですが、これが私がこれまで見つけた唯一の方法です。

47
leucos

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
13

別のユーザーとしてコマンドを実行しようとしたときに、同様の環境問題に遭遇しました。これで説明したように、 機能要求 ログインシェルでコマンドを実行するための2つのオプションがあります(ユーザー環境をロードします)。たとえば、Railsユーザーとしてbundlerをインストールします:

- name: Install Bundler
  Shell: gem install bundler
  Sudo_user: Rails -i

または

- name: Install Bundler
  command: Sudo -iu Rails gem install bundler
2
Nick7

これは私のために働いた:

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

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

時々、システムにrbenvを使用してbundlerをインストールした後、$PATHを実行してrbenv rehash。私はちょうどansibleで同じことを試しましたが、うまくいきました。 Bundlerは私の$PATH再ハッシュ後。

0
Struki84

Ansibleを使用してbundlerをインストールする最もクリーンで迅速な方法は次のとおりです。

単にロールを使用してrbenvをインストールします https://github.com/zzet/ansible-rbenv-role そしてそのようにプラグインを構成します(明らかに、構成するパラメーターがさらにあります)プラグインだけでなく):

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にあることを確認します。

それでおしまい。

0
TomDogg