Angenommen, für die Ausführung von a Vagrantfile
muss ein bestimmtes Vagrant-Plugin installiert sein. Im Grunde müssen Sie also Folgendes tun
$ vagrant plugin install foobar-plugin
$ vagrant up
Wenn Sie den ersten Schritt überspringen, vagrant up
schlägt dies fehl.
Gibt es in Vagrant eine Option, um das Plugin automatisch zu installieren? Mit anderen Worten: Ist es möglich, innerhalb eines Vagrantfile
Plugins anzugeben, welche Plugins automatisch installiert werden sollen, bevor der Computer erstellt und gestartet wird?
UPDATE 31. August 2018: Siehe @ Starx's Fix unten für spätere Versionen von Vagrant (1.8 und höher)
Hier ist eine Version, die auf der Lösung von Louis St. Amour basiert, zusammen mit Rob Kinyons Kommentar zur erneuten Ausführung, wenn ein neues Plugin installiert wurde. Ich verwende es erfolgreich in meinem eigenen Setup:
quelle
git clone...; cd ...; vagrant up
erste Mal in der Lage zu sein) zunichte gemacht .Da ich ein Ruby-Entwickler bin und Bindler nicht mehr gewartet wird, fand ich es am natürlichsten, einfach einen Code oben in meine Vagrant-Datei zu schreiben, um die erforderlichen Plugins zu installieren, falls sie fehlen (z. B. vor der
Vagrant.configure
Zeile).Folgendes funktioniert für mich:
required_plugins = %w( vagrant-hostmanager vagrant-someotherplugin ) required_plugins.each do |plugin| system "vagrant plugin install #{plugin}" unless Vagrant.has_plugin? plugin end
system
Im Gegensatz zur Verwendung von Backticks wird der Befehl an stdout zurückgegeben, genau wie Sie den Befehl selbst ausführen würden. Und auf diese Weise brauche ich kein weiteres seltsam benanntes Plugin oder System, um die erforderlichen Plugins zu verfolgen, die ohnehin von Vagrant aktualisiert werden können.quelle
Vagrant.has_plugin?
Befehl auf Shell-Ebene zu haben oder einfach zuvagrant plugin install
überprüfen, ob das Plugin bereits vorhanden ist.if [ $(vagrant plugin list | egrep 'vagrant-hostsupdater|vagrant-share' -c) == 2 ] ; then echo "All plugins installed." ; else echo "Missing plugin"; fi
aber es gibt einen Grund, warum niemand Bash-Skripte schreibt, wenn sie helfen können ;-) Vielleicht weiter mit dem Vagrant-Plugin-Befehl experimentieren?Wie ich in meiner Antwort auf Ihre andere Frage dargelegt habe , können Sie Bindler verwenden, um eine Reihe von projektspezifischen Plugins mit einem einzigen Befehl zu installieren.
Wenn Bindler installiert ist und das erforderliche Plugin nicht installiert ist, tritt ein Bindler auf und der Vorgang wird abgebrochen. Es gibt auch ein offenes Problem im Zusammenhang mit der automatischen Installation von Plugins auf
vagrant up
s, aber bisher hat sich noch niemand dafür angemeldet.Wenn Sie Bindler nicht verwenden möchten, können Sie
Vagrant.has_plugin?
(verfügbar ab 1.3.0) oben auf Ihrem Computer verwendenVagrantfile
und Fehler ausgeben , wenn das erforderliche Plugin nicht installiert ist.Etwas wie:
UPDATE : Bindler wird nicht mehr unterstützt und Vagrant Core bietet seit dem 11. Mai 2015 keine gleichwertige Funktionalität mehr
quelle
Gemfile
unter einer:plugins
Gruppe angeben , nach der Vagrant sucht. Siehe meine Antwort unten für weitere Details.Gemfile
ist für die Entwicklung von Vagrant-Plugins vorgesehen. Siehe github.com/mitchellh/vagrant/issues/8370Bitte beachten Sie, dass Sie ab Vagrant 1.5 Ihre Abhängigkeiten in Ihrem angeben können
Gemfile
. Per Blogbeitrag zum Update :quelle
Gemfile
, würde es Ihnen etwas ausmachen , zu erklären, wie Sie das eingerichtet haben? Ich habe eine erstellt, die Ihrem Beispiel ähnelt, abervagrant up
nichts automatisch lädt. Versucht,bundle install
aber das gibt eine Eingabeaufforderung über System-Rubygems-Berechtigungen, die nicht richtig klingt.Ich konnte Louis St-Amours Antwort keinen Kommentar hinzufügen, aber ich wollte dies posten, nur für den Fall, dass jemand Hilfe bei der Erweiterung seiner Lösung benötigt.
quelle
vagrant-list
oben ein Beispiel für ein Plugin ist, nicht ein notwendiger Teil des Codes. Sie können andere Vagrant Plugins hier sehen: vagrant-lists.github.ioBei der neuen Version von Vagrant bleibt die Antwort von @Amos Shapira in einer Endlosschleife stecken. Der Grund dafür ist, dass jeder Aufruf
vagrant plugin install
auch verarbeitetVagrantfile
und bei der Verarbeitung den Code für die Installation des Plugins immer wieder und so weiter ausführt.Hier ist meine Lösung, die die Schleife vermeidet.
# Plugins # # Check if the first argument to the vagrant # command is plugin or not to avoid the loop if ARGV[0] != 'plugin' # Define the plugins in an array format required_plugins = [ 'vagrant-vbguest', 'vagrant-hostmanager', 'vagrant-disksize' ] plugins_to_install = required_plugins.select { |plugin| not Vagrant.has_plugin? plugin } if not plugins_to_install.empty? puts "Installing plugins: #{plugins_to_install.join(' ')}" if system "vagrant plugin install #{plugins_to_install.join(' ')}" exec "vagrant #{ARGV.join(' ')}" else abort "Installation of one or more plugins has failed. Aborting." end end end
quelle
Ich habe gerade hier http://docs.vagrantup.com/v2/plugins/packaging.html eine Anweisung bemerkt
Das macht genau das Gleiche wie das, was fgrehm beschrieben hat: schnell einen Fehler auslösen, wenn das Plugin nicht installiert ist.
Soweit ich weiß, gibt es immer noch keine Möglichkeit, Plugins automatisch zu installieren
quelle
Vagrant.require_plugin
ist veraltet. Mit Vagrant überprüft1.7.4
.Meine Antwort kommt der Antwort von Louis St-Amour sehr nahe , aber anstatt Plugins automatisch zu installieren, wird nur eine Fehlermeldung ausgegeben, sodass der Benutzer das Plugin manuell installieren muss.
Ich möchte lieber, dass Benutzer alle Plugins kennen, die installiert werden, da sie global für alle Vagrant-Instanzen gelten, nicht nur für die aktuelle Vagrant-Datei.
Setzen Sie
Vagrantfile
für jedes Plugin in diesem Beispiel den oberen Rand einer Zeile wie folgt einvagrant-vbguest
:quelle
Sie können dieses Projekt verwenden (ich bin der Autor): https://github.com/DevNIX/Vagrant-dependency-manager
Es basiert auf ähnlichen Antworten, versucht jedoch, vollständiger und stabiler zu sein. Der große Vorteil dieser Idee ist, dass Sie Ihr Vagrantfile verteilen können und es auf jedem Computer ausgeführt wird, unabhängig von den in dieser Umgebung installierten Plugins.
Es ist einfach zu bedienen:
Schließen Sie es ein und rufen Sie die
check_plugins
Übergabe Ihrer Abhängigkeiten als Array aufBeispiel:
???
Profitieren!
Ich würde gerne Pull-Anfragen zusammenführen, mögliche Probleme beheben und Ideen für neue Funktionen erhalten. Derzeit denke ich darüber nach, den Abhängigkeitsmanager selbst zu aktualisieren und bestimmte Plugin-Versionen zu benötigen: D.
Grüße!
quelle
Ich habe ein Problem mit der Neuinstallation von Vagrant, bei der das Verzeichnis .vagrant.d noch nicht erstellt wurde. Ich konnte das Snippet von Luis St. Amour zum Laufen bringen, indem ich die Ausnahme abfing.
quelle
up
er ausgeführt wirdup
. Gibt es eine Möglichkeit, dies zu vermeiden, ohnevagrant up
zweimal zu laufen ?Hier ist, was ich auf Vagrant 1.8 verwende und es funktioniert gut. Platzieren Sie dies irgendwo vor dem Konfigurationsblock in Ihrer Vagrant-Datei.
quelle