让 Vagrant VM 在完成长时间运行的任务后自行销毁或关闭

让 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到剧本中,但这并没有停止 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 destroyVagrant 框文件夹中的。在 AWS 上,我们已经使用 PythonFlaskboto包以类似的方式终止框。这一切似乎有点笨拙,我想知道是否有更好的解决方案。

答案1

我没有使用过 ansible,但如果您可以将它配置为作为配置步骤来完成您的“工作”,那么简单的操作vagrant up && vagrant destroy就应该可以解决它。

Vagrant 将创建您的 VM、启动它、配置它(执行您的工作任务)然后销毁它。

相关内容