Я использовал Vagrant с Ansible для выполнения определенных задач ETL. Это обеспечило некоторую гибкость и прозрачность: задания можно легко перемещать, а учебник YAML предоставляет некоторый уровень документации.
Вот минимальный пример 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
... и сценарий 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
В идеале я хотел бы подготовить ящик для выполнения какой-нибудь длительной задачи и, как только она будет завершена, уничтожить ящик Vagrant или, по крайней мере, отключить питание. Я пробовал добавить shutdown now
в playbook, но это не остановило виртуальную машину. Когда я запускаю это вручную:
$ 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
... Вижу, что задача выполнена:
$ ls done
done
Однако простое выполнение «выключения сейчас» в плейбуке Ansible не останавливает запуск виртуальной машины:
$ vagrant status
Current machine states:
default running (virtualbox)
Вопрос) Может ли Vagrant VM уничтожить себя или выключиться?
Коллега предложил создать на хосте конечную точку RESTful, которая после завершения длительного задания гость делает вызов, который запускает vagrant destroy
в папке ящика Vagrant. В AWS мы использовали Python Flask
и boto
пакет, чтобы закрыть коробки аналогичным образом. Все это кажется немного неуклюжим, и мне интересно, есть ли лучшее решение.
Я не использовал ansible, но если вы можете настроить его так, чтобы он выполнял свою «работу» в качестве шага подготовки, тогда простой vagrant up && vagrant destroy
должен позаботиться об этом.
Vagrant создаст вашу виртуальную машину, запустит ее, подготовит (выполнит ваши рабочие задачи), а затем уничтожит.