我一直使用Ansible的Vagrant来执行某些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
理想情况下,我想configuration一个盒子来执行一些长时间运行的任务,一旦完成,就销毁Vagrant盒子或至lessclosures电源。 我试图添加shutdown now的剧本,但这并没有停止虚拟机。 当我手动运行这个:
$ 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操作手册中执行“立即closures”不会阻止虚拟机运行:
$ vagrant status Current machine states: default running (virtualbox)
validation)一个stream浪VM是否有可能摧毁自己或自我closures?
一位同事build议我们在主机上创build一个RESTful端点,当一个长时间运行的工作完成时,客户在Vagrant框的文件夹中发起一个触发vagrant destroy的通话。 在AWS上,我们已经使用Python的Flask和boto包来以类似的方式终止盒子。 这一切似乎有点笨重,我想知道是否有更好的解决scheme。
我没有用过,但是如果你可以configuration它做你的“工作”作为configuration的一个步骤,那么一个简单的vagrant up && vagrant destroy应该照顾它。
stream浪者将创build你的虚拟机,启动它,configuration它(做你的工作任务),然后将其销毁。