博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ansible 并发与异步中一些小细节
阅读量:7227 次
发布时间:2019-06-29

本文共 6115 字,大约阅读时间需要 20 分钟。

  hot3.png

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,,,额。。。。。感觉很鸡肋

 

转载于:https://my.oschina.net/jastme/blog/1499278

你可能感兴趣的文章
如何使用Mybatis第三方插件--PageHelper实现分页操作
查看>>
PyCharm搭建GO开发环境(GO语言学习第1课)
查看>>
Android交互
查看>>
提醒我喝水chrome插件开发指南
查看>>
列表数据转树形数据
查看>>
Java新版本的开发已正式进入轨道,版本号18.3
查看>>
从零开始的webpack生活-0x009:FilesLoader装载文件
查看>>
在electron中实现跨域请求,无需更改服务器端设置
查看>>
gitlab-ci配置详解(一)
查看>>
听说你叫Java(二)–Servlet请求
查看>>
案例分享〡三拾众筹持续交付开发流程支撑创新业务
查看>>
FreeWheel业务系统微服务化过程经验分享
查看>>
移动互联网下半场,iOS开发者如何“高薪”成长?
查看>>
Atlassian是怎样进行持续交付的?且听 Steve Smith一一道来
查看>>
Web Storage相关
查看>>
[PHP内核探索]PHP中的哈希表
查看>>
Apache-drill Architechture
查看>>
WordPress 5.2 Beta 3 发布,要求 PHP 5.6.20 以上版本
查看>>
通通连起来——无处不在的流
查看>>
互联网+时代,看云计算如何改变传统行业
查看>>