共计 1303 个字符,预计需要花费 4 分钟才能阅读完成。
用ansible批量操作节点过程中,如果节点过多,成百上千的话,此时我们再执行任务的时候,则需要分批次去灰度执行,比如100台则均分10台共10批次去执行。对于ansible中tasks的执行顺序是:先再第一个批次节点中执行task1,然后第二个批次节点执行task1,以此类推至所有节点完成task1后回到第一批次执行task2…….
并发
ansible中默认并发数为5,则同时只有5个节点在执行,如果指定则可以通过serial参数来控制
[root@ansible-manager ~]# cat /etc/ansible/test.yml
- hosts : all
# 并发10个节点
serial: 10
# 控制任意task在多少节点中失败百分比,一旦达到则终端任务,否则继续下一个节点进行该task
max_fail_percentage: 30
tasks :
- name: Install nginx
yum: name=nginx state=installed
异步
默认ansible执行任务时同步的,每个执行到一个task,则节点会将task产生的输出实时反馈会控制节点。如果我们有如下任务:
- 长时间任务,有可能超时
- 运行节点众多
- 无需任务的反馈
此时可以使用ansible中的参数async和poll两个参数来控制
- async:表示这个step的最长等待时长, 如果设置为0, 表示一直等待下去直到动作完成
- poll:表示检查step操作结果的间隔时长
示例一
异步任务,5秒超时,每两秒轮询任务状态。任务运行最终会失败
[root@ansible-manager ~]# cat /etc/ansible/test.yml
- hosts : all
tasks :
- name : test sleep
shell : sleep 10
# 任务超时5秒
async : 5
# 每两秒轮询获取一次任务状态
poll : 2
示例二
异步任务,12秒超时,每5秒轮询任务状态。任务运行最终会成功,但是结果会在15秒后返回
[root@ansible-manager ~]# cat /etc/ansible/test.yml
- hosts : all
tasks :
- name : test sleep
shell : sleep 11
# 任务超时5秒
async : 12
# 每5秒轮询获取一次任务状态
poll : 5
示例三
异步任务,12秒超时,配置0秒轮询,则代表不轮询,不关心任务状态,直接进入下一个任务。任务运行最终会成功,同时进入下一个任务处理中。此处用async_status来获取指定任务id的结果
[root@ansible-manager ~]# cat /etc/ansible/test.yml
- hosts : all
tasks :
- name : test sleep
shell : sleep 11
async : 12
poll : 5
register: test_status
- name: 'check test sleep task polling results'
async_status: jid={{ test_status.ansible_job_id }}
register: job_result
until: job_result.finished
retries: 15
正文完