Ich versuche, einen Shell-Provisioner zu erhalten, um die erneute Bereitstellung einer VM-Instanz zu verhindern, wenn dies bereits zuvor erfolgt ist.Vermeiden Sie die erneute Bereitstellung einer Vagrant-VM, wenn diese bereits bereitgestellt wurde.
Betrachten Sie das folgende Vagrantfile:
Vagrant::Config.run do |config|
config.vm.define :minimal do |config|
# Base image
config.vm.box = "lucid32"
config.vm.box_url = "http://files.vagrantup.com/lucid32.box"
config.vm.provision :shell, :inline => "mkdir /tmp/foobar"
end
end
Wenn Sie vagrant up minimal
ausführen, wird es die Box und die Bereitstellung es zunächst erstellen. Wenn Sie dann vagrant provision minimal
ausführen, versucht es die Box erneut zu erstellen, schlägt jedoch fehl (da das Verzeichnis/tmp/foobar bereits existiert).
Gibt es eine Möglichkeit, Vagrant daran zu erinnern, ob es in der Vergangenheit eine Maschine bereitgestellt hat und um eine spätere erneute Bereitstellung zu vermeiden?
Weiterer Kontext: Wenn ich vagrant up minimal
laufen, meinen Host-Computer neu zu starten, und dann vagrant up minimal
erneut ausführen, wird es versuchen, die Box zu reprovision und scheitert. Dies passiert ziemlich oft, da VirtualBox häufig Kernel Panics auf meinem Host-Computer verursacht.
Making the provisioner Idempotent vernünftig zu sein scheint. Obwohl nicht unbedingt einfach. –
Ich zerlege mein Bereitstellungsskript in Abschnitte, die von if-Anweisungen umgeben sind. Ich berühre eine Datei am Ende jedes Abschnitts und die if-Anweisung überprüft, ob diese Datei existiert. Daher wird jeder Codeabschnitt nur einmal ausgeführt. Dies fügt sehr wenig Komplexität hinzu und ich habe Funktionen zum Prüfen und Schreiben der Datei, um Unordnung zu vermeiden. Bis jetzt funktioniert das ziemlich gut. Ich würde auch vorschlagen, dass "test -d/pfad/zu/dir || mkdir/pfad/zu/dir" ein besserer Weg sein könnte, dieses spezielle Problem zu lösen. Es gibt auch -f für Dateien und -L für Symlinks. "man bash" hat mehr. – bogeymin
Die einfache und dumme Möglichkeit, Idempotenz zu erstellen, besteht darin, am Ende der Bereitstellung (sofern alles erfolgreich war) "touch ~/.VM_PROVISIONED" zu markieren und am Anfang über '[-e ~ .VM_PROVISIONED]' zu prüfen. –