直播笔记-使用async和poll加速playbook运行

点击上方蓝字⭐️关注“DevOps云学堂”,接收最新技术实践

5d95896c87e082bf81b17feb12d10c60.gif

3月28日晚上8:00 

分享《使用Kustomize管理Kubernetes清单》 

点击下方预约按钮,预约直播7f592dfe38b2ce95cf1de83015264350.png

上期直播回放,可以通过视频号观看

今天是「DevOps云学堂」与你共同进步的第 5 

关注公众号,回复 devops,免费加入DevOps学习群

获得问题解析、DevOps解决方案指导5c47eaa0c860a3368ff9b51b6697de28.png

7f6d2a6e068ec5d64a675b2f7a40e226.jpeg

Ansible是一种自动化工具,用于管理和配置计算机系统和网络设备。它允许管理员通过编写用于描述系统配置的YAML语言的Playbook来自动化部署,配置和管理系统。Ansible使用SSH通信协议,并且不需要在被管理的计算机上安装客户端或管理代理程序,使其更加轻便易用。它可以用于管理任何数量的节点,从小型服务器到大型企业网络。Ansible也支持通过与其他工具(例如Puppet,Chef等)以及云平台(例如AWS,Google Cloud等)集成来扩展其功能。

DevOps中ansible的应用场景

Ansible在DevOps生命周期中充当了很多角色,如持续交付,自动化,配置管理,测试等。

  • 自动化部署:使用Ansible可以快速自动化地部署和配置应用程序。它可以轻松地实现从代码仓库到生产环境的自动化流程。

  • 应用程序配置管理:可以使用Ansible来管理应用程序配置。它提供了一个简单易用的系统来组织和维护各种配置文件,以及简化应用程序升级和回滚。

  • 系统配置管理:使用Ansible可以管理系统级别的配置,如系统软件,安全性,网络配置等,并可以允许管理用户和权限。

  • 远程执行任务:使用Ansible可以轻松地完成远程任务,例如收集服务器信息或在大量服务器上执行任务。

  • 自动化测试环境:可以使用Ansible来自动化测试环境的搭建和配置,允许测试人员轻松地部署和测试应用程序和服务。

问题描述

默认情况下,Ansible 同步运行任务,保持与远程节点的连接打开,直到操作完成。这意味着在 playbook 中,默认情况下每个任务都会阻塞下一个任务,这意味着后续任务将在当前任务完成之前不会运行。根据设计,Ansible是一个接一个地运行任务,这会保持与远程节点的连接打开,直到当前运行的任务完成。由于这种行为,所有后续任务都将被阻止。对于 DevOps 工程师来说,这不是理想的情况,因为他运行的Playbook包含一些任务,这些任务需要比 SSH 会话允许的更长的时间才能完成。这最终会导致超时。
此类任务的几个例子是:

  • 重新启动客户端并等待它重新来运行进一步的任务

  • 执行需要较长时间运行的脚本

  • 长时间运行的 shell 命令或软件升级

这种情况的解决方案是——Ansible的异步模式。

什么是异步模式?

异步模式允许我们通过定义长时间运行的任务完成执行的方式来控制playbook的执行流程。
要在 Ansible Playbook中启用异步模式,我们需要使用一些参数,例如async, poll。
async:关键字的值表示允许完成任务的总时间。async 选项允许将一个或多个任务转换为异步模式执行,这允许 Ansible 在后台执行任务并立即返回控制权给用户,而不必等待任务完成。一旦该时间结束,无论最终结果如何,任务都将被标记为已完成。与此同时,async还会在后台发送任务,稍后可以验证其最终执行状态。
poll:允许我们跟踪在后台调用和运行的作业的状态,它的值决定了检查后台任务是否完成的频率。如果任务执行时间超过了 async 指定的时间,则任务将被标记为失败。

设置更长的超时限制

如果您想为playbook中的某个任务设置更长的超时限制,请将async和poll 设置为正值。Ansible 仍会阻止Playbook中的下一个任务,等待异步任务完成、失败或超时。但是,任务只有在超过async参数设置的超时限制时才会超时。

