2014-01-31 5 views
16

Ich versuche meine Entwicklungsboxen mit Vagrant zu automatisieren. Ich muss das vagrant Setup mit anderen Entwicklern teilen, also müssen wir sicher sein, dass einige Randbedingungen erfüllt werden, bevor der normale vagrant up Prozess gestartet wird.Gibt es einen Haken wie "pre vagrant up"?

Gibt es irgendwelche Haken (wie in git, pre-commit oder andere pre * Skripte) in vagrant? Die Bereitstellungsskripte sind viel zu spät.

Meine aktuelle Setup sieht wie folgt aus:

Vagrantfile 
vagrant-templates/ 
vagrant-templates/apache.conf 
vagrant-templates/... 
sub-project1/ 
sub-project2/ 

Ich muss sicher sein, dass Teilprojekt {1..n} existiert und wenn nicht, sollte es eine Fehlermeldung sein.

Ich würde eine bash-ähnliche Lösung bevorzugen, aber ich bin offen für andere Lösungen.

+0

Ich schrieb ein Shell-Skript, das vagabundierende Projekte bootstrappt. Sie können es sich hier anschauen: https://github.com/marcovanest/strappy Vielleicht ist es eine Lösung für Ihr Problem und sonst könnten Sie den Code für eine anwser – cocheese

+0

@cochesee Scannen Sie Danke. Dein Skript ist außerhalb von Landstreichern. Das ist in Ordnung, aber ich suchte nach einem Inside-Skript. Wenn es nichts gibt, werde ich diese Lösung genauer betrachten. – nepda

Antwort

25

Sie einen Versuch zu diesem Vagrant Plugin geben könnte ich geschrieben habe:

https://github.com/emyl/vagrant-triggers

Einmal installiert, können Sie in Ihrem Vagrantfile etwas wie setzen könnte:

config.trigger.before :up, :execute => "..." 
+1

Diese Antwort sollte als die richtige akzeptiert werden. Ich habe lange nach einem solchen Plugin gesucht. Danke @Emyl! – warantesbr

+0

Danke, das ist genau das, was ich gesucht habe. – Justin

+0

kann bestätigen, sexy af – dave

10

Eine Option ist Lege die Logik direkt in Vagrantfile. Dann wird es auf allen vagrant Befehlen im Projekt ausgeführt. Zum Beispiel so etwas wie diese:

def ensure_sub_project(name) 
    if !File.exists?(File.expand_path("../#{name}", __FILE__)) 
    # you could raise or do other ruby magic, or shell out (for a bash script) 
    system('clone-the-project.sh', name) 
    end 
end 

ensure_sub_project('some-project') 
ensure_sub_project('other-project') 

Vagrant.configure('2') do |config| 
    # ... 
end 
3

Ein weiteres Plugin, um zu überprüfen ist vagrant-host-shell, die nur ausgeführt werden, wenn die Box Provisioning. Fügen Sie es einfach vor anderen provisoners in Vagrantfile:

config.vm.provision :host_shell do |shell| 
    shell.inline = './clone-projects.sh' 
    shell.abort_on_nonzero = true 
end 
5

Es ist möglich, Ihr eigenes Plugin für vagabundierende zu schreiben und verwenden action_hook auf dem machine_action_up, so etwas wie:

require 'vagrant-YOURPLUGINNAME/YOURACTIONCLASS' 

module VagrantPlugins 
    module YOURPLUGINNAME 
    class Plugin < Vagrant.plugin('2') 
     name 'YOURPLUGINNAME' 
     description <<-DESC 
      Some description of your plugin 
     DESC 

     config(:YOURPLUGINNAME) do 
     require_relative 'config' 
     Config 
     end 

     action_hook(:YOURPLUGINNAME, :machine_action_up) do |hook| 
     hook.prepend(YOURACTIONCLASS.METHOD) 
     end 
    end 
    end 
end 
2

.. Hinzufügen zu tmatilai Antwort, Sie so etwas wie dies hinzufügen:

case ARGV[0] 
when "provision", "up" 
    system "./prepare.sh" 
else 
    # do nothing 
end 

in Ihr Vagrantfile so, dass es nur auf bestimmte Befehle ausgeführt werden.

Verwandte Themen