多机Vagrant环境中,预配测试通过后如何立即停机?
解决方案:多机Vagrant环境预配完成后自动停机
针对你的需求——在tests.yml执行无错误后立即停机对应机器,这里有两种实用方案,你可以根据场景选择:
方案一:在Ansible Playbook中添加停机任务
这种方法不需要额外安装Vagrant插件,直接在你的tests.yml末尾添加条件任务,只有当所有测试任务成功完成时才执行停机操作。
修改tests.yml:
在Playbook的最后添加以下任务:
- name: Power off the machine if all tests pass ansible.builtin.command: systemctl poweroff become: true # 仅当当前Play的所有任务都未失败时执行 when: ansible_failed_result is not defined
systemctl poweroff是跨Ubuntu/Fedora的通用停机命令(两者都使用systemd)become: true确保以root权限执行停机操作when条件保证只有前面的测试任务全部成功时,才触发停机
方案二:使用Vagrant Trigger插件统一控制
如果你希望在Vagrant层面统一管理停机逻辑,而不是修改Ansible Playbook,可以使用Vagrant的vagrant-triggers插件。
步骤1:安装插件
首先在终端执行以下命令安装插件:
vagrant plugin install vagrant-triggers
步骤2:修改Vagrantfile
在现有配置的末尾添加trigger规则,指定在provision成功后执行停机:
config.trigger.after :provision do |trigger| # 对每台机器执行halt命令 trigger.run = { inline: "vagrant halt {vm.name}" } # 仅当provision状态为成功时触发 trigger.only = { status: :ok } end
这个配置会在每台机器的所有预配任务(包括你的setup.yml和tests.yml)执行成功后,自动调用vagrant halt命令停机。
方案对比
- 方案一:无需额外插件,灵活度高,可以针对不同机器或测试结果设置不同的停机逻辑,适合需要精细控制的场景。
- 方案二:在Vagrant层面统一管理,不需要修改Ansible代码,适合所有机器都需要统一执行停机操作的场景。
内容的提问来源于stack exchange,提问作者ipaleka
相关产品推荐
相关产品推荐

