Faça com que uma VM do Vagrant se destrua ou desligue ao concluir uma tarefa demorada

2

Estou usando o Vagrant with Ansible para executar determinadas tarefas de ETL. Isso forneceu certa flexibilidade e transparência: os trabalhos podem ser facilmente movidos e o manual do YAML fornece algum nível de documentação.

Aqui está um exemplo mínimo do Vagrantfile:

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.box = "hashicorp/precise64"

  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "vagrantCronjobPlaybook.yml"
  end

end

... e a cartilha Ansible:

# vagrantCronjobPlaybook.yml
- hosts: all
  user: vagrant
  sudo: True

    tasks:

    - name: leave the 'VM up' flag
      shell: "touch /vagrant/done"

    - name: shutdown the box
      shell: shutdown now

Idealmente, eu gostaria de provisionar uma caixa para realizar alguma tarefa de longa duração e, uma vez concluída, destruir a caixa do Vagrant ou pelo menos desligar. Eu tentei adicionar um shutdown now ao playbook, mas isso não impediu a VM. Quando eu corro isso manualmente:

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[... 'all is well' messages removed]
    default: /vagrant => /Users/awoolford/Documents/vagrantCronjob
==> default: Running provisioner: ansible...

PLAY [all] ******************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [default]

TASK: [leave the 'VM up' flag] ************************************************ 
changed: [default]

TASK: [shutdown the box] ****************************************************** 
changed: [default]

PLAY RECAP ******************************************************************** 
default                    : ok=3    changed=2    unreachable=0    failed=0 

... vejo que a tarefa é concluída:

$ ls done
done

No entanto, simplesmente executar um 'desligamento agora' no Playbook Ansible não impede que a VM seja executada:

$ vagrant status
Current machine states:

default                   running (virtualbox)

Quesion) É possível que uma VM do Vagrant se destrua ou se desligue?

Um colega sugeriu que criassemos um ponto de extremidade RESTful no host que, ao concluir um trabalho de longa duração, faça uma chamada que acione vagrant destroy na pasta da caixa Vagrant. Na AWS, usamos o pacote Flask e boto do Python para finalizar as caixas de maneira semelhante. Isso tudo parece um pouco desajeitado e eu estou querendo saber se há uma solução melhor.

    
por Alex Woolford 10.09.2014 / 00:27

1 resposta

2

Eu não usei ansible, mas se você puder configurá-lo para fazer o seu "trabalho" como uma etapa de provisionamento, um simples vagrant up && vagrant destroy deverá cuidar dele.

O Vagrant irá criar sua VM, iniciá-la, provisioná-la (executando suas tarefas) e depois destruí-la.

    
por 11.09.2014 / 07:17