योनि के दौरान होस्ट मशीन पर स्क्रिप्ट चलाएँ


40

मैं होस्ट मशीन पर बैश स्क्रिप्ट चलाना चाहता हूं, जब सर्वर सर्वर का प्रावधान करता है।

इसे प्राप्त करने का सबसे अच्छा तरीका क्या होगा?

जवाबों:


29

कम से कम दो प्लगइन्स जो मदद करनी चाहिए:

यदि आपको परवाह नहीं है कि स्क्रिप्ट को लगभग सभी vagrantकमांड पर चलाया जाता है , तो आप Vagrantfile में सिर्फ खोल सकते हैं (या कभी रूबी जादू का उपयोग कर सकते हैं):

system('./myscript.sh')

Vagrant.configure('2') do |config|
  # ...
end

2
वैग्रंट ट्रिगर्स बिल्कुल वैसा ही दिखता है जैसा मुझे चाहिए।
डिजिटल

आपको यह सिस्टम () फ़ंक्शन कहां से मिला? मैं इसके बारे में कहीं भी कोई भी दस्तावेज नहीं पा सकता ...
क्रिस्टियानो फोंट

1
@CristianoFontes, यह Kernelमॉड्यूल में है, यहाँ प्रलेखित हैKernelमॉड्यूल में शामिल किया गया है Object, इसलिए इसकी वर्ग तरीकों सभी कार्यक्षेत्रों में उपलब्ध हैं।
तमतिलाई

1
मूर्ख में। मैं आवारा दस्तावेज देख रहा था। धन्यवाद!
क्रिस्टियानो फॉंट्स

26

सरल (और पूर्ण) समाधान

(मैं पूरा कहता हूं क्योंकि स्वीकृत उत्तर यह नहीं जांचता है कि क्या उपयोगकर्ता योनि का उपयोग कर रहा है। इसलिए, स्क्रिप्ट को प्रत्येक कमांड पर निष्पादित किया जाता है, जो कि ओपी नहीं चाहता है।)

हालांकि इसका एक सरल उपाय है।

ARGV[0]आदेश का पहला तर्क में प्रवेश किया और किया जा सकता है up, down, status, आदि .. आप का मान की जाँच ARGV[0]अपने Vagrantfile में।


कुछ ऐसा होगा:

