Ansible常用功能说明 [异步、并发、委托、暂停、超时等]
时间:2019-10-10 13:45:33
收藏:0
阅读:1502
一、Ansible的异步和轮询
Ansible有时候要执行等待时间很长的操作,这个操作可能要持续很长时间,设置超过ssh的timeout。这种情况下可以选择在step中指定async和poll来实现异步操作。其中:async:表示这个step的最长等待时长, 如果设置为0, 表示一直等待下去直到动作完成;poll:表示检查step操作结果的间隔时长。
ansible默认的清单文件是/etc/ansible/hosts,也就是ansible和ansible-ploybook执行时默认读的清单文件。这个可以自行定义。
[root@hostname ~]# cat /etc/ansible/ansible.cfg|grep inventory
#inventory = /etc/ansible/hosts
[root@hostname ~]# cat /etc/ansible/hosts|tail -2
[test_server] #组名最好不要使用"-",可以使用"_"
172.16.60.241
1)先来看下面初始配置
[root@hostname ~]# cat /etc/ansible/test.yml
- hosts : test_server
tasks :
- name : ansible-test
shell : sleep 10
#async表示上述shell命令的等待时间,设置为0时会一直等待命令结束
async : 5
#poll表示检查step操作结果的间隔时长,设置为0表示 不用等待结果,继续做下面的操作,我们可以在下面的step中来验证这个命令是否成功执行.
poll : 2
执行下看看是否成功:
[root@hostname ~]# ansible-playbook /etc/ansible/test.yml
PLAY [test_server] *******************************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************************
ok: [172.16.60.241]
TASK [ansible-test] ******************************************************************************************************************************
fatal: [172.16.60.241]: FAILED! => {"changed": false, "msg": "async task did not complete within the requested time - 5s"}
PLAY RECAP ***************************************************************************************************************************************
172.16.60.241 : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
如上,这个step失败, 因为ansible的任务(就是上面配置中的shell动作)操作时间(10s)超过了最大等待时长(5s)
2)如果将上面的async异步等待时间设置为大于10s,比如12s,则执行就成功了!
[root@hostname ~]# cat /etc/ansible/test.yml
- hosts : test_server
tasks :
- name : ansible-test
shell : sleep 10
#async表示上述shell命令的等待时间,设置为0时会一直等待命令结束
async : 12
#poll表示检查step操作结果的间隔时长,设置为0表示 不用等待结果,继续做下面的操作,我们可以在下面的step中来验证这个命令是否成功执行.
poll : 2
[root@hostname ~]# ansible-playbook /etc/ansible/test.yml
PLAY [test_server] *******************************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************************
ok: [172.16.60.241]
TASK [ansible-test] ******************************************************************************************************************************
changed: [172.16.60.241]
PLAY RECAP ***************************************************************************************************************************************
172.16.60.241 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
这时候就不怕任务超时了。可以执行一个12s的任务(大于上面shell执行的时间)。另外,如果poll为0,就相当于一个不关心结果的任务。
3)或者将上面的poll数值设置为0,即不用等待ansible任务执行的结果,立即执行下一个step。
即只需要将任务命令推送到ansible客户机上,不需要等待任务执行完成就立即执行下一个step。
[root@hostname ~]# cat /etc/ansible/test.yml
- hosts : test_server
tasks :
- name : ansible-test
shell : sleep 10
#async表示上述shell命令的等待时间,设置为0时会一直等待命令结束
async : 5
#poll表示检查step操作结果的间隔时长,设置为0表示 不用等待结果,继续做下面的操作,我们可以在下面的step中来验证这个命令是否成功执行.
poll : 0
[root@hostname ~]# ansible-playbook /etc/ansible/test.yml
PLAY [test_server] *******************************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************************
ok: [172.16.60.241]
TASK [ansible-test] ******************************************************************************************************************************
changed: [172.16.60.241]
PLAY RECAP ***************************************************************************************************************************************
172.16.60.241 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
4)如果还想要更方便地看轮询结果,ansible还提供了这个模块async_status。
[root@hostname ~]# cat /etc/ansible/test.yml
- hosts : test_server
tasks :
- name : ansible-test
shell : sleep 3
async : 8
poll : 2
register: kevin_result
- name: ‘check ansible-test task polling results ‘
async_status: jid={{ kevin_result.ansible_job_id }}
register: job_result
until: job_result.finished
retries: 10
[root@hostname ~]# ansible-playbook /etc/ansible/test.yml
PLAY [test_server] *******************************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************************
ok: [172.16.60.241]
TASK [ansible-test] ******************************************************************************************************************************
changed: [172.16.60.241]
TASK [check ansible-test task polling results] ***************************************************************************************************
changed: [172.16.60.241]
PLAY RECAP ***************************************************************************************************************************************
172.16.60.241 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
第一个job执行异步任务sleep,并且注册了一个名字叫kevin-result的register变量,用于提供给第二个job作为轮询对象,并且它自己poll设为2 (即自己轮询2次)。
register用于在ansible的playbook中task之间的相互传递变量,
register 这个功能非常有用。当我们需要判断对执行了某个操作或者某个命令后,如何做相应的响应处理(执行其他 ansible 语句),则一般会用到register 。
until表示循环。
第二个job使用async_status模块,进行轮询并返回轮询结果。准备检查10次。
async参数值 代表了这个任务执行时间的上限值。即任务执行所用时间如果超出这个时间,则认为任务失败。此参数若未设置,则为同步执行。
poll参数值 代表了任务异步执行时轮询的时间间隔。
原文:https://www.cnblogs.com/kevingrace/p/11647338.html
评论(0)