web-dev-qa-db-fra.com

Installer Bundler gem avec Ansible

J'essaye d'installer Bundler sur mon VPS en utilisant Ansible.

J'ai déjà rbenv mis en place et le global Ruby est 2.1.0.

Si je SSH en tant que root sur le serveur et exécutez gem install bundler, il s’installe parfaitement.

J'ai essayé les trois manières suivantes d'utiliser Ansible pour installer la gem Bundler et toutes les trois ne génèrent aucune erreur, mais lorsque j'exécute SSH et exécute gem list, Bundler est introuvable.

Tentative 1:

---
- name: Install Bundler
  Shell: gem install bundler

Tentative 2:

---
- name: Install Bundler
  Shell: gem install bundler

Tentative 3:

---
- name: Install Bundler
  gem: name=bundler
       state=latest

J'ai également essayé la dernière tentative avec user_install=yes et aussi avec user_install=no et je ne fais aucune différence.

Des idées comment je peux le faire pour installer Bundler correctement via Ansible?

J'y travaille depuis un petit moment et j'ai 1 version de Ruby installée: 2.1.0 et j'ai constaté que le répertoire shims de rbenv ne contient pas de cale pour bundle.

Une cale pour bundle devrait-elle être présente? Je ne comprends vraiment pas pourquoi capistrano n'arrive pas à trouver la commande bundle car elle est répertoriée lorsque j'exécute Sudo gem list, mais PAS lorsque j'exécute 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

Des idées?

Donc, je pense que mes deux principaux problèmes:

  1. Pourquoi le groupeur est-il uniquement visible lorsque je lance Sudo gem list?

  2. Mon déploiement dit:

    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
    

    et voici mon $PATH:

    /usr/local/rbenv/shims:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
    

Pourquoi le paquet ne peut-il pas être localisé?

29
rctneil

Le problème est que, lorsque vous exécutez gem install bundler via ansible, vous n’initialisez pas rbenv correctement, car rbenv init est exécuté dans .bashrc ou .bash_profile. Donc, la commande gem utilisée est celle du système, et non celle installée en tant que shim rbenv. Ainsi, chaque fois que vous installez une gemme, celle-ci est installée sur l’ensemble du système et non dans votre environnement rbenv.

Pour que rbenv soit correctement initialisé, vous devez exécuter bash lui-même et indiquer explicitement qu'il s'agit d'un shell de connexion. Il lit donc ses fichiers d'initialisation:

ansible your_Host -m command -a 'bash -lc "gem install bundler"' -u your_rbenv_user 

Laissez la partie -u your_rbenv_user si vous voulez vraiment faire cela en tant que root.

Si la commande ci-dessus fonctionne, vous pouvez facilement la transformer en une action de livre de lecture:

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

C'est lourd, mais c'est le seul moyen que j'ai trouvé jusqu'à présent.

46
leucos

Depuis Ansible 1.3, la solution native suivante est possible:

- 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

Mentionnez le paramètre user_install! De plus, certaines dépendances installées par bundler pourraient nécessiter des dépendances supplémentaires:

  • zlib1g-dev
12
Thomas Steinbach

J'ai rencontré le même problème d'environnement lorsque j'ai essayé d'exécuter des commandes en tant qu'utilisateur différent. Comme mentionné dans cette feature request vous avez deux options pour exécuter votre commande dans le shell de connexion (qui chargera l’environnement utilisateur). Par exemple, je voudrais installer bundler en tant qu'utilisateur Rails

- name: Install Bundler
  Shell: gem install bundler
  Sudo_user: Rails -i

ou

- name: Install Bundler
  command: Sudo -iu Rails gem install bundler
2
Nick7

Cela a fonctionné pour moi:

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

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

Parfois, après l'installation de bundler, avec rbenv sur le système, vous devez mettre à jour votre $PATH en exécutant rbenv rehash. J'ai juste essayé la même chose avec ansible, et cela a fonctionné. Bundler est disponible dans mon $PATH après le rafraîchissement.

0
Struki84

Le moyen le plus propre et le plus rapide d'installer bundler à l'aide de Ansible est le suivant:

Installez simplement rbenv en utilisant le rôle https://github.com/zzet/ansible-rbenv-role et en configurant ses plugins comme suit (évidemment, il y a plus de paramètres à configurer que les plugins):

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 }

Le plugin inclus rbenv-default-gems va ajouter bundler par défaut et dans le bon répertoire lors du processus d'installation de la version de Ruby que vous aurez spécifiée.

Ensuite, assurez-vous que bundler est dans PATH.

C'est tout.

0
TomDogg