2015-08-25 12 views
5

Ho una configurazione vagabonda con più macchine con alcuni blocchi di cui ho bisogno per modificare l'ordine di esecuzione.Ordine di esecuzione blocco multi-macchina di controllo Vagante

A causa dell'ordine vagante di essere fuori, nel blocco più nidificato viene eseguito per ultimo.

Ho bisogno di un modo per rendere i blocchi di provisioning più nidificati in modo che vengano eseguiti per ultimi. Ho provato ad aggiungere mach.vm.define ma quei blocchi non vengono eseguiti e non capisco perché.

Esecuzione normale, ordine sbagliato

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 

soluzione ideale, ma blocco nidificato in più non viene eseguito

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 

C'è un modo per rendere il livello di provisioning uno più profondo modo che venga eseguito dopo che il contenuto del blocco del provider?

MODIFICA: tutto ciò che è specifico del provider non è accettabile (ad esempio, un altro blocco provider) o qualsiasi altra cosa che causa codice duplicato.

+0

Puoi spiegare che cosa stai cercando di fare esattamente prima dell'avvio del provisioning? – eddiemoya

+0

Ho una funzione di cartella di sincronizzazione personalizzata all'interno del primo blocco provider che voglio eseguire prima del provisioning – Sam

risposta

1

Non so cosa si stia facendo esattamente nel primo blocco, ecco perché presumo che possa essere invertito con il blocco interno (quello che interagisce con l'attributo :run_this).

Con questo piccolo cambiamento possiamo mettere tutti i blocchi di esecuzione sullo stesso livello. Qui sotto troverai il codice che ho provato a simulare il tuo problema.

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

Non riesco a farlo poiché non eseguirà il passaggio di provisioning sui provider non virtualbox senza duplicare il codice – Sam

+0

Forse i provider possono essere anche nel file YAML. Ognuno con le tue sessioni "run_this" specifiche. – warantesbr

+0

Il vagrant.yaml non ha una VM o un linguaggio vagabondo, l'idea era di allontanarsi da quella, ti darò il 200 rep di non sprecarlo però – Sam