Инсталирайте скъпоценен камък на 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 и открих, че директорията shims за rbenv не съдържа shim за 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. Защо bundler се вижда само когато стартирам 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 shim. Така че всеки път, когато инсталирате gem, той се инсталира за цялата система, а не във вашата 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
  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. И да, ако искате да стартирате това на localhost, прав сте. Ansible обаче няма голяма добавена стойност в този случай. Съжалявам, ако отговорът ми е неясен. - person leucos; 15.09.2014
comment
Всъщност беше много полезно! Накара моя Vagrant да ме мрази малко по-малко. :) Благодаря отново. - 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

Срещнах подобен проблем със средата, когато се опитах да изпълнявам команди като друг потребител. Както бе споменато в тази заявка за функция, имате две опции да изпълните командата си в обвивката за влизане (това ще зареди потребителска среда). Например бих искал да инсталирам bundler като потребител на 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

Понякога след инсталиране на bundler, с 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