Установите драгоценный камень Bundler с помощью Ansible
Я пытаюсь установить Bundler на свой VPS, используя Ansible.
У меня уже установлена rbenv, а глобальный рубин - 2.1.0.
Если я SSH как root на сервере и запустил gem install bundler
, он установится отлично.
Я попробовал следующие три способа использования Ansible для установки драгоценного камня Bundler, и все три не вызывают ошибок, но когда я запускаю 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
и не имеет никакого значения.
Любые идеи, как я могу получить его, чтобы установить Bundler правильно через Ansible?
Я работал над этим некоторое время, и у меня установлена 1 рубиновая версия: 2.1.0 и ahve обнаружили, что каталог прокладок для rbenv не содержит прокладки для 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
Любые идеи?
Итак, я думаю, что у меня есть две основные проблемы:
-
Почему связка отображается только при запуске 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
Почему нельзя расположить узел?
Ответы
Ответ 1
Проблема заключается в том, что при запуске gem install bundler
через ansible вы не правильно инициализируете rbenv, так как rbenv init
запускается в .bashrc
или .bash_profile
. Таким образом, используемая команда gem
является системной, а не той, которая установлена как прокладка rbenv. Поэтому всякий раз, когда вы устанавливаете драгоценный камень, он устанавливается в общесистемном режиме, а не в вашей среде rbenv.
Чтобы корректно инициализироваться rbenv, вы должны выполнить bash самостоятельно и явно указать, что это оболочка входа, поэтому она считывает файлы инициализации:
ansible your_host -m command -a 'bash -lc "gem install bundler"' -u your_rbenv_user
Оставьте часть -u your_rbenv_user
, если вы действительно хотите сделать это как root.
Если приведенная выше команда работает, вы можете легко превратить ее в действие для воспроизведения:
- name: Install Bundler
sudo_user: your_rbenv_user
command: bash -lc "gem install bundler"
Это громоздко, но это единственный способ, который я нашел до сих пор.
Ответ 2
Так как возможен 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
! Кроме того, некоторые зависимости, установленные пакером, могут потребовать следующих дополнительных зависимостей пакета:
Ответ 3
Я столкнулся с аналогичной проблемой, когда пытался запустить команды в качестве другого пользователя. Как упоминалось в этом запросе функции, у вас есть два варианта выполнения вашей команды в оболочке входа (которая загрузит пользовательскую среду). Например, я хотел бы установить поставщика в качестве рельсов пользователя:
- name: Install Bundler
shell: gem install bundler
sudo_user: rails -i
или
- name: Install Bundler
command: sudo -iu rails gem install bundler
Ответ 4
Это работало для меня:
- name: rubygems | install bundler
shell: gem install bundler
- name: rbenv | rehash
shell: RBENV_ROOT={{ rbenv_root }} rbenv rehash
Иногда после установки пакета, с rbenv в системе, вам нужно обновить $PATH
, выполнив rbenv rehash
. Я просто попробовал одно и то же, и это сработало. Bundler доступен в моем $PATH
после перефразирования.