যোজনার সময় হোস্ট মেশিনে স্ক্রিপ্ট চালান Run


40

আমি যখন হোস্ট মেশিনে ব্যাশ স্ক্রিপ্ট চালাতে চাই তখন সার্ভারের বিভ্রান্তি রয়েছে।

এটি অর্জনের সর্বোত্তম পদ্ধতিটি কী হবে?

উত্তর:


29

কমপক্ষে দুটি প্লাগইন যা সহায়তা করবে:

স্ক্রিপ্টটি সমস্ত vagrantকমান্ড (প্রায়) চালু আছে সেদিকে খেয়াল না রাখলে আপনি ভ্যাগ্রান্টফাইলে কেবল শেল আউট (বা যা কখনও রুবি যাদু ব্যবহার করতে পারেন) ব্যবহার করতে পারেন:

system('./myscript.sh')

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

2
ভ্যাগ্র্যান্ট ট্রিগারগুলি দেখতে আমার মতো দেখতে ঠিক লাগে।
ডিজিটাল

আপনি কোথায় এই সিস্টেমটি () ফাংশনটি পেয়েছেন? আমি এটি সম্পর্কে কোথাও কোনও দলিল খুঁজে পাচ্ছি না ...
ক্রিশ্চিয়ানো ফন্টেস

1
@ ক্রিশ্চিয়ানোফোন্টস, এটি Kernelমডিউলটিতে রয়েছে এখানে নথিভুক্তKernelমডিউল মধ্যে অন্তর্ভুক্ত করা হয় Object, বর্গ, যাতে তার পদ্ধতি সব সুযোগ পাওয়া যায়।
tmatilai

1
আমাকে বোকা বানাও. আমি অস্পষ্ট ডকুমেন্টেশন খুঁজছিলাম। ধন্যবাদ!
ক্রিশ্চিয়ানো ফন্টেস 16

26

সহজ (এবং সম্পূর্ণ) সমাধান

(আমি সম্পূর্ণ বলেছি কারণ গৃহীত উত্তরটি ব্যবহারকারী ভিজাগর আপ ব্যবহার করছে কিনা তা যাচাই করে না Therefore সুতরাং, প্রতিটি কমান্ডে স্ক্রিপ্টটি কার্যকর করা হয়, যা ওপি চায় না))

