Vagrantfile के भीतर एक वैग्रेन्ट प्लगइन की मांग करें?


80

एक के कथित निष्पादन Vagrantfileएक विशिष्ट Vagrant प्लगइन स्थापित करने की आवश्यकता है। तो, मूल रूप से आपको क्या करने की आवश्यकता है

$ vagrant plugin install foobar-plugin
$ vagrant up

यदि आप पहला चरण छोड़ते हैं, तो vagrant upविफल रहता है।

क्या वैग्रेन्ट में एक विकल्प है कि वह प्लगइन को स्वचालित रूप से स्थापित कर सके? दूसरे शब्दों में: क्या Vagrantfileमशीन बनाने और बूट करने से पहले स्वचालित रूप से इंस्टॉल करने के लिए कौन से प्लग इन के भीतर निर्दिष्ट करना संभव है ?

जवाबों:


24

2019 अपडेट: वैग्रंट में अब प्लगइन्स के माध्यम से कार्यक्षमता की आवश्यकता है 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 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

UPDATE 31 अगस्त, 2018: वैग्रांट के बाद के संस्करणों के लिए नीचे दिए गए @ Starx का निर्धारण देखें (1.8 और ऊपर)

यहाँ पर लुईस सेंट अमौर के समाधान पर आधारित संस्करण है जिसमें रोब कियोन की टिप्पणी के साथ फिर से क्रियान्वयन के बारे में बताया गया है कि यदि कोई नया प्लगइन लगाया गया है, तो मैं इसे अपने सेटअप में सफलतापूर्वक उपयोग करता हूं:

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
निश्चित रूप से इस समय सबसे अच्छा समाधान
अनीस

1
मैंने सभी लापता प्लगइन्स को स्थापित करने के लिए केवल एक "सिस्टम" कॉल का उपयोग करने के लिए 20 अप्रैल को समाधान अपडेट किया है।
आमोस शापिरा

4
यह काम नहीं किया। यह प्लगइन्स को स्थापित करने के एक अनंत लूप में चला गया। किसी भी तरह से नई योनि प्रक्रिया माता-पिता की योनि प्रक्रिया में नए इंस्टॉल किए गए प्लगइन्स को नहीं उठा सकती है
आरिफ अकरम खान

1
अद्यतन के लिए धन्यवाद। मैं वास्तव में यहाँ mkuzmin द्वारा सुझाए गए समाधान का पालन कर रहा हूं: github.com/mitchellh/vagrant/issues/4347 । इसमें आवारा प्लग नाम का एक प्लगइन का उपयोग करना शामिल है और फिर वैग्रांटफाइल में कुछ कोड (बहुत समान) का उपयोग करें।
आरिफ अकरम खान

1
@SteveHenty मैं आपकी टिप्पणी के साथ सहानुभूति रखता हूं, लेकिन इसे एक प्लगइन में स्थानांतरित करना कोड के उद्देश्य (केवल git clone...; cd ...; vagrant upपहली बार चारों ओर सक्षम होना ) को हराने के लिए होगा ।
आमोस शापिरा

51

चूँकि मैं एक रूबी देवता हूँ, और बिंद्लर अब नहीं रहे हैं, मुझे यह सबसे स्वाभाविक लगा कि गायब होने पर आवश्यक प्लग इन स्थापित करने के लिए अपने वैग्रांटफाइल के शीर्ष पर कुछ कोड लिखना स्वाभाविक है (जैसे 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, backticks का उपयोग करने के विपरीत, कमांड को प्रतिध्वनित करने के लिए प्रतिध्वनित करेगा, जैसा कि कमांड स्वयं चल रहा है। और इस तरह मुझे आवश्यक प्लगइन्स पर नज़र रखने के लिए अभी तक एक और अजीब तरह से नामित प्लगइन या सिस्टम की आवश्यकता नहीं है जिसे वैसे भी वैग्रांत द्वारा अपडेट किया जा सकता है।


8
स्थापित किए गए प्लगइन के साथ योनि प्रक्रिया को पुनः आरंभ करने के लिए आपको "योनि # {ARGV.join ''" "निष्पादित करना होगा।"
रॉब कियोन

1
अच्छी बात। मेरे मामले में मुझे एक त्रुटि हुई, लेकिन प्लग इन के आउटपुट को देखें और कमांड को फिर से चलाना जानते हैं। इसे फिर से स्वचालित रूप से चलाना एक बेहतर वृद्धि होगी। यदि इसे फिर से लिखना, तो शायद मैं यह देखने के लिए जाँच करूंगा कि क्या कोई प्लगइन स्थापित नहीं किया गया था, और यदि ऐसा है, तो पहले प्लगइन्स को स्थापित करें और फिर स्क्रिप्ट को चेक करने के बजाय फिर से चलाएं और प्रत्येक प्लगइन को एक बार में स्थापित करें ...
लुई सेंट -अमूर्स 21'14

2
यह Vagrant.has_plugin?शेल लेवल पर कमांड रखने के लिए कमाल का होगा या सिर्फ यह vagrant plugin installजांचना होगा कि प्लगइन पहले से मौजूद है या नहीं।
सकोवियास

1
वैसे आप हमेशा कुछ कर सकते हैं if [ $(vagrant plugin list | egrep 'vagrant-hostsupdater|vagrant-share' -c) == 2 ] ; then echo "All plugins installed." ; else echo "Missing plugin"; fiलेकिन एक कारण है कि कोई भी bash स्क्रिप्ट नहीं लिखता है अगर वे इसकी मदद कर सकते हैं ;-) हो सकता है कि आगे वैग्युलर प्लगइन कमांड के साथ प्रयोग करें?
लुई सेंट-अमौर

