2016-07-06 8 views
2

Mein Problem ist ein bisschen schwierig. Ich wurde beauftragt, ein Deployment-Skript für ein System-Build in Ruby (nicht von mir entwickelt) zu erstellen. Dieses Projekt hat bereits eine Capistrano-Bereitstellung, die funktioniert, solange die Maschine zuvor eingerichtet wurde. Meine Aufgabe ist es, dieses Setup zu automatisieren, ohne den Capistrano-Teil zu berühren. Da ich Capistrano nicht kenne und wenig Zeit habe, habe ich mich entschieden, ansible zu benutzen.So rufen Sie capistrano von ansible Skript

Die Idee besteht darin, das ansible-Skript auszuführen, dies richtet die Maschine ein und capistrano ruft das Projekt auf. Ich habe versucht, die folgenden Aufgaben und alle produzierten einige Fehler:

- name: Run cap 
    shell: "cap generic_production deploy" 
    environment: 
    MACHINE: localhost 
    args: 
    chdir: /home/{{ansible_user_id}}/project 
fatal: [test]: FAILED! => {"changed": true, "cmd": "cap generic_production deploy", "delta": "0:00:00.106225", "end": "2016-07-06 15:54:42.482794", "failed": true, "rc": 1, "start": "2016-07-06 15:54:42.376569", "stderr": "/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- capistrano/setup (LoadError) 
    from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require' 
    from /usr/lib/ruby/vendor_ruby/capistrano/configuration/loading.rb:152:in `require' 
    from Capfile:2:in `load'\ 
    from /usr/lib/ruby/vendor_ruby/capistrano/configuration/loading.rb:93:in `instance_eval' 
    from /usr/lib/ruby/vendor_ruby/capistrano/configuration/loading.rb:93:in `load' 
    from /usr/lib/ruby/vendor_ruby/capistrano/configuration/loading.rb:172:in `load_from_file' 
    from /usr/lib/ruby/vendor_ruby/capistrano/configuration/loading.rb:89:in `load' 
    from /usr/lib/ruby/vendor_ruby/capistrano/configuration/loading.rb:86:in `block in load' 
    from /usr/lib/ruby/vendor_ruby/capistrano/configuration/loading.rb:86:in `each' 
    from /usr/lib/ruby/vendor_ruby/capistrano/configuration/loading.rb:86:in `load' 
    from /usr/lib/ruby/vendor_ruby/capistrano/cli/execute.rb:65:in `block in load_recipes' 
    from /usr/lib/ruby/vendor_ruby/capistrano/cli/execute.rb:65:in `each' 
    from /usr/lib/ruby/vendor_ruby/capistrano/cli/execute.rb:65:in `load_recipes' 
    from /usr/lib/ruby/vendor_ruby/capistrano/cli/execute.rb:31:in `execute!' 
    from /usr/lib/ruby/vendor_ruby/capistrano/cli/execute.rb:14:in `execute' 
    from /usr/bin/cap:4:in `<main>'", "stdout": "", "stdout_lines": [], "warnings": []} 
- name: Run cap 
    shell: "bundle exec cap generic_production deploy" 
    environment: 
    MACHINE: localhost 
    args: 
    chdir: /home/{{ansible_user_id}}/project 
fatal: [test]: FAILED! => {"changed": true, "cmd": "bundle exec cap generic_production deploy", "delta": "0:00:00.001287", "end": "2016-07-06 15:50:21.472625", "failed": true, "rc": 127, "start": "2016-07-06 15:50:21.471338", "stderr": "/bin/sh: 1: bundle: not found", "stdout": "", "stdout_lines": [], "warnings": []} 
- name: Run cap 
    shell: "sudo -iu {{ansible_user_id}} bundle exec cap generic_production deploy" 
    environment: 
    MACHINE: localhost 
    args: 
    chdir: /home/{{ansible_user_id}}/project 
fatal: [test]: FAILED! => {"changed": true, "cmd": "sudo -iu deploy bundle exec cap generic_production deploy", "delta": "0:00:00.230098", "end": "2016-07-06 15:28:42.623268", "failed": true, "rc": 10, "start": "2016-07-06 15:28:42.393170", "stderr": "", "stdout": "Could not locate Gemfile or .bundle/ directory", "stdout_lines": ["Could not locate Gemfile or .bundle/ directory"], "warnings": ["Consider using 'become', 'become_method', and 'become_user' rather than running sudo"]} 

Gibt es eine Möglichkeit Capistrano von ansible zu nennen oder es nicht getan werden kann?

EDIT: Die generische_produktion ist ein Bereitstellungsskript, das MACHINE als Ziel verwendet.

+0

Capistrano muss in der Regel auf Ihrem lokalen Computer ausgeführt werden und Ansible ist alles über das Ausführen von Befehlen auf dem Remotecomputer. Sind Sie sicher, dass das praktisch ist? Ich bin mir nicht sicher, was 'MACHINE' ist, es scheint nicht Standard zu sein. – tadman

+0

Ich denke nicht, dass das praktisch ist. Im Idealfall würde ich alles mit ansible umgestalten. Dafür fehlt mir aber rechtzeitig oder um zu lernen, wie man mit Capistrano aufbaut. Gibt es eine Möglichkeit für Capistrano, lokal zu laufen? – joaonrb

+0

Ich sage, dass Capistrano intrinsisch lokal ausgeführt wird, Remote-Befehle über SSH ausführen. Ansible ist ähnlich. Wenn Capistrano über Ansible ausgeführt wird, bedeutet das Ausführen von Remote-Befehlen vom Remote-Server zum Remote-Server? Sie sind zwei Werkzeuge, die versuchen, den gleichen Job zu machen. – tadman

Antwort

0

Das funktionierte für mich, wenn das ansible playbook aus dem Verzeichnis ausgeführt wird, das Sie normalerweise ausführen würden cap aus.