Vagrantfile
を実行するには、特定のVagrantプラグインをインストールする必要があります。だから、基本的にあなたがする必要があるのは
$ vagrant plugin install foobar-plugin
$ vagrant up
最初の手順をスキップすると、vagrant up
は失敗します。
Vagrantにプラグインを自動的にインストールするオプションはありますか?言い換えると:マシンを作成して起動する前に自動的にインストールするプラグインをVagrantfile
内で指定することは可能ですか?
2019更新:Vagrantには、次の方法でVagrantfile
を介してプラグインを要求する機能があります。
Vagrant.configure("2") do |config|
config.vagrant.plugins = "vagrant-some-plugin"
# or as array:
config.vagrant.plugins = ["vagrant-some-plugin", "vagrant-some-other-plugin"]
# or as hash
config.vagrant.plugins = {"vagrant-some-plugin" => {"version" => "1.0.0"}}
end
https://www.vagrantup.com/docs/vagrantfile/vagrant_settings.html を参照してください
2018年8月31日更新:Vagrantの新しいバージョン(1.8以降)については、以下の@Starxの修正を参照してください
以下は、Louis St. Amourのソリューションと新しいプラグインがインストールされた場合の再実行に関するRob Kinyonのコメントに基づいたバージョンです。
required_plugins = %w(vagrant-share vagrant-vbguest...)
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
私はRuby devであり、Bindlerはもはやメンテナンスされていないので、Vagrantfileの先頭にコードを書いて、必要なプラグインが見つからない場合にインストールするのが最も自然であることがわかりました。 Vagrant.configure
行)
次は私のために働く:
required_plugins = %w( vagrant-hostmanager vagrant-someotherplugin )
required_plugins.each do |plugin|
system "vagrant plugin install #{plugin}" unless Vagrant.has_plugin? plugin
end
system
は、バックティックの使用とは異なり、コマンドを自分で実行するのと同じように、コマンドをstdoutにエコーします。そして、この方法で、Vagrantが更新できる必要なプラグインを追跡するために、別の奇妙な名前のプラグインやシステムは必要ありません。
他の質問への回答で指摘した のように、 bindler を使用して、単一のコマンドを使用してプロジェクト固有のプラグインのセットをインストールできます。
Bindlerがインストールされていて、必要なプラグインがインストールされていない場合、bindlerはエラーを出力し、プロセスを中止します。 未解決の問題 プラグインの自動インストールに関連するvagrant up
sしかし、今のところ誰もまだサインアップしていません。
ビンドラーを使用したくない場合は、Vagrant.has_plugin?
(1.3.0以降で使用可能)Vagrantfile
の上部にあり、必要なプラグインがインストールされていない場合はエラーになります。
何かのようなもの:
unless Vagrant.has_plugin?("vagrant-some-plugin")
raise 'some-plugin is not installed!'
end
Vagrant.configure("2") do |config|
config.vm.box = "box-name"
end
[〜#〜] update [〜#〜]:5月11日現在、VagrantコアではBindlerはサポートされておらず、同等の機能は提供されていません。 2015
Vagrant 1.5では、Gemfile
で依存関係を指定できることに注意してください。 更新に関するブログ投稿 :
Vagrant 1.5は、Gemfileの「plugins」グループにあるすべてのgemを自動的にロードします。例として、「vagrant-bar」プラグインのGemfileは次のとおりです。
source "https://rubygems.org" group :development do gem "vagrant", git: "https://github.com/mitchellh/vagrant.git" end group :plugins do gem "vagrant-foo", gem "vagrant-bar", path: "." end
Louis St-Amourの回答にコメントを追加することはできませんでしたが、彼のソリューションを拡張するのに助けが必要な場合に備えて、これを投稿したかったのです。
# Check for missing plugins
required_plugins = %w(vagrant-list)
plugin_installed = false
required_plugins.each do |plugin|
unless Vagrant.has_plugin?(plugin)
system "vagrant plugin install #{plugin}"
plugin_installed = true
end
end
# If new plugins installed, restart Vagrant process
if plugin_installed === true
exec "vagrant #{ARGV.join' '}"
end
Vagrantの新しいバージョンでは、@ Amos Shapiraによる回答が無限ループに陥ります。その理由は、vagrant plugin install
への各呼び出しもVagrantfile
を処理し、処理時にプラグインのインストールに関連するコードを何度も実行するなどです。
これがループを回避する私の解決策です。
# 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
私はちょうどここに気づいた http://docs.vagrantup.com/v2/plugins/packaging.html 指示
Vagrant.require_plugin "vagrant-aws"
これは、fgrehmの説明とまったく同じことを行います。プラグインがインストールされていない場合は、すぐにエラーが発生します。
私の知る限り、プラグインを自動インストールする方法はまだありません
私の答えは Louis St-Amour's answer に非常に近いですが、プラグインを自動的にインストールする代わりに、エラーメッセージが表示されるだけなので、ユーザーはプラグインを手動でインストールする必要があります。
現在のVagrantfileだけでなく、すべてのVagrantインスタンスにグローバルに適用されるため、ユーザーはインストールされるプラグインを認識します。
Vagrantfile
の先頭に、プラグインごとにこのような1行を追加します。この例では、vagrant-vbguest
:
raise "vagrant-vbguest plugin must be installed" unless Vagrant.has_plugin? "vagrant-vbguest"
このプロジェクトを使用できます(私は著者です): https://github.com/DevNIX/Vagrant-dependency-manager
同様の答えに基づいていますが、より完全で安定したものにしようとしています。このアイデアの大きな利点は、Vagrantfileを配布でき、その環境にインストールされているプラグインに関係なく、すべてのコンピューターで実行できることです。
使い方は簡単です:
それを含めて、check_plugins
を呼び出して、依存関係を配列として渡します
例:
# -*- mode: Ruby -*-
# vi: set ft=Ruby :
require File.dirname(__FILE__)+"./dependency_manager"
check_plugins ["vagrant-exec", "vagrant-hostsupdater", "vagrant-cachier", "vagrant-triggers"]
Vagrant.configure(2) do |config|
config.vm.box = "base"
end
???
利益!
プルリクエストをマージし、発生する可能性のある問題を修正し、新しい機能のアイデアを得たいと思います。現在、依存関係マネージャー自体を更新し、特定のプラグインバージョンを要求することを考えています:D
よろしく!
.vagrant.dディレクトリがまだ作成されていないVagrantの新規インストールで問題が発生しました。例外をキャッチすることで、Luis St. Amourのスニペットを機能させることができました。
required_plugins = %w(vagrant-share vagrant-vbguest)
begin
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
rescue
exec "vagrant #{ARGV.join(' ')}"
end
Vagrant 1.8で使用しているものは次のとおりです。これをVagrantfileのconfigureブロックの前のどこかに置きます。
# install required plugins if necessary
if ARGV[0] == 'up'
# add required plugins here
required_plugins = %w( plugin1 plugin2 plugin3 )
missing_plugins = []
required_plugins.each do |plugin|
missing_plugins.Push(plugin) unless Vagrant.has_plugin? plugin
end
if ! missing_plugins.empty?
install_these = missing_plugins.join(' ')
puts "Found missing plugins: #{install_these}. Installing using Sudo..."
exec "Sudo vagrant plugin install #{install_these}; vagrant up"
end
end