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

Is there any way to retry playbooks from where they failed?

有什么方法可以从失败的地方重试 playbook 吗?

我从

开始
vagrant provision

我不太清楚你为什么要这样做,因为 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 最初配置实例时失败。

请注意,剧本上的 limit 选项意味着在上一个剧本失败之前收集的任何 facts/variables 将无法用于重试。我不确定在 运行 重试之前是否有重新收集这些事实的好方法,并且如前所述,无论如何我肯定倾向于重新 运行 整个剧本。