Установите гем 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 версия ruby: 2.1.0, и я обнаружил, что каталог прокладок для rbenv не содержит прокладок для 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

Любые идеи?

Итак, я думаю, что у меня есть две основные проблемы:

  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
    

Почему не удается найти связку?


person rctneil    schedule 01.03.2014    source источник
comment
Правильно, я обнаружил, что запуск gem list не показывает Bundler, а sudo gem list показывает! Почему это и где должен быть драгоценный камень, чтобы Капистрано мог его использовать?   -  person rctneil    schedule 01.03.2014


Ответы (6)


Проблема в том, что при запуске 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.

Если приведенная выше команда работает, вы можете легко превратить ее в действие playbook:

- name: Install Bundler
  become_user: your_rbenv_user
  command: bash -lc "gem install bundler"

Это громоздко, но пока что это единственный способ, который я нашел.

person leucos    schedule 01.03.2014
comment
Привет, отлично! Это имеет смысл и работает правильно. Это другая часть решена. Далее я пытаюсь выяснить, почему команда bundle не может быть найдена во время развертывания с помощью capistrano, но я думаю, что проблема может быть в том же направлении. - person rctneil; 02.03.2014
comment
Не могли бы вы пояснить, что делают флаги lc в команде bash? - person rctneil; 02.03.2014
comment
-l: указать bash действовать так, как если бы он был вызван через оболочку входа / -c: команду для выполнения. Это на первой странице man bash :) - person leucos; 02.03.2014
comment
Прошу прощения, я действительно хотел. Спасибо! - person rctneil; 02.03.2014
comment
@leucos: Не могли бы вы пояснить, что вы имеете в виду под командой your_hostand? Спасибо! - person Petr Cibulka; 15.09.2014
comment
Для новичков вроде меня команда выглядит так: ansible localhost -m command -a 'bash -lc "gem install bundler"' -u vagrant Пожалуйста, поправьте меня, если я ошибаюсь! - person Petr Cibulka; 15.09.2014
comment
@PetrCibulka: your_host - это хост, на котором вы хотите запустить упаковщик; command буквально command. И да, если вы хотите запустить это на локальном хосте, вы правы. Однако в данном случае ансибл не имеет особой добавленной стоимости. Извините, если мой ответ был непонятен. - person leucos; 15.09.2014
comment
На самом деле это было очень полезно! Заставил моего Бродягу ненавидеть меня немного меньше. :) Еще раз спасибо. - person Petr Cibulka; 15.09.2014
comment
Здорово. Используйте become_user вместо sudo_user в версии 2.x ansible. - person cdmo; 24.08.2018

Начиная с 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
person Thomas Steinbach    schedule 02.06.2015
comment
Спасибо, это помогло мне. - person Jean Guzman; 19.08.2016
comment
лучший ответ там. - person ipeacocks; 12.07.2017
comment
user_install: no предназначен только для общесистемной установки. - person TomDogg; 14.08.2018
comment
@ThomasSteinbach Могу ли я добавить Gemfile вместо одного драгоценного камня? Я в основном хочу сделать bundle install - person Nikhil Wagh; 25.03.2020

Я столкнулся с аналогичной проблемой среды, когда пытался запускать команды от имени другого пользователя. Как упоминалось в этом запросе функции, у вас есть два варианта выполнения вашей команды в оболочке входа (это загрузит пользовательскую среду). Например, я хотел бы установить сборщик как пользователь rails:

- name: Install Bundler
  shell: gem install bundler
  sudo_user: rails -i

or

- name: Install Bundler
  command: sudo -iu rails gem install bundler
person Nick7    schedule 27.09.2014

Это сработало для меня:

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

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

Иногда после установки бандлера с rbenv в системе вам нужно обновить $PATH, запустив rbenv rehash. Я просто попробовал то же самое с ansible, и это сработало. Bundler доступен в моем $PATH после перепрошивки.

person Struki84    schedule 16.12.2015

Самый чистый и быстрый способ установить bundler с помощью Ansible:

Просто установите 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.

Вот и все.

person TomDogg    schedule 10.11.2018

У меня это работает так:

- 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
person daamien    schedule 26.04.2020