जवाबों:
कम से कम दो प्लगइन्स जो मदद करनी चाहिए:
यदि आपको परवाह नहीं है कि स्क्रिप्ट को लगभग सभी vagrantकमांड पर चलाया जाता है , तो आप Vagrantfile में सिर्फ खोल सकते हैं (या कभी रूबी जादू का उपयोग कर सकते हैं):
system('./myscript.sh')
Vagrant.configure('2') do |config|
# ...
end
Kernelमॉड्यूल में है, यहाँ प्रलेखित है । Kernelमॉड्यूल में शामिल किया गया है Object, इसलिए इसकी वर्ग तरीकों सभी कार्यक्षेत्रों में उपलब्ध हैं।
(मैं पूरा कहता हूं क्योंकि स्वीकृत उत्तर यह नहीं जांचता है कि क्या उपयोगकर्ता योनि का उपयोग कर रहा है। इसलिए, स्क्रिप्ट को प्रत्येक कमांड पर निष्पादित किया जाता है, जो कि ओपी नहीं चाहता है।)
हालांकि इसका एक सरल उपाय है।
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
इसे अपने 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) का समर्थन करता है। हालाँकि यह आशाजनक रूप से पोर्टेबल लगता है, लेकिन वास्तविक कमांड के पूरे क्रॉस-प्लेटफ़ॉर्म मुद्दा भी है जिसे आप जारी कर रहे हैं। यदि आप चाहते हैं कि आप अपने वैग्रांटफाइल को पोर्टेबल बनाना चाहते हैं, तो आपको इस पर ध्यान देना चाहिए, लेकिन यह आपको शुरू कर देना चाहिए।
@ तमतिलाई के उत्तर के आधार पर लेकिन 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, जिसमें विस्तार भी है।
@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यदि वह विफल रहता है तो) और फिर लाइन स्वयं टिप्पणी करती है।
if [[ $(vagrant plugin list | grep -c vagrant-host-shell) == "0" ]] then vagrant plugin install vagrant-host-shell fi
vagrant statusपहले चलाते हैं तो क्या होगा vagrant up...