有没有办法从失败的地方重试剧本?

时间:2015-05-27 11:07:27

标签: vagrant ansible vagrantfile

有没有办法从失败的地方重试剧本?

我是用

开始的
vagrant provision

1 个答案:

答案 0 :(得分:18)

我不太清楚你为什么要这样做,因为Ansible剧本应该是幂等的,因此从一开始就重新运行整个事情应该是完全没问题的。

也就是说,如果你确实需要这个,Ansible会在失败的剧本结尾处公开一个重试机制,如下所示:

PLAY RECAP ******************************************************************** 
           to retry, use: --limit @/home/user/playbook.retry

如果你直接在盒子上,你可以按照以下方式运行:

ansible-playbook playbook.yml --limit @/home/user/playbook.retry

要使其作为Vagrant的配置程序可用,您需要添加另一个命名配置程序,以便您的Vagrantfile可能如下所示:

Vagrant.configure("2") do |config|
  # ... other configuration

  # Does the normal playbook run
  config.vm.provision "bootstrap", type: "ansible" do |bootstrap|
    bootstrap.playbook = "playbook.yml"
  end

  # Picks up from any failed runs
  # Run this with: "vagrant provision --provision-with resume"
  config.vm.provision "resume", type: "ansible" do |resume|
    resume.playbook = "playbook.yml"
    resume.limit = "--limit @/home/user/playbook.retry"
  end
end

正如Vagrantfile的评论中指出的那样,这将尝试同时运行playbook.yml播放本和在第一个playbook.retry上失败的运行中创建的vagrant up重试播放。如果playbook.yml失败,那么它将自动尝试并恢复(并且可能会失败,因为您尚未解决它失败的原因)然后退出。

然后,您可以修复您的剧本或广告资源中需要修复的内容,然后运行vagrant provision --provision-with resume以运行名为resume的配置块,以便在您最初配置时playbook.yml失败的地方选择实例

虽然playbook上的limit选项意味着在上一个剧本失败之前收集的任何事实/变量将无法用于重试尝试。我不确定在运行重试之前是否有一种好方法可以重新收集这些事实,并且正如所提到的那样,无论如何我绝对倾向于重新运行整个剧本。