如何在双节点集群 docker 容器部署中使用 wait_for?

How to use wait_for in a two node cluster docker container deployment?

我有一个包含两台机器的集群。我有一本剧本 运行 每个 docker 容器:

---
- hosts: machines_in_the_cluster

  tasks:
  - name: Run app container
    docker:
      name: "name"
      image: whatever:1.0
      pull: always
      state: reloaded
      ports:
      - "8080:8080"

它在每台机器上启动一个 tomcat 服务器。但是我不想在第二台机器上执行任务,直到第一台机器完成启动 tomcat.

我该如何解决?是否有任何类型的通过 http 进行的健康检查?有没有使用wait_for的解决方案?

您可以 运行 serial mode 中的整个剧本,以确保 Ansible 在移动到另一组主机之前完成针对主机子集的整个剧本。

您只需将 serial 参数添加到剧本中即可完成此操作,如下所示:

---
- hosts: machines_in_the_cluster

  serial: 1

  tasks:
  - name: Run app container
    ...

您可以指定一次要执行的主机的绝对数量(上面的示例一次只执行一个)或可用主机的百分比。 运行 这个:

- hosts: machines_in_the_cluster

  serial: 50%

  tasks:
  - name: Run app container
    ...

当目标组中有 5 个主机时,将 运行 3 次,针对前 2 个主机,第二个 2 个主机,最后是最后一个主机。

我已经通过添加等待 tomcat 启动的任务解决了这个问题:

  - name: Wait for server startup
    local_action: wait_for host={{inventory_hostname}} port={{port}} timeout=50 delay=10

这将等待 10 秒,什么都不做,然后开始轮询以检查端口是否可用。如果达到超时,任务将失败。

我还在剧本中添加了 serial: 1(正如 ydaetskcoR 提到的),以便 运行 后续任务