我一直在使用 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
到剧本中,但这并没有停止 VM。当我手动运行此操作时:
$ 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 剧本中执行“立即关闭”并不能阻止 VM 运行:
$ vagrant status
Current machine states:
default running (virtualbox)
問題)Vagrant VM 有可能自我毁灭或者自行关闭吗?
一位同事建议我们在主机上创建一个 RESTful 端点,在完成长时间运行的作业后,客户机发出调用,触发vagrant destroy
Vagrant 框文件夹中的。在 AWS 上,我们已经使用 PythonFlask
和boto
包以类似的方式终止框。这一切似乎有点笨拙,我想知道是否有更好的解决方案。
答案1
我没有使用过 ansible,但如果您可以将它配置为作为配置步骤来完成您的“工作”,那么简单的操作vagrant up && vagrant destroy
就应该可以解决它。
Vagrant 将创建您的 VM、启动它、配置它(执行您的工作任务)然后销毁它。