ฉันต้องการเรียกใช้สคริปต์ทุบตีบนเครื่องโฮสต์เมื่อคนจัดระเบียบกำหนดเซิร์ฟเวอร์
อะไรจะเป็นวิธีที่ดีที่สุดในการบรรลุเป้าหมายนี้?
ฉันต้องการเรียกใช้สคริปต์ทุบตีบนเครื่องโฮสต์เมื่อคนจัดระเบียบกำหนดเซิร์ฟเวอร์
อะไรจะเป็นวิธีที่ดีที่สุดในการบรรลุเป้าหมายนี้?
คำตอบ:
อย่างน้อยสองปลั๊กอินที่ควรช่วย:
หากคุณไม่สนใจว่าสคริปต์นั้นรันอยู่ (เกือบ) vagrant
คำสั่งทั้งหมดคุณยังสามารถใช้คำสั่งเชลล์ (หรือใช้เวทมนตร์ ruby) ใน Vagrantfile:
system('./myscript.sh')
Vagrant.configure('2') do |config|
# ...
end
Kernel
โมดูลการบันทึกไว้ที่นี่ Kernel
โมดูลรวมอยู่ในObject
ระดับดังนั้นวิธีการที่มีอยู่ในขอบเขตทั้งหมด
(ฉันบอกว่าสมบูรณ์เพราะคำตอบที่ยอมรับไม่ได้ตรวจสอบว่าผู้ใช้กำลังใช้คนพเนจรหรือไม่ดังนั้นสคริปต์จะถูกดำเนินการในแต่ละคำสั่งซึ่งไม่ใช่สิ่งที่ OP ต้องการ)
อย่างไรก็ตามมีวิธีง่ายๆในการนี้
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
วางสิ่งนี้ไว้ที่ด้านบนสุดของไฟล์ Vagrant ของคุณ:
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
จากนั้นเพียงเรียกใช้ไฟล์ Vagrant ของคุณเช่นนี้:
config.vm.provision "list-files", type: "local_shell", command: "ls"
และผ่านทางบรรทัดคำสั่งเช่นนี้:
vagrant provision --provision-with list-files
นี่เป็นแฮ็คที่ดูเหมือนปลั๊กอิน แต่จริงๆแล้วไม่ใช่ (มันจะไม่ปรากฏเมื่อคุณทำvagrant plugin list
) ฉันไม่แนะนำให้ทำเช่นนี้ยกเว้นว่ามันจะมีข้อได้เปรียบที่ไม่จำเป็นต้องติดตั้งปลั๊กอินดังนั้น Vagrantfile ของคุณจะทำงานบนเครื่องใดก็ได้ที่รองรับการกำหนดค่าเวอร์ชันล่าสุด (รุ่น 2 เมื่อเขียนสิ่งนี้) แม้ว่าฟังดูเหมือนจะพกพาได้ดี แต่ก็ยังมีปัญหาข้ามแพลตฟอร์มทั้งหมดของคำสั่งจริงที่คุณกำลังออก คุณจะต้องคำนึงถึงว่าคุณต้องการให้ Vagrantfile ของคุณพกพาได้หรือไม่ แต่คุณควรเริ่มใช้งาน
จากคำตอบของ @ tmatilai แต่ได้รับการปรับปรุงสำหรับปี 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
เช่นกัน ในฐานะที่เป็นจุดสุดท้ายของการบันทึกบนโฮสต์ของ Windows Vagrant ยินดีที่จะใช้งานสคริปต์ Powershell ที่มี.ps1
ส่วนขยายเช่นกัน
สอดคล้องกับสิ่งที่ @tmatilai พูดเกี่ยวกับการใช้
system('./myscript.sh')
ฉันพบว่ามันค่อนข้างมีประโยชน์สำหรับคำสั่งครั้งเดียวเช่นการติดตั้งคำสั่ง vagrant หรือตัวจัดสรรบางตัวที่อาจไม่ได้ติดตั้งในระบบ ฉันเพียงแค่หลีกเลี่ยงได้อีกครั้งการทำงานทุกครั้งที่ผมเรียก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')
และฉันทำบรรทัดแรกของ 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
...