1. ansible的异步
ansible 执行等待时间很长的操作, 这个操作可能要持续很长时间, 设置超过ssh的timeout. 这时候你可以在step中指定async 和 poll 来实现异步操作
async 表示这个step的最长等待时长, 如果设置为0, 表示一直等待下去直到动作完成.
poll 表示检查step操作结果的间隔时长.
root@ansible:/etc/ansible/playbooks# cat test_bingfa.yml - hosts : testgroups tasks : - name : test bingfa he yi bu shell : sleep 10#async 上述shell命令的等待时间,设置为0时会一直等待命令结束 async : 5#poll 检查step操作结果的间隔时长,设置为0表示 不用等待结果,继续做下面的操作,我们可以在下面的step中来验证这个命令是否成功执行. poll : 1
如图中所示,需要异步的时候我们设置poll为0,不用等待结果,立即执行下一个step
root@ansible:/etc/ansible/playbooks# ansible-playbook test_bingfa.yml PLAY [testgroups] ************************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [test1]TASK [test bingfa he yi bu] **************************************************************************************************************************************************************************************fatal: [test1]: FAILED! => {"changed": false, "failed": true, "msg": "async task did not complete within the requested time"} to retry, use: --limit @/etc/ansible/playbooks/test_bingfa.retryPLAY RECAP *******************************************************************************************************************************************************************************************************test1 : ok=1 changed=0 unreachable=0 failed=1
上图执行失败,因为超时,因为我们的命令是sleep 10秒 但是程序只等待5秒。
当我们把poll改成0
root@ansible:/etc/ansible/playbooks# cat test_bingfa.yml - hosts : testgroups tasks : - name : test bingfa he yi bu shell : sleep 10#async 上述shell命令的等待时间,设置为0时会一直等待命令结束 async : 5#poll 检查step操作结果的间隔时长,设置为0表示 不用等待结果,继续做下面的操作,我们可以在下面的step中来验证这个命令是否成功执行. poll : 0
root@ansible:/etc/ansible/playbooks# ansible-playbook test_bingfa.yml PLAY [testgroups] ************************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [test1]TASK [test bingfa he yi bu] **************************************************************************************************************************************************************************************changed: [test1]PLAY RECAP *******************************************************************************************************************************************************************************************************test1 : ok=2 changed=1 unreachable=0 failed=0
可以看出,命令是推送成功了,为什么说推送,因为我们并没有等待命令结束,只是把命令推到客户端,我们可以用其他的方式去检测我们的命令是否成功
2. ansible如何限制并发
当我们的组里有很多机器,我们需要限制一下并发的时候,这个功能可以在ansible.cfg里修改配置,也可以在playbook中限制服务端的并发数量,我们需要用到关键的一个功能
serial
root@ansible:/etc/ansible/playbooks# cat test_bingfa.yml - hosts : testgroups serial : 5 tasks : - name : test bingfa he yi bu shell : sleep 10#async 上述shell命令的等待时间,设置为0时会一直等待命令结束 async : 5#poll 检查step操作结果的间隔时长,设置为0表示 不用等待结果,继续做下面的操作,我们可以在下面的step中来验证这个命令是否成功执行. poll : 0root@ansible:/etc/ansible/playbooks# ansible-playbook test_bingfa.yml PLAY [testgroups] ************************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [test1]TASK [test bingfa he yi bu] **************************************************************************************************************************************************************************************changed: [test1]PLAY RECAP *******************************************************************************************************************************************************************************************************test1 : ok=2 changed=1 unreachable=0 failed=0
假如我们的testgroups里有100台机器,那么我们使用serial 来限制并发数量,意思就是一次只执行5台,一直到100台完成。
当然我们还可以加上一些类似控制流的东西max_fail_percentage
root@ansible:/etc/ansible/playbooks# ansible-playbook test_bingfa.yml PLAY [testgroups] ************************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [test1]TASK [test bingfa he yi bu] **************************************************************************************************************************************************************************************changed: [test1]PLAY RECAP *******************************************************************************************************************************************************************************************************test1 : ok=2 changed=1 unreachable=0 failed=0 root@ansible:/etc/ansible/playbooks# cat test_bingfa.yml - hosts : testgroups max_fail_percentage : 50 serial : 5 tasks : - name : test bingfa he yi bu shell : sleep 10#async 上述shell命令的等待时间,设置为0时会一直等待命令结束 async : 5#poll 检查step操作结果的间隔时长,设置为0表示 不用等待结果,继续做下面的操作,我们可以在下面的step中来验证这个命令是否成功执行. poll : 0
当这5台里有一半的机器失败了,那么就终止task,很好用的东西。
3.ansible的委托
其实我一直觉得这个功能没啥子用,基本没用过。。。但是还是说说 delegate_to 就是指定一个机器去完成task,,,额。。。。。感觉很鸡肋