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=yes
とuser_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つの主な問題だと思う:
Sudo gem list
を実行したときにのみバンドラーが表示されるのはなぜですか?
私のデプロイは言っています:
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
バンドルが見つからないのはなぜですか?
問題は、gem install bundler
がrbenv 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"
面倒ですが、これが私がこれまで見つけた唯一の方法です。
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によってインストールされるいくつかの依存関係では、さらに次のパッケージの依存関係が必要になる場合があります。
別のユーザーとしてコマンドを実行しようとしたときに、同様の環境問題に遭遇しました。これで説明したように、 機能要求 ログインシェルでコマンドを実行するための2つのオプションがあります(ユーザー環境をロードします)。たとえば、Railsユーザーとしてbundlerをインストールします:
- name: Install Bundler
Shell: gem install bundler
Sudo_user: Rails -i
または
- name: Install Bundler
command: Sudo -iu Rails gem install bundler
これは私のために働いた:
- 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
再ハッシュ後。
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
のバージョンのインストールプロセス中に正しいディレクトリに追加します。
次に、bundler
がPATH
にあることを確認します。
それでおしまい。