Подтвердить что ты не робот

Установите драгоценный камень 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
    

Почему нельзя расположить узел?

4b9b3361

Ответ 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! Кроме того, некоторые зависимости, установленные пакером, могут потребовать следующих дополнительных зависимостей пакета:

  • zlib1g-DEV

Ответ 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 после перефразирования.