- name: example playbook
  hosts: all
  tasks:
    - name: first task sleep 10
      shell: sleep 10
      async: 5
      poll: 3

    - name: second task sleep 5
      shell: sleep 5

上面的示例中,async 选项设置为 5,这意味着 Ansible 将命令转换为异步模式,并且等待最多 5秒来执行该命令。poll 选项设置检查任务执行状态的频率,也就是说,Ansible 将在每个 poll 的时间间隔内检查操作是否完成。默认情况下,每 10 秒钟检查一次,可以通过 poll 选项来调整该值。如果 任务执行时间超过了 async 指定的时间,则任务将被标记为失败。
cfe9f206ea5cdde8f60ea4525ecf47a5.png

第一个任务失败,因为任务没有在请求的async=5 秒时间内完成。让我将async的值增加到 20 秒并再次执行playbook。
8cb7c85a91df84ef8563c2a9ee4bbbad.png

异步运行任务

正如上面提到的,将Ansible 的poll值设置为整数会阻止您的playbook中的下一个任务。为了避免这种情况并继续我们的下一个任务,我们可以将poll值设置为0。这称为Fire and Forget运行playbook的方式。
如果你想在playbook中同时运行多个任务,请使用async和poll设置为0。当你设置poll为0时,Ansible 启动任务并立即移动到下一个任务而不等待结果。每个异步任务都会运行,直到它完成、失败或超时(运行时间超过其值)。

- name: example playbook
  hosts: all
  tasks:
    - name: first task sleep 10
      shell: sleep 10
      async: 20
      poll: 0

    - name: second task sleep 5
      shell: sleep 5

这个Ansible playbook包括两个任务:

  1. 第一个任务名为“first task sleep 10”,在其中执行shell命令“sleep 10”,代表需要等待10秒。传递了async参数来告诉Ansible将该任务设置为异步并在后台运行,它将返回任务标识符。

  2. 第二个任务名为“second task sleep 5”,在其中执行shell命令“sleep 5”,代表需要等待5秒。

c5b1ebc7b66b1e4264fe2feffbff728a.png
从上面的输出可以看出,Ansible 没有等待第一个任务完成就直接运行了第二个任务。如需检查任务状态:

async $ ansible all -m async_status -a "jid=JID" -b -kK

使用async_status

aync_status模块也可以在剧本中使用。如果你需要一个异步任务的同步点,你可以注册它来获取它的作业ID,并在以后的任务中使用async_status模块来观察它。例如:

- name: example playbook
  hosts: all
  tasks:
    - name: first task sleep 10
      shell: sleep 10
      async: 20
      poll: 0
      register: first_task_status

    - name: second task sleep 5
      shell: sleep 5

    - name: until_async_status
      async_status:
        jid: "{{ first_task_status.ansible_job_id}}"
      register: job_result
      until: job_result.finished

总结

async 和 poll 选项一起使用时,可以解决以下问题:

  • 长时间运行的任务,这时候就需要使用 async 和 poll 进行异步操作,以免占用太多的资源或者造成阻塞。

  • 在有些情况下,即使命令、脚本或操作已经完成,但 Ansible playbook 还是会停止执行并等待命令返回。这时候也可使用异步操作,以免 playbook 阻塞,提高效率。

总之,async 和 poll 是 Ansible Playbook 中强大的选项,能够帮助管理者在异步任务中提高 Ansible Playbook 的可靠性和效率。


往期推荐

实践-Jenkins 声明式管道中的动态并行阶段

直播笔记 - 使用Terragrunt优化Terraform代码

实践:基于Azure部署Jenkins服务并开发MERN应用的CI/CD构建管道

基础设施即代码 - 使用Terraform创建AWS EC2实例并部署Jenkins服务

演讲实录(文字+视频)| 使用Vault管理Jenkins凭据


如果这篇文章对您有帮助,欢迎转发点赞分享。您的关注是我持续分享的动力!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值