system("
    if [ #{ARGV[0]} = 'up' ]; then
        echo 'You are doing vagrant up and can execute your script'
        ./myscript.sh
    fi
")

Vagrant.configure('2') do |config|
  # ...
end

1
हाय, मिक ... इसके लिए अच्छा जवाब धन्यवाद। लेकिन मैं नहीं मिल सकता है अगर [# {ARGV [0]} = 'up']; खिड़कियों पर काम करने के लिए। यह arg
क्रिस्टियानो फॉंट्स

1
इससे पहले कि कुछ भी चलता है इससे पहले कि यह Vagrantfile में स्थिति की परवाह किए बिना आपकी स्क्रिप्ट को निष्पादित करता है। यह पर्याप्त हो सकता है कि आप क्या कर रहे हैं, लेकिन आवारा-ट्रिगर प्लगइन मुझे क्या चाहिए था ...
विगिंटस लाबाकोजिस

3
@CristianoFontes आप सिस्टम कॉल के बाहर माणिक में argv टेस्ट कर सकते हैं और यह विंडोज़ और * ix में काम करेगा। मैं एक वैश्विक रूबी वैरिएबल सेट करने के लिए इसका उपयोग करता हूं, जो यह दर्शाता है कि प्रोविजनिंग कमांड लाइन पर अप या प्रोविजन कमांड की तलाश में हो रही है: यदि ARGV [0] = ~ / ^ अप। प्रोविजन $ / i और न कि ARGV.include (?) - नहीं-प्रावधान ") $ प्रोविजनिंग = सही और $ प्रोविजनिंग = गलत अंत
Rhubarb

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

1
@ वैगरेंट डॉक्स ( डॉक्स.ग्रेगंटअप . com/v2/plugins/commands.html ) से बस इसे लाइक करें । यह एक नाजुक स्क्रिप्ट के लिए भी बनाता है क्योंकि आप निश्चित नहीं हो सकते हैं कि कॉल के मामलों में argv [0] को ध्वज कहने के बजाय 'ऊपर' है। इसके अलावा अगर आप कच्चे माणिक में गिर रहे हैं तो आप थोड़े से एन्कैप्सुलेशन को तोड़ रहे हैं जो कि ढांचा प्रदान करने वाला है। वहाँ सही ढंग से ऐसा करने के लिए तंत्र उजागर कर रहे हैं तो IMHO आप जब भी संभव हो उन का उपयोग करना चाहिए
साइलेंटिस

9

इसे अपने Vagrantfile के शीर्ष के पास रखें:

module LocalCommand
    class Config < Vagrant.plugin("2", :config)
        attr_accessor :command
    end

    class Plugin < Vagrant.plugin("2")
        name "local_shell"

        config(:local_shell, :provisioner) do
            Config
        end

        provisioner(:local_shell) do
            Provisioner
        end
    end

    class Provisioner < Vagrant.plugin("2", :provisioner)
        def provision
            result = system "#{config.command}"
        end
    end
end

तो बस इस तरह से अपने Vagrantfile में आह्वान करें:

config.vm.provision "list-files", type: "local_shell", command: "ls"

और इस तरह कमांड लाइन के माध्यम से:

vagrant provision --provision-with list-files

यह एक हैक की तरह है क्योंकि यह प्लग-इन जैसा दिखता है, लेकिन वास्तव में ऐसा नहीं है (जब आप ऐसा करते हैं तो यह दिखाई नहीं देगा vagrant plugin list)। मैं इसे इस तरह से करने की अनुशंसा नहीं करता, सिवाय इसके कि एक प्लगइन को स्थापित करने की आवश्यकता नहीं होने का लाभ है, इसलिए आपका वैग्रांटफाइल किसी भी मशीन पर काम करेगा जो नवीनतम कॉन्फ़िगरेशन संस्करण (यह लिखने के रूप में संस्करण 2) का समर्थन करता है। हालाँकि यह आशाजनक रूप से पोर्टेबल लगता है, लेकिन वास्तविक कमांड के पूरे क्रॉस-प्लेटफ़ॉर्म मुद्दा भी है जिसे आप जारी कर रहे हैं। यदि आप चाहते हैं कि आप अपने वैग्रांटफाइल को पोर्टेबल बनाना चाहते हैं, तो आपको इस पर ध्यान देना चाहिए, लेकिन यह आपको शुरू कर देना चाहिए।


1
अच्छा जवाब, मैं इसे कम पोर्ट फ़ॉरवर्डिंग सेटअप करने के लिए उपयोग करने जा रहा हूं।
कवि सम्मेलन

6

@ तमतिलाई के उत्तर के आधार पर लेकिन 2019 के लिए अद्यतन, योनि-ट्रिगर को वैग्रांत में मिला दिया गया है। तो अब आप ऐसा कुछ कर सकते हैं:

node.trigger.before [:up, :provision] do |trigger|
  trigger.info = "Running ./myscript.sh locally..."
  trigger.run = {path: "./myscript.sh"}
end

यह ब्लॉक अंदर चला जाता है config.vm.define। इसके अलावा प्रलेखन: https://www.vagrantup.com/docs/triggers/


यह अब तक का सबसे सुरुचिपूर्ण उत्तर है। मुझे यह जोड़ना चाहिए कि इसे और इसी तरह के स्निपेट को अंदर रखना config.vm.defineएक आवश्यकता नहीं है; वे भी भीतर रखा जा सकता है Vagrant.configure("2") do |config| ... end। नोट के अंतिम बिंदु के रूप में, विंडोज मेजबानों पर, वैग्रैंट ख़ुशी से पॉवरशेल स्क्रिप्ट को निष्पादित करेगा .ps1, जिसमें विस्तार भी है।
बेन जॉनसन

4

@Tmatilai का उपयोग करने के बारे में क्या कहा के साथ लाइन में

system('./myscript.sh')

मुझे यह एक समय के आदेशों के लिए काफी मददगार लगा जैसे कि आवारा कमांड्स या कुछ प्रावधान जो सिस्टम में स्थापित नहीं हो सकते हैं। मैं हर बार इसे फिर से चलाने से बचता हूं जब भी मैं vagrantऑटो-टिप्पणी करने के लिए एक sed जोड़कर आदेशों को लागू करता हूं Vagrantfile

उदाहरण के लिए:

system('vagrant plugin install vagrant-fabric && (pip install fabric jinja2 || sudo pip install fabric jinja2) && sed -i -e "s/^system/#system/g" Vagrantfile')

और मैं अपनी वैग्रांटीफाइल की पहली पंक्ति बनाता हूं। इस तरह यह सबसे पहले आवारा-कपड़ा प्लगइन, फैब्रिक और जिंजा स्थापित करेगा (पहले बिना इसके sudoलिए प्रयास करेगा virtualenvsऔर sudoयदि वह विफल रहता है तो) और फिर लाइन स्वयं टिप्पणी करती है।


Vagrantfile को अनसुना करने के बजाय बस वेज्रिट प्लग इन को लिस्ट करना आसान होगा, जो आपकी टीम के अन्य लोगों के लिए समस्या पैदा कर सकता है। if [[ $(vagrant plugin list | grep -c vagrant-host-shell) == "0" ]] then vagrant plugin install vagrant-host-shell fi
जॉर्डन

इसके साथ समस्या यह है कि इसे अन्य कमांड पर ट्रिगर किया जाएगा, अगर आप vagrant statusपहले चलाते हैं तो क्या होगा vagrant up...
मिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.