web-dev-qa-db-ja.com

Vagrantfile内でVagrantプラグインを要求しますか?

Vagrantfileを実行するには、特定のVagrantプラグインをインストールする必要があります。だから、基本的にあなたがする必要があるのは

$ vagrant plugin install foobar-plugin
$ vagrant up

最初の手順をスキップすると、vagrant upは失敗します。

Vagrantにプラグインを自動的にインストールするオプションはありますか?言い換えると:マシンを作成して起動する前に自動的にインストールするプラグインをVagrantfile内で指定することは可能ですか?

69
Golo Roden

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 を参照してください

1
Moritz Gunz

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
67
Amos Shapira

私は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が更新できる必要なプラグインを追跡するために、別の奇妙な名前のプラグインやシステムは必要ありません。

50
Louis St-Amour

他の質問への回答で指摘した のように、 bindler を使用して、単一のコマンドを使用してプロジェクト固有のプラグインのセットをインストールできます。

Bindlerがインストールされていて、必要なプラグインがインストールされていない場合、bindlerはエラーを出力し、プロセスを中止します。 未解決の問題 プラグインの自動インストールに関連するvagrant upsしかし、今のところ誰もまだサインアップしていません。

ビンドラーを使用したくない場合は、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

48
fgrehm

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
10
Jonathan Bender

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
6
James Reimer

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
3
Starx

私はちょうどここに気づいた http://docs.vagrantup.com/v2/plugins/packaging.html 指示

Vagrant.require_plugin "vagrant-aws"

これは、fgrehmの説明とまったく同じことを行います。プラグインがインストールされていない場合は、すぐにエラーが発生します。

私の知る限り、プラグインを自動インストールする方法はまだありません

1
Julien

私の答えは Louis St-Amour's answer に非常に近いですが、プラグインを自動的にインストールする代わりに、エラーメッセージが表示されるだけなので、ユーザーはプラグインを手動でインストールする必要があります。

現在のVagrantfileだけでなく、すべてのVagrantインスタンスにグローバルに適用されるため、ユーザーはインストールされるプラグインを認識します。

Vagrantfileの先頭に、プラグインごとにこのような1行を追加します。この例では、vagrant-vbguest

 raise "vagrant-vbguest plugin must be installed" unless Vagrant.has_plugin? "vagrant-vbguest"
1
Flimm

このプロジェクトを使用できます(私は著者です): https://github.com/DevNIX/Vagrant-dependency-manager

同様の答えに基づいていますが、より完全で安定したものにしようとしています。このアイデアの大きな利点は、Vagrantfileを配布でき、その環境にインストールされているプラ​​グインに関係なく、すべてのコンピューターで実行できることです。

使い方は簡単です:

  1. Vagrantfileの横にdependency_manager.rbをコピーします
  2. それを含めて、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
    
  3. ???

  4. 利益!

プルリクエストをマージし、発生する可能性のある問題を修正し、新しい機能のアイデアを得たいと思います。現在、依存関係マネージャー自体を更新し、特定のプラグインバージョンを要求することを考えています:D

よろしく!

1
Dev_NIX

.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
0
Guillaume Hardy

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
0
lps