我正在尝试使用Ansible在我的VPS上安装Bundler。
我已经设置了rbenv,全局ruby是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并且发现rbenv的shims目录不包含bundle
的垫片。
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
有什么想法吗?
所以,我认为我遇到的两个主要问题是:
为什么只有在我运行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
为什么不能找到捆绑?
答案 0 :(得分:47)
问题在于,当通过ansible运行gem install bundler
时,您没有正确初始化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
如果您真的想以root身份执行此操作,请保留-u your_rbenv_user
部分。
如果以上命令有效,您可以轻松将其转换为剧本动作:
- name: Install Bundler
become_user: your_rbenv_user
command: bash -lc "gem install bundler"
这很麻烦,但这是我到目前为止找到的唯一方法。
答案 1 :(得分:13)
由于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 安装的某些dependecies可能需要遵循进一步的包依赖性:
答案 2 :(得分:2)
当我尝试以另一个用户身份运行命令时,我遇到了类似的环境问题。如此feature request中所述,您有两个选项可以在登录shell中执行命令(这将加载用户环境)。例如,我想将bundler安装为 rails 用户:
- name: Install Bundler
shell: gem install bundler
sudo_user: rails -i
或
- name: Install Bundler
command: sudo -iu rails gem install bundler
答案 3 :(得分:0)
这对我有用:
- name: rubygems | install bundler
shell: gem install bundler
- name: rbenv | rehash
shell: RBENV_ROOT={{ rbenv_root }} rbenv rehash
有时在安装bundler后,在系统上使用rbenv,您需要通过运行$PATH
来更新rbenv rehash
。我只是用ansible尝试了同样的东西,它起作用了。重拍后我的$PATH
可以使用Bundler。
答案 4 :(得分:0)
使用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
版本的安装过程中将其添加到正确的目录中。
然后确保bundler
在PATH
中。
就是这样。
答案 5 :(得分:0)
我知道它是这样工作的:
- 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
。
然后对捆绑程序模块使用相同的原理
- 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