Serseri yukarı sırasında ana makinede komut dosyasını çalıştır


40

Sunucuya hükmetmeden sunucuya bir bash betiği çalıştırmak istiyorum.

Bunu başarmanın en iyi yöntemi ne olurdu?

Yanıtlar:


29

Yardımcı olması gereken en az iki eklenti:

Senaryonun (hemen hemen) tüm vagrantkomutlarda ç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

2
Serseri tetikleyiciler tam ihtiyacım olana benziyor.
dijital

Bu system () işlevini nerede buldunuz? Bu konuda herhangi bir belge bulamıyorum ...
Cristiano Fontes

1
@CristianoFontes, burada belgelenenKernel modülde . Modül dahildir onun yöntemleri tüm etki alanlarında kullanılabilir oldukları yüzden, sınıf. KernelObject
tmatilai,

1
Aptal ben. Serseri belgelere bakıyordum. Teşekkürler!
Cristiano Fontes

26

Basit (ve eksiksiz) Çözüm

(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, statusvb .. 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

1
Merhaba Mick ... Bunun için güzel cevap. Ancak [# {ARGV [0]} = 'yukarı']; pencerelerde çalışmak için. Asla argümanı bulamaz
Cristiano Fontes

1
Bu, senaryonuzu Vagrantfile'deki konumundan bağımsız olarak başka bir şey çalıştırılmadan önce yürütür. Yaptıkların için yeterli olabilir ama serseri tetikleyiciler eklentisi ihtiyacım olan
şeydi

3
@CristianoFontes sistem çağrısı dışında yakut argv testi yapabilirsiniz ve bu pencerelerde ve * nix çalışacaktır. Bunu, komut satırında up veya provizyon komutunu arayarak provizyonun gerçekleştiğini gösteren global bir yakut değişkeni ayarlamak için kullanıyorum: eğer ARGV [0] = ~ / ^ up | prodüksiyon $ / i ve ARGV.include? (" --no-provizyon ") $ provizyon = doğru başka $ provizyon = yanlış son
Rhubarb

Bu aslında Vagrant tarafından tavsiye edilen kötü bir uygulamadır, "yukarı" komutuna bağlanmanız için bir eklenti yazmalısınız, bunlardan herhangi birini belirtebilirsiniz: yürütmeden önce, sonra ve yürütme.
Sessizlik

1
@Sadece Vagrant docs'lardan ( docs.vagrantup.com/v2/plugins/commands.html ) bakın. Ayrıca kırılgan bir komut dosyası oluşturur, çünkü çağrı durumlarında argv [0] 'ın bir bayrak demek yerine' yukarı 'olduğundan emin olamazsınız. Ayrıca, ham yakutlara giriyorsanız, enkapsülasyonu ortadan kaldırıyorsanız, çerçevenin sağlaması gerekiyordu. Bunu doğru yapmak için maruz
kalma

9

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.


1
İyi cevap, bunu düşük portlu iletimi ayarlamak için kullanacağım.
poindexter

6

@ 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/


Bu, bugüne kadarki en zarif cevap. Bunu ve benzer parçacıkları içine yerleştirmenin config.vm.definebir 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, .ps1uzantısına sahip Powershell komut dosyalarını da memnuniyetle uygulayacaktır .
Ben Johnson

4

@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. vagrantKomutları 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 sudoiçin virtualenvsve birlikte sudoo başarısız olursa) ve daha sonra hat yorumlar kendisi.


Takımdaki diğer insanlar için sorunlara yol açabilecek Vagrantfile'yi rahatsız etmek yerine basitçe serseri eklenti listesini grep etmek daha kolay olurdu. if [[ $(vagrant plugin list | grep -c vagrant-host-shell) == "0" ]] then vagrant plugin install vagrant-host-shell fi
Jordan,

Bununla ilgili sorun, başka komutlarda tetiklenmesidir, daha vagrant statusönce vagrant up
Mick
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.