2017-07-27 79 views
0

我有一个构建服务器,在每次提交给定的剧本存储库后,都会运行合理的剧本。主机数据来自动态库存。我现在遇到的问题是,当我推送多个提交时,构建服务器会为相同的主机运行ansible-playbook,并在主机服务器上创建争用条件。我如何才能让正在运行的剧本完成,然后在主机上运行剧本时启动或完全不运行? (我只需要在主机上运行一个实例)制作剧本只为给定主机运行剧本

+0

你如何触发构建服务器来运行可靠的剧本? – kfreezy

+0

@kfreezy我使用[Phabricator](https://secure.phabricator.com/book/phabricator/article/harbormaster/#triggering-builds),你可以在提交时触发构建。问题是当你同时推送多个提交时。有没有办法确保只有一个实例正在运行? – Pouyan

+0

你可以为ansible-playbook编写包装shell脚本,或者修改ansible-playbook python文件来检查其他进程,但这看起来像是一个糟糕的解决方案。你最好在你的CD服务器上设置一些构建队列。 –

回答

1

在启动剧本运行之前,您可以检查远程服务器的安全pid。你使用的是什么操作系统/发行版? 嗯..取决于你测试的是什么,你可以启动一个容器(docker或lxd)来测试每个提交的环境。考虑到如果您创建/修改网络接口或创建设备文件,它不会满足您的需求。 我使用这种方法来测试我的剧本角色只有一个服务器有几个单元测试每个角色参数。

+0

我们正在运行SuSE。使用容器不是我们系统的选择。有另一种方法可以找出远程主机上正在运行的安全吗? 我发现[this](https://stackoverflow.com/questions/35176944/),但似乎没有一个答案是有用的。 – Pouyan

+0

如果容器不是您想要的,您可以随时创建一个挂载名称空间和pivot_root到该名称空间。容器的想法只是分隔命名空间。您仍然可以使用名称空间(7)来实现相同的功能。不过你的内核需要大于等于3.11。 反正,ps awfx | grep ansible,或者检查pid文件? – clvx