Ansible中的并发和异步

437次阅读
没有评论

共计 1303 个字符,预计需要花费 4 分钟才能阅读完成。

Ansible中的并发和异步

用ansible批量操作节点过程中,如果节点过多,成百上千的话,此时我们再执行任务的时候,则需要分批次去灰度执行,比如100台则均分10台共10批次去执行。对于ansible中tasks的执行顺序是:先再第一个批次节点中执行task1,然后第二个批次节点执行task1,以此类推至所有节点完成task1后回到第一批次执行task2…….

并发

ansible中默认并发数为5,则同时只有5个节点在执行,如果指定则可以通过serial参数来控制

[root@ansible-manager ~]# cat /etc/ansible/test.yml
- hosts : all
  # 并发10个节点
  serial: 10
  # 控制任意task在多少节点中失败百分比,一旦达到则终端任务,否则继续下一个节点进行该task
  max_fail_percentage: 30

  tasks :
    - name: Install nginx
      yum: name=nginx state=installed

异步

默认ansible执行任务时同步的,每个执行到一个task,则节点会将task产生的输出实时反馈会控制节点。如果我们有如下任务:

  • 长时间任务,有可能超时
  • 运行节点众多
  • 无需任务的反馈

此时可以使用ansible中的参数async和poll两个参数来控制

  • async:表示这个step的最长等待时长, 如果设置为0, 表示一直等待下去直到动作完成
  • poll:表示检查step操作结果的间隔时长

示例一

异步任务,5秒超时,每两秒轮询任务状态。任务运行最终会失败

[root@ansible-manager ~]# cat /etc/ansible/test.yml
- hosts : all
  tasks :
    - name : test sleep
      shell : sleep 10
      # 任务超时5秒
      async : 5
      # 每两秒轮询获取一次任务状态
      poll : 2

示例二

异步任务,12秒超时,每5秒轮询任务状态。任务运行最终会成功,但是结果会在15秒后返回

[root@ansible-manager ~]# cat /etc/ansible/test.yml
- hosts : all
  tasks :
    - name : test sleep
      shell : sleep 11
      # 任务超时5秒
      async : 12
      # 每5秒轮询获取一次任务状态
      poll : 5

示例三

异步任务,12秒超时,配置0秒轮询,则代表不轮询,不关心任务状态,直接进入下一个任务。任务运行最终会成功,同时进入下一个任务处理中。此处用async_status来获取指定任务id的结果

[root@ansible-manager ~]# cat /etc/ansible/test.yml             
- hosts : all
  tasks :
    - name : test sleep
      shell : sleep 11
      async : 12
      poll : 5
      register: test_status

    - name: 'check test sleep task polling results'
      async_status: jid={{ test_status.ansible_job_id }}
      register: job_result
      until: job_result.finished
      retries: 15

正文完
 
xadocker
版权声明:本站原创文章,由 xadocker 2020-02-24发表,共计1303字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)