ansible 并发与异步中一些小细节

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.retry

PLAY 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 : 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  

假如我们的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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值