এটির একটি সহজ সমাধান রয়েছে।

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
হাই, মিক ... এর জন্য সুন্দর উত্তর। তবে আমি পেতে পারছি না [# 0 আরজিভি [0]} = 'আপ']; উইন্ডোতে কাজ করতে। এটি আরগটি কখনই খুঁজে পায় না
ক্রিশ্চিয়ানো ফন্টেস

1
ভ্যাগ্রান্টফাইলে অবস্থান নির্বিশেষে অন্য কোনও কিছু চালানোর আগে এটি আপনার স্ক্রিপ্টটিকে প্রথমে কার্যকর করে। আপনি যা করছেন তার পক্ষে এটি পর্যাপ্ত হতে পারে তবে ভাইরাস-ট্রিগার প্লাগইন আমার যা প্রয়োজন তা ছিল ...
Vigintas Labakojis

3
ক্রিশ্চিয়ানোফোন্টেস আপনি সিস্টেমের কলের বাইরে রুবিতে আরজিভি পরীক্ষা করতে পারেন এবং এটি উইন্ডোজ এবং * নিক্সে কাজ করবে। কমান্ড লাইনে আপ বা প্রভিশন কমান্ড সন্ধানের মাধ্যমে প্রভিশনের ঘটনা ঘটছে তা নির্দেশ করে আমি বিশ্বব্যাপী রুবি ভেরিয়েবল সেট করতে এটি ব্যবহার করি: যদি এআরজিভি [0] = ~ / ^ আপ | বিধান not / i হয় এবং এআরজিভি.ইনক্লিন্ট না? (" - কোন বিধান ") $ বিধান = সত্য অন্যথায় $ বিধান = মিথ্যা শেষ
রবার্ব

এটি ভ্যাগ্র্যান্টের পরামর্শ অনুসারে একটি খারাপ অভ্যাস, আপনার "আপ" কমান্ডটি দেখতে একটি প্লাগইন লিখতে হবে, আপনি যে কোনওটির নির্দিষ্টকরণ করতে পারেন: এর আগে, পরে এবং প্রায়শই কার্যকর করা।
নীরবতা

1
@ ঠিক এটি ভ্যাগ্র্যান্ট ডক্স ( ডকস.ভ্যাগান্টআপ . com / v2 / plugins / commands.html ) থেকে মিক করুন । এটি একটি নাজুক স্ক্রিপ্টও তৈরি করে যেহেতু আপনি নিশ্চিত হতে পারবেন না যে কলের ক্ষেত্রে একটি পতাকা বলার চেয়ে আরগভি [0] 'আপ' রয়েছে। এছাড়াও যদি আপনি কাঁচা রুবিতে নামাচ্ছেন তবে আপনি এনক্যাপসুলেশনটি ভেঙে ফেলছেন যা কাঠামোটি সরবরাহ করছে বলে মনে করা হচ্ছে। এটি সঠিকভাবে করার জন্য এমন ব্যবস্থাগুলি উন্মোচিত হয়েছে যেগুলি যখনই সম্ভব সম্ভব
IMHO

9

এটি আপনার ভ্যাগ্র্যান্টফাইলের শীর্ষের কাছে রাখুন:

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

তারপরে আপনার ভ্যাগ্রান্টফাইলে কেবল এইভাবে প্রার্থনা করুন:

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

এবং কমান্ড লাইনের মাধ্যমে এটি:

vagrant provision --provision-with list-files

এটি হ্যাকের মতো যা এটি প্লাগ-ইনয়ের মতো লাগে তবে সত্যই তা হয় না (এটি আপনি কখন করবেন তা দেখায় না vagrant plugin list)। আমি এটি এইভাবে করার প্রস্তাব দিই না এটি ছাড়া এটিতে কোনও প্লাগইন ইনস্টল করার প্রয়োজন না হওয়ার সুবিধা রয়েছে, সুতরাং আপনার ভ্যাগ্রান্টফাইলে যে কোনও মেশিনে কাজ করবে যা সর্বশেষতম কনফিগারেশন সংস্করণটিকে সমর্থন করে (এটি লেখার মতো সংস্করণ 2)। যদিও এটি আশ্বাসজনকভাবে বহনযোগ্য বলে মনে হচ্ছে, আপনি যে বাস্তব আদেশটি জারি করছেন তার পুরো ক্রস-প্ল্যাটফর্মের সমস্যাটিও রয়েছে। আপনি যদি আপনার ভ্যাগ্রান্টফাইলে বহনযোগ্য হতে চান তবে আপনাকে বিবেচনা করা দরকার তবে এটি আপনাকে শুরু করা উচিত।


1
ভাল উত্তর, আমি সেট আপ লো পোর্ট ফরওয়ার্ডিং সেট আপ করতে যাচ্ছি।
poindexter

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

@ তমতিলাই ব্যবহারের বিষয়ে যা বলেছেন তার সাথে সামঞ্জস্য

system('./myscript.sh')

আমি এটি এক সময়ের কমান্ডগুলির জন্য বেশ সহায়ক হিসাবে পেয়েছি যেমন ভ্যাগ্রান্ট কমান্ডগুলি ইনস্টল করতে বা এমন কিছু বিধানকারী যা সিস্টেমে ইনস্টল না করা হতে পারে installing আমি vagrantস্বতঃ-মন্তব্য করার জন্য একটি সেড যুক্ত করে কমান্ডগুলি যখনই প্রার্থনা করি ততবারই এটি পুনরায় চালানো এড়াতে চাই Vagrantfile

উদাহরণ স্বরূপ:

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

এবং আমি আমার Vagrantfile এর প্রথম লাইনটি তৈরি করি। এই পদ্ধতি (ছাড়া প্রথম চেষ্টা করবে এটি প্রথম ভবঘুরে-ফ্যাব্রিক প্লাগইন, ফ্যাব্রিক এবং Jinja ইনস্টল করবে 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...
মিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.