如何防止两个ansible作业在同一台机器上运行?

如何防止两个ansible作业在同一台机器上运行?,ansible,Ansible,为了避免意外,我想实现一个解决方案,防止并发部署到同一个目标主机 请记住,我们不想妨碍从我们自己的机器而不是集中管理服务器进行部署的能力 我们只是想确保我们不会同时做同样的事情。您可以检查文件并将文件放到您执行的主机上: tasks: - stat: path=.ansible_lock_file register: lock_file_check - fail: msg="ansible is already being run against this ho

为了避免意外,我想实现一个解决方案,防止并发部署到同一个目标主机

请记住,我们不想妨碍从我们自己的机器而不是集中管理服务器进行部署的能力


我们只是想确保我们不会同时做同样的事情。

您可以检查文件并将文件放到您执行的主机上:

 tasks:    
   - stat: path=.ansible_lock_file
     register: lock_file_check

   - fail: msg="ansible is already being run against this host"
     when: lock_file_check.stat.exists

   - file: path=.ansible_lock_file state=touch`
并在剧本末尾将其删除

   - file: path=.ansible_lock_file state=touch

虽然锁文件是一种技术解决方案,但我想提出一种文化解决方案:一种发音化的“部署锁”

许多开发团队都有一个内部聊天频道,在那里他们协调发布;bot显示当前正在进行的任何发布的状态,开发人员在准备部署时会提到。有时,这有点正式化,机器人也会跟踪谁拥有锁,甚至保持排队等待锁的人


你可以和你的运营团队做同样的事情。这比依赖您编写的代码来确保正确性要容易得多,更重要的是,它有助于让每个人都保持在同一个页面上——对于更多的聊天系统,它会自动提供更改内容的日志。

虽然还没有完整的答案,但我的印象是,优雅的解决方案是编写一个实现该功能的回调插件

不过,我不确定回调API是否允许我注入一些额外的任务来运行、访问ansible变量或在某些情况下中止播放


良好的开端,但它缺少一个关键部分:如果剧本未能完全运行,那么它将惨遭失败。也,如果能够在无需重复代码的情况下实现所有playbook,这将非常有帮助。您可以使用处理程序来防止其挂起,并使用包含文件使其在playbook中可重用。为此,您可以使用Ansible 2.0中的新rescue方法:我们已经在某些部署中实现了该方法,但这对其他部署不起作用CD的。想象一下,几乎每一次更改都会触发到测试环境的部署,这种情况每小时甚至可能发生10次。因此,我们最终只说出了一些部署作业(通过ansible slack模块)。