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.