【问题标题】:Make ansible-playbook run the playbook for the given host only once让 ansible-playbook 只为给定主机运行一次 playbook
【发布时间】:2017-07-27 14:59:00
【问题描述】:

我有一个构建服务器,它在每次提交给给定的剧本存储库后运行 ansible 剧本。主机数据来自动态清单。我现在遇到的问题是,当我推送多个提交时,构建服务器会为同一主机一个接一个地运行ansible-playbook,并在主机服务器上创建一个竞争条件。当主机上正在运行 playbook 时,如何让 ansible 等待正在运行的 playbook 完成然后启动或根本不运行? (我只希望在主机中运行一个 ansible 实例。)

【问题讨论】:

  • 如何触发构建服务器运行 ansible playbook?
  • @kfreezy 我使用 Phabricator ,您可以在提交时触发构建。问题是当您同时推送多个提交时。有没有办法确保只有一个 ansible 实例正在运行?
  • 您可以为 ansible-playbook 编写包装 shell 脚本或修改 ansible-playbook python 文件以检查其他进程,但这似乎是一个糟糕的解决方案。你最好在你的 CD 服务器上设置一些构建队列。
  • @KonstantinSuvorov 我对包装 ansible-playbook 也有同样的想法。但是队列似乎是一个很好的解决方案,直到主机被写入剧本并且我从外部不知道哪些主机被写入那里所以当我使用队列时,每个主机的每个剧本都应该等待,这使得合法构建的构建服务器非常慢。

标签: git build ansible


【解决方案1】:

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

【讨论】:

  • 我们正在运行 SuSE。使用容器不是我们系统的选项。是否有另一种方法可以找出远程主机上正在运行的 ansible?我找到了this,但似乎没有一个答案有用。
  • 如果容器不是您想要的,您始终可以创建一个挂载命名空间并将 pivot_root 指向该命名空间。容器的想法只是分离命名空间。您仍然可以仅使用命名空间 (7) 来实现相同的目的。不过,您的内核需要 >=3.11。无论如何,ps awfx | grep ansible,还是检查 pid 文件?。
猜你喜欢
  • 2021-01-17
  • 1970-01-01
  • 2023-02-25
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
相关资源
最近更新 更多