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


80

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

$ vagrant plugin install foobar-plugin
$ vagrant up

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

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

回答:


24

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

Vagrantは、まだインストールされていないプラグインがあることを検出すると、ユーザーにプラグインを自分でインストールするように求めます。

$ vagrant up
Vagrant has detected project local plugins configured for this
project which are not installed.

  vagrant-some-plugin
Install local plugins (Y/N) [N]: y
Installing the 'vagrant-some-plugin' plugin. This can take a few minutes...
Fetching vagrant-some-plugin-1.0.0.gem
Installed the plugin 'vagrant-some-plugin (1.0.0)'!


Vagrant has completed installing local plugins for the current Vagrant
project directory. Please run the requested command again.

https://www.vagrantup.com/docs/vagrantfile/vagrant_settings.htmlを参照してください


プロンプトをスキップして、必要なすべてのプラグインを自動インストールしたい場合はどうすればよいですか?
pihentagy

67

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

5
現時点で間違いなく最良の解決策
アニス2015年

1
4月20日にソリューションを更新して、不足しているすべてのプラグインをインストールするために1つの「システム」呼び出しのみを使用するようにしました。
Amos Shapira 2015

4
これは機能しませんでした。プラグインをインストールするという無限ループに入りました。どういうわけか、新しいvagrantプロセスは、親vagrantプロセスで新しくインストールされたプラグインを取得できません
Arif Akram Khan

1
更新していただきありがとうございます。私は実際にここでmkuzminによって提案された解決策に従うことになりました:github.com/mitchellh/vagrant/issues/4347。これには、vagrant pluginsという名前のプラグインを使用してから、Vagrantfileでいくつかのコード(非常によく似たもの)を使用することが含まれます。
Arif Akram Khan

1
@SteveHenty私はあなたのコメントに共感しますが、これをプラグインに移動すると、コードの目的(git clone...; cd ...; vagrant up初めて使用できるようになる)が無効になります。
Amos Shapira 2016

51

私はRuby開発者であり、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で更新できる必要なプラグインを追跡するために、奇妙な名前のプラグインやシステムをもう1つ必要としません。


8
プラグインがインストールされた状態でvagrantプロセスを再開するには、 'exec "vagrant#{ARGV.join' '}"'を実行する必要があります。
ロブキニョン2014年

1
いい視点ね。私の場合、エラーが発生しましたが、インストールプラグインの出力を確認し、コマンドを再実行することを知っています。自動的に再実行すると、さらに優れた機能強化になります。書き直す場合は、プラグインがインストールされていないかどうかを確認します。インストールされている場合は、プラグインを1つずつ確認してインストールするのではなく、最初にプラグインをインストールしてからスクリプトを再実行します...
Louis St -アムール2014年

2
Vagrant.has_plugin?シェルレベルでコマンドを実行するvagrant plugin installか、プラグインがすでに存在するかどうかを確認するだけでよいでしょう。
sakovias 2015

1
さて、あなたはいつでも次のようなことをすることができますがif [ $(vagrant plugin list | egrep 'vagrant-hostsupdater|vagrant-share' -c) == 2 ] ; then echo "All plugins installed." ; else echo "Missing plugin"; fi、それを助けることができれば誰もbashスクリプトを書かない理由があります;-)多分vagrantプラグインコマンドをさらに試してみてください?
Louis St-Amour

48

私があなたの他の質問に対する私の答えで指摘したように、あなたはbindlerを使うことができます単一のコマンドを使用してプロジェクトにプラグインの特定のセットをインストールします。

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

bindlerを使用したくない場合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

更新:2015年5月11日の時点で、Bindlerはサポートされなくなり、同等の機能はVagrantコアによって提供されていません。


14
将来のGoogle社員のために、この回答は少し時代遅れであることに注意してください。これGemfileで、:pluginsVagrantがチェックするグループの下に依存関係を指定できます。詳細については、以下の私の回答を参照してください。
ジョナサンベンダー2014

2
GemfileVagrantプラグインの開発を目的としています。github.com/mitchellh/vagrant/issues/8370
mixel

10

Vagrant 1.5以降、で依存関係を指定できることに注意してくださいGemfile。毎更新のブログ記事

これで、Vagrant 1.5は、Gemfileの「プラグイン」グループにあるすべての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

8
そのブログ投稿はVagrantプラグインの開発に言及していませんか?Vagrantボックスには通常Gemfileがなく、Vagrantfileを使用します。
ドンマッカー

1
Vagrantボックス自体にGemfileがないことは正しいですが(プラグインを必要としないVagrantfileがある可能性があります)、プラグインを使用している場合(ブログのコンテキストは独自のプラグインの依存関係でしたが、同じことが当てはまります) Vagrantfilesの場合はtrue)、これらの要件を指定するにはGemfileを使用する必要があります。
ジョナサンベンダー2015年

7
ありがとう、それは役に立ちます。多くのVagrantユーザーはルビー開発者ではなくGemfile、まだ持っていないので、それをどのように設定したかを説明していただけませんか?あなたの例に似たものを作成しましたvagrant upが、自動的には何も読み込まれません。試しましたbundle installが、システムRubygemsのアクセス許可についてのプロンプトが表示されます。これは正しく聞こえません。
ドンマッカーディ2015年

1
私はあなたがストックルビーインストールを使用してOSXで作業していて、この問題に遭遇していると推測しています:stackoverflow.com/questions/14607193
ジョナサンベンダー2015年

1
シェフの料理本の世界では、gemfileを持っている人はほとんどいません
mr.buttons

6

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-list上記はプラグインの例であり、コードの必要な部分ではないことに注意してください。他のVagrantプラグインはここで見ることができます:vagrant-lists.github.io
Nathan Basanese 2018年

3

新しいバージョンのVagrantでは、@ AmosShapiraによる回答が無限ループに陥ります。その理由は、vagrant plugin installVagrantfileとプラグインのインストールに関連するコードが何度も実行されるためです。

これがループを回避する私の解決策です。

# 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

1

ここhttp://docs.vagrantup.com/v2/plugins/packaging.htmlの説明に気づきました

Vagrant.require_plugin "vagrant-aws"

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

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


6
Vagrant.require_pluginは1.5以降で非推奨になりました
eis

1
非推奨に関する公式ブログ投稿は次のとおりです。vagrantup.com / blog / vagrant-1-5-plugin-improvements.html 私の限られた理解から、不要になったため非推奨になりました。Vagrantはプラグインの依存関係を自動的にチェックするようになりました。しかし、私がブログの投稿を理解しているとは完全には確信していません...
Jeff Widman 2014

投稿では、プラグインの依存関係を自動的にチェックする方法について説明していますが、Vagrantボックス自体の依存関係については何も見ていません。
ドンマッカー

Vagrant.require_pluginは非推奨です。Vagrantで確認しました1.7.4
czerasz 2015

1

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

プラグインは現在のVagrantfileだけでなく、すべてのVagrantインスタンスにグローバルに適用されるため、ユーザーはインストールされるプラグインを知っておく必要があります。

Vagrantfileこの例では、プラグインごとにこのように1行の先頭に配置しますvagrant-vbguest

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

1

あなたはこのプロジェクトを使うことができます(私は著者です): 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

よろしく!


0

.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

Windowsでは、によって実行されているため、「マシンのデフォルトを「virtualbox」プロバイダーで起動しています...しかし、別のプロセスがすでにマシンでアクションを実行しています」というエラーが表示upされupます。vagrant up2回実行せずにこれを回避する方法はありますか?
トムB

0

これが私がVagrant1.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

クロスプラットフォームではないようです。
thorr18 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.