Ansible的异步行动和轮询

265 阅读2分钟

问题陈述

异步行动和轮询:假设你有一组3台服务器,你运行Ansible playbook。Ansible playbook包含2个任务,假设任务1将在2台服务器上运行,但它需要时间在第三台服务器上运行,那么,任务1或任务2会发生什么。

解决方案声明

Ansible的默认工作方式是同步运行,它保持着与远程节点的连接,直到动作完成。Ansible基本上会评估每个任务的结果,并在verbose上告诉自己。

就像下面这样,显示有多少是OK的,这意味着已经存在或OK,有多少东西你用你的playbook改变了,有多少是失败的等等:

默认情况下,如果某些循环或某些任务失败,ansible playbook就会自己停止。

现在根据问题,任务1在服务器1和2上运行,但在第三台服务器上失败,那么下一个任务和任务1在第三台服务器上会发生什么。

解决方案是你如何编写你的任务。
所以默认情况下,如果任务失败,游戏会被中止。

一个解决方案是通过在你的任务中添加ignore errors : yes来忽略失败的任务。

或者你可以设置强制处理程序,在一个任务失败时进行某种操作。现在我们的问题是,在服务器3上运行需要时间,但这并不是一个失败。

所以我们知道ansible是同步运行的,这意味着如果任务1没有完成,任务2就不会运行。

为了避免这种情况,你可以使用所谓的ansible playbook的异步模式,基本上是为了避免连接超时和避免阻塞后续任务。

你可以设置poll的值,你的异步playbook会相应地运行。

异步 - 最佳解决方案是Ansible异步模式。

  • 最好的解决方案是用async和poll=0来运行playbook。

  • 这将使Ansible启动任务1,并在不等待其失败或完成的情况下,移动到任务2。

  • playbook会在不检查异步任务的情况下结束。

  • 为了避免这种情况,你可以在一个变量中注册它的输出,并在以后使用它来完成一个条件,直到:job_result. finished

异步运行的有用技巧:

对于较长的超时,设置正的poll值, 设置poll=5为5秒。尽量避免超时,指定最大运行时间,

还要指定你想轮询状态的频率, 对于较长的超时,设置正的轮询值。 非同步时间限制没有默认值, 要同时运行任务,请使用poll:0。