我有一台有两台机器的集群。我有一个剧本在每个人中运行一个码头工人:
---
- 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的解决方案?
答案 0 :(得分:1)
您可以在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台主机,最后是最后一台主机。
答案 1 :(得分:0)
我通过添加一个等待tomcat启动的任务来解决它:
- name: Wait for server startup
local_action: wait_for host={{inventory_hostname}} port={{port}} timeout=50 delay=10
这将等待10秒无所事事,然后将开始轮询以检查端口是否可用。如果达到超时,任务将失败。
我还在剧本中添加了serial: 1
(作为ydaetskcoR提及),以便随后运行任务