一、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参数值 代表了任务异步执行时轮询的时间间隔。
Ansible常用功能说明 [异步、并发、委托、暂停、超时等]
原文:https://www.cnblogs.com/kevingrace/p/11647338.html