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:
Pourquoi le groupeur est-il uniquement visible lorsque je lance Sudo gem list
?
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é?
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.
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:
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
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.
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.