有没有办法从失败的地方重试剧本?
我是用
开始的vagrant provision
答案 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
选项意味着在上一个剧本失败之前收集的任何事实/变量将无法用于重试尝试。我不确定在运行重试之前是否有一种好方法可以重新收集这些事实,并且正如所提到的那样,无论如何我绝对倾向于重新运行整个剧本。