Próbuję uzyskać regułę powłoki, aby uniknąć reprovisioning wystąpienie maszyny wirtualnej, jeśli już to zrobił wcześniej.Unikaj reprovisioning Vagrant VM, jeśli jest już dostarczona
Rozważmy następujący Vagrantfile:
Vagrant::Config.run do |config|
config.vm.define :minimal do |config|
# Base image
config.vm.box = "lucid32"
config.vm.box_url = "http://files.vagrantup.com/lucid32.box"
config.vm.provision :shell, :inline => "mkdir /tmp/foobar"
end
end
Jeśli prowadzisz vagrant up minimal
, stworzy pole i świadczenia początkowo. Jeśli następnie uruchomisz vagrant provision minimal
, spróbujesz wyreperować to pole, ale to się nie powiedzie (ponieważ katalog/tmp/foobar już istnieje).
Czy istnieje sposób na sprawienie, by Vagrant pamiętał, czy w przeszłości udostępnił maszynę i uniknął jej późniejszego przeprojektowania?
Więcej kontekst: Jeżeli biegnę vagrant up minimal
, ponownie uruchomić maszynę hosta, a następnie uruchom ponownie vagrant up minimal
, będzie starał się zastrzegania pola i niepowodzeniem. Zdarza się to dość często, ponieważ VirtualBox często powoduje paniki jądra na moim komputerze-hoście.
Dokonywanie idempotent Provisioner wydaje się być uzasadnione. Chociaż niekoniecznie łatwe. –
Przebijam skrypt obsługi administracyjnej na sekcje w otoczeniu instrukcji if. Dotykam pliku na końcu każdej sekcji, a instrukcja if sprawdza, czy plik istnieje. Każda sekcja kodu będzie uruchamiana tylko raz. To dodaje bardzo małą złożoność, a ja mam funkcje do sprawdzania i zapisywania pliku, aby ograniczyć bałagan. Jak dotąd działa to całkiem dobrze. Sugerowałbym również, że "test -d/path/to/dir || mkdir/path/to/dir" może być lepszym sposobem radzenia sobie z tym konkretnym problemem. Istnieje również -f dla plików i -L dla dowiązań symbolicznych. "man bash" ma więcej. – bogeymin
Prostym i głupim sposobem tworzenia idempotencji jest "dotknięcie ~/.VM_PROVISIONED" pod koniec procesu dostarczania (pod warunkiem, że wszystko się udało) i sprawdzenie jego istnienia na początku za pomocą '[-e ~/.VM_PROVISIONED]'. –