48

जैसा कि मैं आपके अन्य प्रश्न के उत्तर पर बताया है , आप एकल कमांड का उपयोग करके प्रोजेक्ट के लिए विशेष प्लगइन्स के सेट को स्थापित करने के लिए बाइंडलर का उपयोग कर सकते हैं ।

यदि बाइंडलर स्थापित किया गया है और आवश्यक प्लगइन नहीं है, तो बाइंडलर त्रुटि करेगा और प्रक्रिया को समाप्त कर देगा। स्वचालित रूप से प्लगइन्स को एस पर स्थापित करने से संबंधित एक खुला मुद्दा भी है vagrant upलेकिन अभी तक इसके लिए किसी ने भी साइन अप नहीं किया है।

यदि आप बाइंडलर का उपयोग नहीं करना चाहते हैं, तो आप इसका उपयोग कर सकते हैं 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

अद्यतन : बिंदलर को अब समर्थित नहीं किया गया है और 11 मई, 2015 तक वैग्रांट कोर द्वारा कोई समतुल्य कवक प्रदान नहीं किया गया है।


14
भविष्य के Googlers के लिए, कृपया ध्यान दें कि यह उत्तर थोड़ा पुराना है। अब आप अपने समूह के Gemfileतहत अपने निर्भरता को निर्दिष्ट कर सकते हैं :pluginsकि वैग्रंट किसके लिए जाँच करेगा। अधिक विवरण के लिए नीचे मेरा उत्तर देखें।
जोनाथन बेंडर

2
GemfileVagrant प्लगइन विकास के लिए अभिप्रेत है। देखिए github.com/mitchellh/vagrant/issues/8370
मिसेल

10

कृपया ध्यान दें कि Vagrant 1.5 के रूप में, आप अपनी निर्भरता को अपने में निर्दिष्ट कर सकते हैं Gemfileअपडेट पर ब्लॉग पोस्ट के अनुसार :

अब, वैग्रांट 1.5 स्वचालित रूप से आपके जेमफाइल में "प्लगइन्स" समूह में किसी भी रत्न को लोड करेगा। एक उदाहरण के रूप में, यहां "आवारा-बार" प्लगइन के लिए जेमफाइल है:

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 बक्से है आम तौर पर Gemfiles नहीं, वे Vagrantfiles का उपयोग करें।
डॉन मैकक्रेडी

1
आप सही कह रहे हैं कि वैग्रैंट बॉक्स में सेफ़ के लिए जेमफाइल्स नहीं होते हैं (आप वैग्रैंटफ़ाइल हो सकते हैं जिन्हें किसी प्लगइन्स की आवश्यकता नहीं थी), लेकिन यदि आप प्लगइन्स का उपयोग कर रहे हैं (ब्लॉग का संदर्भ आपके ही प्लगइन के लिए निर्भरता के रूप में था, लेकिन वही रखता है Vagrantfiles के लिए सच है), आपको उन आवश्यकताओं को निर्दिष्ट करने के लिए एक Gemfile का उपयोग करना चाहिए।
जोनाथन शराबी

7
धन्यवाद, यह उपयोगी है। चूंकि बहुत से वैगरेंट उपयोगकर्ता माणिक देव नहीं हैं और पहले से ही एक नहीं होंगे Gemfile, तो क्या आप यह बताएंगे कि आप कैसे सेट करते हैं? मैंने आपके उदाहरण के समान एक बनाया है, लेकिन vagrant upस्वचालित रूप से कुछ भी लोड नहीं कर रहा है। कोशिश की, bundle installलेकिन यह सिस्टम रूबीजिम अनुमतियों के बारे में संकेत दे रहा है, जो सही नहीं लगता है।
डॉन मैककरी

1
मैं अनुमान लगा रहा हूं कि आप स्टॉक माणिक इंस्टॉल का उपयोग करके OSX में काम कर रहे हैं, और इस समस्या में चल रहे हैं: stackoverflow.com/questions/14607193 ?
जोनाथन बेंडर

1
रसोइया रसोई की किताबों की दुनिया में, बहुत कम लोगों के पास एक रत्न होगा
mr.buttons

6

लुइस सेंट-अमौर के जवाब में एक टिप्पणी नहीं जोड़ सका, लेकिन मैं यह चाहता था कि किसी को भी उसके समाधान का विस्तार करने में मदद की जरूरत हो।

