2014-03-01 15 views
27

Ich versuche, Bundler auf meinem VPS mit Ansible zu installieren.Installieren Bundler Gem mit Ansible

Ich habe bereits rbenv eingerichtet und der globale Ruby ist 2.1.0.

Wenn ich SSH als root in den Server und laufen, installiert es perfekt.

Ich habe versucht die folgenden drei Möglichkeiten der Verwendung von Ansible, um den Bundler Juwel zu installieren und alle drei produzieren keine Fehler, aber wenn ich SSH in und gem list laufen, ist Bundler nirgendwo zu sehen.

Versuch 1:

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

Versuch 2:

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

Versuch 3:

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

Ich habe auch versucht, den letzten Versuch mit user_install=yes und auch mit user_install=no und weder machen jede Differenz.

Irgendwelche Ideen, wie ich Bundler korrekt über Ansible installieren kann?

Ich habe schon eine Weile daran gearbeitet und ich habe 1 Ruby-Version installiert: 2.1.0 und habe herausgefunden, dass das Shims-Verzeichnis für rbenv keine Shim für bundle enthält.

Sollte ein Shim für bundle da drin sein? Ich bin nur verwirrt darüber, warum capistrano den bundle Befehl nicht finden kann, wie es aufgeführt wird, wenn ich sudo gem list laufen lasse, aber NICHT, wenn ich gem list laufen lasse?

[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 

Irgendwelche Ideen?

Also, ich glaube, die beiden wichtigsten Probleme, die ich habe:

  1. Warum ist bundler nur sichtbar, wenn ich sudo gem list laufen?

  2. Mein deploy sagt:

    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 
    

    und das ist mein $PATH:

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

Warum nicht gefunden werden bündeln?

+0

Richtig Ich habe festgestellt, dass das Ausführen von "Gem List" Bundler nicht zeigt, aber "Sudo Gem List" tut! Warum sollte das und wo sollte das Juwel sein, damit Capistrano es benutzen kann? – rctneil

Antwort

43

Das Problem ist, dass, wenn gem install bundler über ansible ausgeführt wird, Sie nicht richtig initialisiert rbenv, da rbenv init in .bashrc oder .bash_profile ausgeführt wird. Der verwendete gem-Befehl ist also das System, nicht der als rbenv-Shim installierte. Wenn Sie also ein Juwel installieren, wird es systemweit installiert, nicht in Ihrer rbenv-Umgebung.

Um rbenv richtig initialisiert haben, können Sie bash selbst und explizit ausführen muss bestätigen, dass es sich um eine Login-Shell ist, so liest es Initialisierungsdateien:

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

Lassen Sie das -u your_rbenv_user Teil, wenn Sie das wirklich tun möchte, als Wurzel.

Wenn die obigen Befehl funktioniert, können Sie einfach schalten Sie ihn in eine Textbuch Aktion:

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

Es ist mühsam, aber es ist der einzige Weg, die ich bisher gefunden.

+1

Hey, perfekt! Das macht Sinn und es funktioniert richtig. Das ist ein anderer gelöster Teil. Als nächstes versuche ich herauszufinden, warum der Befehl bundle während der Bereitstellung durch capistrano nicht gefunden werden kann, aber ich denke, das Problem könnte in die gleiche Richtung gehen. – rctneil

+0

Könntest du bitte erklären, was die LC-Flags im bash-Befehl tun? – rctneil

+2

-l: tell Bash so tun, als ob er über eine Login-Shell aufgerufen wurde/-c: Der auszuführende Befehl. Es ist auf der ersten Seite von 'Mann bash' :) – leucos

3

Ich habe die ähnliche Umgebung Problem, wenn ich versuchte, Befehle als ein anderer Benutzer auszuführen. Wie in dieser feature request erwähnt, haben Sie zwei Möglichkeiten, um Ihren Befehl in der Login-Shell auszuführen (die Benutzerumgebung wird geladen). Zum Beispiel mag I'ld Bündler als Schienen Benutzer zu installieren:

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

oder

- name: Install Bundler 
    command: sudo -iu rails gem install bundler 
11

Seit ansible 1.3 folgenden nativen Lösung möglich:

- 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 

die user_install Parameter Erwähnen ! Zusätzlich einige der bundler installiert dependecies könnten weitere Paketabhängigkeiten folgende Voraussetzungen:

  • zlib1g-dev
+0

Das hat funktioniert, danke! –

+0

Danke, das hat mir geholfen. – Alberick0

+0

beste Antwort dort. – ipeacocks

0

Das ist für mich gearbeitet:

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

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

Manchmal nach bundler Installation mit rbenv Auf dem System müssen Sie Ihre $PATH aktualisieren, indem Sie rbenv rehash ausführen. Ich habe das gleiche mit Ansible versucht, und es hat funktioniert. Bundler ist in meinem $PATH nach dem erneuten Aufräumen verfügbar.

Verwandte Themen