Назад | Перейти на главную страницу

Попросите Vagrant VM уничтожить себя или выключить питание по завершении длительной задачи

Я использовал 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 создаст вашу виртуальную машину, запустит ее, подготовит (выполнит ваши рабочие задачи), а затем уничтожит.