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

Jav*_*ano 13 vagrant ansible vagrantfile

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

我正在开始

vagrant provision
Run Code Online (Sandbox Code Playgroud)

yda*_*coR 18

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

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

PLAY RECAP ******************************************************************** 
           to retry, use: --limit @/home/user/playbook.retry
Run Code Online (Sandbox Code Playgroud)

如果你直接在盒子上,你可以运行以下内容:

ansible-playbook playbook.yml --limit @/home/user/playbook.retry
Run Code Online (Sandbox Code Playgroud)

要使其作为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
Run Code Online (Sandbox Code Playgroud)

正如Vagrantfile的评论中所指出的那样,这将尝试运行playbook.ymlplaybook和playbook.retry在第一次失败的运行中创建的重试游戏vagrant up.如果playbook.yml失败则会自动尝试并恢复(并且可能会失败,因为您尚未解决失败的原因)然后退出.

然后,您可以修复您的剧本或库存中需要修复的内容,然后运行vagrant provision --provision-with resume以运行调用的调配块resume,以便playbook.yml在最初调配实例时从失败的地方获取.

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

  • "我不太确定你为什么要这样做,因为Ansible剧本应该是幂等的,因此从一开始就重新运行整个事情应该是完全没问题的." 即使使用适度大小的剧本,您也可以等待15分钟才能完成第一个更改的任务.对于大型协调工作,重试非常有用. (5认同)
  • 与ansible 1.9.2和vagrant 1.7.4在macos上它不能正常工作,用`resume.limit ="替换`resume.raw_arguments =" - limit @/home/user/playbook.retry"` home/user/playbook.retry"`让它工作.原因是,如果没有另外配置,`vagrant provision`似乎使用''default'`作为限制. (2认同)