2015-08-25 8 views
5

Posiadam instalację wielu włóczęgów z kilkoma blokami, których potrzebuję zmienić zlecenie wykonania.Sterowanie wieloma maszynami Błędne zlecenie blokowania bloków

Ze względu na to, że kolejność vagrantów znajduje się na zewnątrz - w najbardziej zagnieżdżonym bloku wykonuje się ostatni.

Potrzebuję sposobu, aby bloki świadczenia bardziej zagnieżdżone, tak aby były wykonywane jako ostatnie. Próbowałem dodać mach.vm.define, ale te bloki nie działają i nie rozumiem dlaczego.

Normalne Wykonanie, źle zamówienie

Vagrant.require_version ">= 1.6.0" 
VAGRANTFILE_API_VERSION = "2" 

require 'yaml' 

machines = YAML.load_file('vagrant.yaml') 

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| 
    machines.each do |machine| 

    config.vm.define machine["name"] do |mach| 

     machine['run_this'].each do |run_this| 
     mach.vm.provider "virtualbox" do |v, override| 
      # should run first 
     end 
     end 

     # Do a puppet provision to install the rest of the software 
     mach.vm.provision "puppet" do |puppet| 
     # puppet stuff 
     end 

     mach.vm.box = 'ubuntu/trusty64' 

    end 
end 

Idealne rozwiązanie ale dodatkowo zagnieżdżony blok nie wykonuje

Vagrant.require_version ">= 1.6.0" 
VAGRANTFILE_API_VERSION = "2" 

require 'yaml' 

machines = YAML.load_file('vagrant.yaml') 

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| 
    machines.each do |machine| 

    config.vm.define machine["name"] do |mach| 

     machine['run_this'].each do |run_this| 
     mach.vm.provider "virtualbox" do |v, override| 
      # should run first but it doesn't because it's in an extra provider block 
     end 
     end 

     mach.vm.define :prov do |prov| # This block doesn't execute 

     # Do a puppet provision to install the rest of the software 
     prov.vm.provision "puppet" do |puppet| 
      # puppet stuff 
     end 

     end 

     mach.vm.box = 'ubuntu/trusty64' 

    end 
    end 
end 

Czy istnieje sposób, aby zaopatrzenie jeden poziom głębiej tak, że działa po zawartości bloku dostawcy?

EDYCJA: Wszystko, co jest określone przez dostawcę, jest niedozwolone (na przykład inny blok dostawcy) lub coś, co powoduje duplikowanie kodu.

+0

Czy możesz wyjaśnić, co dokładnie próbujesz zrobić przed rozpoczęciem udostępniania? – eddiemoya

+0

Mam niestandardową funkcję folderu synchronizacji wewnątrz pierwszego bloku dostawcy, który chcę uruchomić przed udostępnieniem – Sam

Odpowiedz

1

Nie wiem, co dokładnie robisz w pierwszym bloku, dlatego zakładam, że można go odwrócić za pomocą wewnętrznego bloku (ten, który współdziała z atrybutem :run_this).

Przy tej niewielkiej zmianie możemy umieścić wszystkie bloki wykonawcze na tym samym poziomie. Poniżej znajdziesz kod, który próbowałem zasymulować twój problem.

Vagrant.require_version ">= 1.6.0" 
VAGRANTFILE_API_VERSION = "2" 

require "yaml" 

machines = YAML.load_file("vagrant.yml") 

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| 

    machines.each do |machine| 

    config.vm.define machine["name"] do |mach| 

     mach.vm.box = "ubuntu/trusty64" 
     mach.vm.provision :shell, inline: "echo A" 

     mach.vm.provider :virtualbox do |v, override| 

     v.name = machine["name"] 
     override.vm.provision :shell, inline: "echo B" 

     machine["run_this"].each do |run_this| 
      override.vm.provision :shell, inline: "echo C" 
     end 

     # puppet stuff should come here (all on the same level) 
     override.vm.provision :shell, inline: "echo D" 

     end 

    end 

    end 

end 
+0

Nie mogę tego zrobić, ponieważ nie uruchomiłbym kroku świadczenia na dostawcach innych niż wirtualne skrzynki pocztowe bez powielania kodu – Sam

+0

Może dostawcy mogą być w pliku YAML. Każdy z konkretnymi sesjami "run_this". – warantesbr

+0

Vagrant.yaml nie ma w sobie języka VM lub włóczęgi, chodziło o to, żeby od tego wykreślić, dam ci repr. 200, żeby go nie zmarnować – Sam