Yanıtlar:
Yardımcı olması gereken en az iki eklenti:
Senaryonun (hemen hemen) tüm vagrant
komutlarda çalıştırılmasını umursamıyorsanız, Vagrantfile'de ayrıca kabaca çıkabilirsiniz (veya yakut büyüyü kullanabilirsiniz):
system('./myscript.sh')
Vagrant.configure('2') do |config|
# ...
end
Kernel
modülde . Modül dahildir onun yöntemleri tüm etki alanlarında kullanılabilir oldukları yüzden, sınıf. Kernel
Object
(Tamamlandı diyorum çünkü kabul edilen cevap kullanıcının sersemletici kullanıp kullanmadığını kontrol etmiyor. Bu nedenle komut dosyası OP'nin istediği gibi değil her komutta yürütülür.)
Ancak bunun için basit bir çözüm var.
ARGV[0]
komutunun ilk bağımsız girdi ve olabiliyor up
, down
, status
vb .. Basitçe değerini kontrol ARGV[0]
sizin Vagrantfile içinde.
Böyle bir şey yapacak:
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
Bunu Vagrantfile'nizin üst tarafına koyun:
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
Ardından Vagrantfile'inize şöyle bir çağrı yapın:
config.vm.provision "list-files", type: "local_shell", command: "ls"
Ve bunun gibi komut satırı aracılığıyla:
vagrant provision --provision-with list-files
Bu plug-in gibi göründüğü gibi bir kesmek, ama gerçekten değil (ne zaman görünmez vagrant plugin list
). Eklentiyi yüklemeye gerek duymama avantajına sahip olması haricinde, bu şekilde yapılmasını önermiyorum, bu yüzden Vagrantfile, en son yapılandırma sürümünü destekleyen herhangi bir makinede çalışacaktır (bu yazıyı yazarken sürüm 2). Kulağa umut verici bir şekilde taşınabilir gibi görünse de, yayınladığınız gerçek komutun çapraz platform sorunu da var. Vagrantfile dosyalarınızın taşınabilir olmasını istiyorsanız, bunun dikkate alınması gerekir, ancak bu başlamanıza neden olabilir.
@ Tmatilai'nin cevabına dayanarak ancak 2019'da güncellendiği için serseri tetikleyiciler Vagrant'la birleştirildi. Böylece şimdi böyle bir şey yapabilirsiniz:
node.trigger.before [:up, :provision] do |trigger|
trigger.info = "Running ./myscript.sh locally..."
trigger.run = {path: "./myscript.sh"}
end
Bu blok içeri girer config.vm.define
. Diğer belgeler: https://www.vagrantup.com/docs/triggers/
config.vm.define
bir gereklilik olmadığını eklemeliyim ; onlar da içine yerleştirilebilir Vagrant.configure("2") do |config| ... end
. Son bir not olarak, Windows ana bilgisayarlarında Vagrant, .ps1
uzantısına sahip Powershell komut dosyalarını da memnuniyetle uygulayacaktır .
@Tmatilai'nin kullanımı hakkında söyledikleri doğrultusunda
system('./myscript.sh')
Bir keresinde komutlara hileli komutları yüklemek ya da sistemde kurulu olmayan bazı hazırlayıcıları kullanmak için oldukça yararlı buldum. vagrant
Komutları her çalıştırdığımda yeniden çalıştırmamı önlüyorum, otomatik yorumlamaya bir sed ekleyerek Vagrantfile
.
Örneğin:
system('vagrant plugin install vagrant-fabric && (pip install fabric jinja2 || sudo pip install fabric jinja2) && sed -i -e "s/^system/#system/g" Vagrantfile')
Ve bunu Vagrant dosyamın ilk satırını yapıyorum. İlk serseri-kumaş eklentisi, kumaş ve jinja kuracaktır Bu şekilde (olmadan ilk çalışacağız sudo
için virtualenvs
ve birlikte sudo
o başarısız olursa) ve daha sonra hat yorumlar kendisi.
if [[ $(vagrant plugin list | grep -c vagrant-host-shell) == "0" ]] then vagrant plugin install vagrant-host-shell fi
vagrant status
önce vagrant up