如何在双节点集群 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 提到的),以便 运行 后续任务
我有一个包含两台机器的集群。我有一本剧本 运行 每个 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 提到的),以便 运行 后续任务