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

Vagrant 有没有办法从失败的地方重试剧本?,vagrant,ansible,vagrantfile,Vagrant,Ansible,Vagrantfile,有没有办法从失败的地方重试剧本 我从一开始 vagrant provision 我不太确定你为什么要这么做,因为Ansible剧本应该是幂等的,所以从一开始重新运行整个过程应该是完全好的 也就是说,如果您确实需要这样做,Ansible会在失败的剧本末尾公开重试机制,如下所示: PLAY RECAP ******************************************************************** to retry, use: --l

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

我从一开始

vagrant provision

我不太确定你为什么要这么做,因为Ansible剧本应该是幂等的,所以从一开始重新运行整个过程应该是完全好的

也就是说,如果您确实需要这样做,Ansible会在失败的剧本末尾公开重试机制,如下所示:

PLAY RECAP ******************************************************************** 
           to retry, use: --limit @/home/user/playbook.retry
如果你直接在盒子上,那么你可以沿着以下路线运行一些东西:

ansible-playbook playbook.yml --limit @/home/user/playbook.retry
要使其作为Vagrant的provisioner可用,您需要添加另一个命名的provisioner,以便您的Vagrant文件看起来像:

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
正如vagrant文件的注释所指出的,这将尝试运行
playbook.yml
playbook和
playbook.retry
重试在第一次
vagrant up
失败运行时创建的播放。如果
playbook.yml
失败,那么它将自动尝试并恢复(可能会失败,因为您尚未修复失败的原因),然后退出

然后,您可以修复playbook或资源清册中需要修复的内容,然后运行
vagrant provision--provision with resume
以运行名为
resume
的配置块,从最初配置实例时失败的
playbook.yml
位置提取


请注意,playbook上的
limit
选项将意味着在上一个playbook失败之前收集的任何事实/变量将无法用于重试尝试。我不确定在运行重试之前是否有一个好的方法来重新收集这些事实,正如前面提到的,我肯定会倾向于在失败时重新运行整个剧本

为什么要从失败的地方重新启动?围绕Ansible和许多其他配置工具的整个设计理念是,您应该能够以幂等方式反复运行它们。当您的第一个任务需要一个小时才能成功,而第二个任务却失败时,它会很有用。在macos上,Ansible 1.9.2和vagrant 1.7.4不能按所列方式运行,将
resume.raw_arguments=“--limit@/home/user/playbook.retry”
替换为
resume.limit=“@/home/user/playbook.retry”
以使其正常工作。原因是
流浪规定
似乎使用
'default'
作为限制,如果没有其他配置。每当我在流浪文件中放入任何一种恢复时,我都会得到“未定义的局部变量或方法'resume'”。在Ubuntu上使用Vagrant 1.9.4。我可以使用“ansible playbook--private key=~/.vagrant.d/unsecure\u private\u key-u vagrant-I.vagrant/provisioners/ansible/inventory/vagrant\u ansible\u inventory setup.yml”再次运行ansible playbook,前提是我没有使用config.ssh.insert\u key=false设置框“我不太清楚你为什么要这样做,因为Ansible剧本应该是幂等的,所以从一开始就重新运行整个过程应该是完全好的。”即使是一个中等大小的剧本,你也可以等待15分钟,然后再开始第一个更改的任务。在大量编排工作中,重试非常有用。