# 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उपरोक्त में एक प्लगइन का एक उदाहरण है, कोड का एक आवश्यक हिस्सा नहीं है। आप यहां अन्य वैग्रंट
नाथन बसानी

3

वैग्रांत के नए संस्करण पर, @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

1

मैंने यहाँ केवल http://docs.vagrantup.com/v2/plugins/packaging.html एक निर्देश देखा

Vagrant.require_plugin "vagrant-aws"

जो वास्तव में वही चीज करता है जो descibed fgrehm: प्लगइन स्थापित नहीं होने पर जल्दी से एक त्रुटि उठाती है।

जहाँ तक मुझे पता है, वहाँ कोई रास्ता नहीं कर रहे हैं स्वतः स्थापित प्लगइन्स


6
Vagrant.require_plugin को 1.5+ पर निकाला गया है
eis

1
यहाँ पदावनति के बारे में आधिकारिक ब्लॉग पोस्ट है: vagrantup.com/blog/vagrant-1-5-plugin-improvements.html मेरी सीमित समझ से, इसे इसलिए हटा दिया गया क्योंकि यह अब आवश्यक नहीं है, वैग्रैंट स्वचालित रूप से प्लगइन निर्भरता की जाँच करेगा। इस बात पर पूरी तरह से विश्वास नहीं है कि मैं ब्लॉग पोस्ट को समझता हूँ ...
जेफ विडमैन

पोस्ट स्वचालित रूप से प्लग इन निर्भरता की जाँच करता है, लेकिन मैंने वैग्रेंट बॉक्स की निर्भरता के बारे में कुछ भी नहीं देखा है।
डॉन मैक्रूडी

Vagrant.require_pluginपदावनत किया गया है। वैग्रांत के साथ जांच की गई 1.7.4
czerasz

1

मेरा उत्तर लुई सेंट-अमोर के उत्तर के बहुत करीब है , लेकिन स्वचालित रूप से प्लगइन्स स्थापित करने के बजाय, यह सिर्फ एक त्रुटि संदेश उठाता है, जिससे उपयोगकर्ता को मैन्युअल रूप से प्लगइन स्थापित करना होगा।

मैं बल्कि उपयोगकर्ताओं को किसी भी प्लगइन्स के बारे में पता होना चाहिए जो स्थापित हो जाते हैं, क्योंकि वे विश्व स्तर पर सभी Vagrant उदाहरणों पर लागू होते हैं, न कि केवल वर्तमान Vagrantfile पर।

Vagrantfileप्रत्येक प्लगइन के लिए इस तरह एक पंक्ति के शीर्ष पर रखें , इस उदाहरण में vagrant-vbguest:

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

1

आप इस परियोजना का उपयोग कर सकते हैं (मैं लेखक हूं): https://github.com/DevNIX/Vagrant-d dependency-manager

यह समान उत्तरों पर आधारित है, लेकिन अधिक पूर्ण और स्थिर होने की कोशिश कर रहा है। इस विचार का बड़ा फायदा यह है कि आप अपने वैग्रांटफाइल को वितरित कर सकते हैं और यह उस वातावरण पर स्थापित प्लगइन्स की परवाह किए बिना हर कंप्यूटर पर चलेगा।

यह प्रयोग करने में आसान है:

  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. फायदा!

मैं पुल अनुरोधों को मर्ज करना, आपके पास किसी भी मुद्दे को ठीक करना और नई सुविधाओं के विचारों को प्राप्त करना पसंद करूंगा। वर्तमान में मैं स्वयं निर्भरता प्रबंधक को अपडेट करने और विशिष्ट प्लगइन संस्करणों की आवश्यकता के बारे में सोच रहा हूं: डी

सादर!


0

मुझे Vagrant की नई स्थापना के साथ एक समस्या मिली, जहाँ .vagrant.d निर्देशिका अभी तक नहीं बनी है। मैं लुइस सेंट अमौर से स्निपेट बनाने में सक्षम था, अपवाद को पकड़कर काम कर रहा था।

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

विंडोज पर यह मुझे "वर्चुअलबॉक्स 'प्रदाता के साथ" मशीन लाने में' डिफ़ॉल्ट 'की त्रुटि देता है ... लेकिन एक अन्य प्रक्रिया पहले से ही मशीन पर कार्रवाई कर upरही है "क्योंकि द्वारा चलाया जा रहा है up। क्या इससे बचने का कोई तरीका vagrant upदो बार नहीं चल रहा है ?
टॉम बी

0

यहाँ मैं Vagrant 1.8 पर क्या उपयोग कर रहा हूँ और यह ठीक काम कर रहा है। इसे अपने Vagrantfile में कॉन्फ़िगर ब्लॉक से पहले कहीं रखें।

# 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

ऐसा प्रतीत होता है कि यह क्रॉस-प्लेटफॉर्म नहीं है।
व्रत १18
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.