Jawaban:
Setidaknya dua plugin yang akan membantu:
Jika Anda tidak peduli bahwa skrip dijalankan pada (hampir) semua vagrant
perintah, Anda juga dapat langsung keluar (atau menggunakan apa pun ruby magic) di Vagrantfile:
system('./myscript.sh')
Vagrant.configure('2') do |config|
# ...
end
Kernel
modul, didokumentasikan di sini . The Kernel
modul termasuk dalam Object
kelas, sehingga metode yang tersedia di semua lingkup.
(Saya katakan lengkap karena jawaban yang diterima tidak memeriksa apakah pengguna menggunakan gelandangan. Oleh karena itu, skrip dieksekusi pada setiap perintah, yang bukan yang diinginkan OP.)
Namun ada solusi sederhana untuk ini.
ARGV[0]
adalah argumen pertama dari perintah masuk dan bisa up
, down
, status
, dll .. Cukup memeriksa nilai ARGV[0]
di Vagrantfile Anda.
Sesuatu seperti ini akan dilakukan:
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
Letakkan ini di dekat bagian atas Vagrantfile Anda:
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
Maka cukup panggil di Vagrantfile Anda seperti ini:
config.vm.provision "list-files", type: "local_shell", command: "ls"
Dan melalui baris perintah seperti ini:
vagrant provision --provision-with list-files
Ini jenis peretasan karena terlihat seperti plug-in, tetapi sebenarnya tidak (tidak akan muncul saat Anda melakukannya vagrant plugin list
). Saya tidak menyarankan melakukannya dengan cara ini kecuali itu memiliki keuntungan karena tidak perlu menginstal plugin, sehingga Vagrantfile Anda akan bekerja pada mesin apa pun yang mendukung versi konfigurasi terbaru (versi 2 saat menulis ini). Meskipun kedengarannya sangat portabel, ada juga seluruh masalah lintas platform dari perintah aktual yang Anda keluarkan. Anda harus mempertimbangkan jika Anda ingin Vagrantfile Anda portabel, tetapi ini harus Anda mulai.
Berdasarkan jawaban @ tmatilai tetapi diperbarui untuk 2019, pemicu gelandangan telah digabung menjadi Vagrant. Jadi sekarang Anda dapat melakukan sesuatu seperti:
node.trigger.before [:up, :provision] do |trigger|
trigger.info = "Running ./myscript.sh locally..."
trigger.run = {path: "./myscript.sh"}
end
Blok ini masuk dari config.vm.define
. Dokumentasi lebih lanjut: https://www.vagrantup.com/docs/triggers/
config.vm.define
bukanlah persyaratan; mereka dapat ditempatkan di dalam Vagrant.configure("2") do |config| ... end
juga. Sebagai catatan terakhir, pada host Windows, Vagrant dengan senang hati akan mengeksekusi skrip Powershell yang memiliki .ps1
ekstensi juga.
Sejalan dengan apa yang dikatakan @tmatilai tentang penggunaan
system('./myscript.sh')
Saya menemukan itu cukup membantu untuk satu perintah kali seperti menginstal perintah gelandangan atau beberapa penyedia yang mungkin tidak diinstal dalam sistem. Saya hanya menghindarinya menjalankan kembali setiap kali saya menjalankan vagrant
perintah dengan menambahkan sed ke komentar otomatis Vagrantfile
.
Sebagai contoh:
system('vagrant plugin install vagrant-fabric && (pip install fabric jinja2 || sudo pip install fabric jinja2) && sed -i -e "s/^system/#system/g" Vagrantfile')
Dan saya membuatnya menjadi baris pertama Vagrantfile saya. Dengan cara ini pertama kali akan menginstal gelandangan-kain Plugin, kain dan jinja (akan mencoba pertama tanpa sudo
untuk virtualenvs
dan dengan sudo
jika gagal) dan kemudian komentar baris itu sendiri.
if [[ $(vagrant plugin list | grep -c vagrant-host-shell) == "0" ]] then vagrant plugin install vagrant-host-shell fi
vagrant status
sebelumnya vagrant up
...