Saya ingin menjalankan skrip bash pada mesin host ketika gelandangan menyediakan server.
Apa yang akan menjadi metode terbaik untuk mencapai ini?
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 . TheKernel
modul termasuk dalamObject
kelas, sehingga metode yang tersedia di semua lingkup.Solusi sederhana (dan lengkap)
(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 bisaup
,down
,status
, dll .. Cukup memeriksa nilaiARGV[0]
di Vagrantfile Anda.Sesuatu seperti ini akan dilakukan:
sumber
Letakkan ini di dekat bagian atas Vagrantfile Anda:
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.sumber
Berdasarkan jawaban @ tmatilai tetapi diperbarui untuk 2019, pemicu gelandangan telah digabung menjadi Vagrant. Jadi sekarang Anda dapat melakukan sesuatu seperti:
Blok ini masuk dari
config.vm.define
. Dokumentasi lebih lanjut: https://www.vagrantup.com/docs/triggers/sumber
config.vm.define
bukanlah persyaratan; mereka dapat ditempatkan di dalamVagrant.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
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 otomatisVagrantfile
.Sebagai contoh:
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
untukvirtualenvs
dan dengansudo
jika gagal) dan kemudian komentar baris itu sendiri.sumber
if [[ $(vagrant plugin list | grep -c vagrant-host-shell) == "0" ]] then vagrant plugin install vagrant-host-shell fi
vagrant status
sebelumnyavagrant up
...