ansible任务暂停wait_for

时间:2023-02-15 11:18:59

一、概述

任务暂停
有些情况下,一些任务的运行需要等待一些状态的恢复,比如某一台主机或者应用刚刚重启,我们需要需要等待它上面的某个端口开启,
此时就需要将正在运行的任务暂停,直到其状态满足要求。

Ansible提供了wait_for模块以实现任务暂停的需求
wait_for模块常用参数:

connect_timeout:在下一个任务执行之前等待连接的超时时间
delay:等待一个端口或者文件或者连接到指定的状态时,默认超时时间为300秒,在这等待的300s的时间里,wait_for模块会一直轮询指定
的对象是否到达指定的状态,delay即为多长时间轮询一次状态。
host:wait_for模块等待的主机的地址,默认为127.0.0.1
port:wait_for模块待待的主机的端口
path:文件路径,只有当这个文件存在时,下一任务才开始执行,即等待该文件创建完成
state:等待的状态,即等待的文件或端口或者连接状态达到指定的状态时,下一个任务开始执行。当等的对象为端口时,状态有started,
stoped,即端口已经监听或者端口已经关闭;当等待的对象为文件时,状态有present(存在)或者started,absent(不存在),即文
件已创建或者删除;当等待的对象为一个连接时,状态有drained,即连接已建立。默认为started
timeout:wait_for的等待的超时时间,默认为300秒

二、案例

- hosts: test_server
remote_user: root
gather_facts: no
tasks:
- name: kevin_test
local_action:
module: wait_for #模块名字
port: 2379
host: 172.16.60.241
delay: 10
timeout: 300
state: started
#使用local_action配合wait_for模块来完成任务的暂停操作。
#上面配置说明kevin_test任务每隔10s检查指定主机上的2379端口是否开启,如果操作300s,2379端口任未开启,将返回失败信息。

#上面host指定了一台机器,如果是需要指定多台机器呢?
#可以将执行的多台机器放在一台新group内,然后通过变量去指定group。
- hosts: test_server
remote_user: root
gather_facts: no
tasks:
- name: kevin_test
local_action:
module: wait_for
port: 2379
host: "{{item}}"
delay: 10
timeout: 300
state: started
with_items: "{{groups['kevin_server']}}"
#如上面配置,每间隔10s检查指定的kevin_server组内的主机的2379端口是否开启,
#如果操作300s,2379端口没开启,则返回失败信息。
#注意:上面的"with_items"这一项配置要和"local_action"对齐!!否则会报错!

#等待8080端口已正常监听,才开始下一个任务,直到超时
- wait_for:
port: 8080
state: started

#等待8000端口正常监听,每隔10s检查一次,直至等待超时
- wait_for:
port: 8000
delay: 10

#等待8000端口直至有连接建立
- wait_for:
host: 0.0.0.0
port: 8000
delay: 10
state: drained

#等待8000端口有连接建立,如果连接来自10.2.1.2或者10.2.1.3,则忽略。
- wait_for:
host: 0.0.0.0
port: 8000
state: drained
exclude_hosts: 10.2.1.2,10.2.1.3

#等待/tmp/foo文件已创建
- wait_for:
path: /tmp/foo

#等待/tmp/foo文件已创建,而且该文件中需要包含completed字符串
- wait_for:
path: /tmp/foo
search_regex: completed

#等待/var/lock/file.lock被删除
- wait_for:
path: /var/lock/file.lock
state: absent

#等待指定的进程被销毁
- wait_for:
path: /proc/3466/status
state: absent

#等待openssh启动,10s检查一次
- wait_for:
port: 22
host: "{{ ansible_ssh_host | default(inventory_hostname) }}" search_regex: OpenSSH
delay: 10