当前位置: 首页 > news >正文

Ansible最佳实践之Playbook管理滚动更新

写在前面


  • 理解不足小伙伴帮忙指正

傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波

Ansible的滚动更新

关于什么是滚动更新

通常,当Ansible运行play时,它会确保所有受管主机在启动任何主机进行下一个任务之前已完成每个任务。在所有受管主机完成所有任务后,运行通知的 handles 程序。

在所有主机上运行所有任务可能会导致意外行为。例如,在更新 Web 负载均衡器,如果同时更新所有Web服务器、可能会导致所有Web服务器停眼务。

Ansible支持滚动更新-一将一大批主机分批次更新,这样的好处:

  • 同一时刻只有部分服务器在更新,其他服务器仍然可以对外提供服务。
  • 如果这一批次服务器更新失败,其他服务器仍然可以对外提供服务。

所以一般建议在更新的剧本中配置:

  • 监视更新过程,测试更新结果。
  • 如果更新失败,隔离受影响的主机,以分析失败的部署,或者回滚受影响批次中主机配置。
  • 将部署结果发送给相关人员。

控制批处理大小

默认情况下,Ansible会在开始执行下一个任务之前,需要对Play中所有主机完成前一个任务。如果某一任务失败,则所有主机将只有一部分通过该任务。意味着任何主机都无法正常工作,可能会导致中断。理想情况下,在启动下一批主机之前,需要全部成功通过Play,如果有太多主机失败,则可以中止整个Play。

设置固定的批处理大小

在Play 中使用 serial 关键字来指定每个批处理中应当有多少个主机。

在开始下一批主机之前,Ansible 将全程通过Play处理每一批主机,如果当前批处理中的所有主机都失败,则整个Play 将中止,且 Ansible 不会启动下一批次处理。

[student@workstation task-execution]$ cat serial.yaml
---
- name: 滚动更新hosts: allserial: 2tasks:- name: update webshell: sleep 2
[student@workstation task-execution]$ ansible-playbook  serial.yamlPLAY [滚动更新] **************************************************************************************************TASK [Gathering Facts] ***************************************************************************************
ok: [servera]
ok: [serverb]TASK [update web] ********************************************************************************************
changed: [servera]
changed: [serverb]PLAY [滚动更新] **************************************************************************************************TASK [Gathering Facts] ***************************************************************************************
ok: [serverd]
ok: [serverc]TASK [update web] ********************************************************************************************
changed: [serverc]
changed: [serverd]PLAY [滚动更新] **************************************************************************************************TASK [Gathering Facts] ***************************************************************************************
ok: [servere]
ok: [serverf]TASK [update web] ********************************************************************************************
changed: [servere]
changed: [serverf]PLAY RECAP ***************************************************************************************************
servera                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverb                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverc                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverd                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
servere                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverf                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

在上面示例中,serial 关键字指定Ansible在两个主机的批处理中处理 web_servers 主机组中的主机。如果play正常执行且没有错误,则使用新的批处理再次重复该 play。

如果play中的主机总数不能被批处理大小整除,则最后一个批处理包含的主机可能比serial 关键字的指定值更少。serial关键字中使用整数。

将批处理大小设置为百分比

还可以为 serial 关键字设置为百分比:

[student@workstation task-execution]$ cat serial.yaml
---
- name: 滚动更新hosts: allserial: 25%tasks:- name: update webshell: sleep 2
[student@workstation task-execution]$ ansible-playbook  serial.yamlPLAY [滚动更新] **************************************************************************************************TASK [Gathering Facts] ***************************************************************************************
ok: [servera]TASK [update web] ********************************************************************************************
changed: [servera]PLAY [滚动更新] **************************************************************************************************TASK [Gathering Facts] ***************************************************************************************
ok: [serverb]TASK [update web] ********************************************************************************************
changed: [serverb]PLAY [滚动更新] **************************************************************************************************TASK [Gathering Facts] ***************************************************************************************
ok: [serverc]TASK [update web] ********************************************************************************************
changed: [serverc]PLAY [滚动更新] **************************************************************************************************TASK [Gathering Facts] ***************************************************************************************
ok: [serverd]TASK [update web] ********************************************************************************************
changed: [serverd]PLAY [滚动更新] **************************************************************************************************TASK [Gathering Facts] ***************************************************************************************
ok: [servere]TASK [update web] ********************************************************************************************
changed: [servere]PLAY [滚动更新] **************************************************************************************************TASK [Gathering Facts] ***************************************************************************************
ok: [serverf]TASK [update web] ********************************************************************************************
changed: [serverf]PLAY RECAP ***************************************************************************************************
servera                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverb                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverc                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverd                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
servere                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverf                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0[student@workstation task-execution]$

每个批次分别设置

[student@workstation task-execution]$ cat serial.yaml
---
- name: 滚动更新hosts: allserial:- 25%- 3- 100%tasks:- name: update webshell: sleep 2
[student@workstation task-execution]$
[student@workstation task-execution]$ vim  serial.yaml
[student@workstation task-execution]$ ansible-playbook  serial.yamlPLAY [滚动更新] **************************************************************************************************TASK [Gathering Facts] ***************************************************************************************
ok: [servera]TASK [update web] ********************************************************************************************
changed: [servera]PLAY [滚动更新] **************************************************************************************************TASK [Gathering Facts] ***************************************************************************************
ok: [serverc]
ok: [serverb]
ok: [serverd]TASK [update web] ********************************************************************************************
changed: [serverb]
changed: [serverc]
changed: [serverd]PLAY [滚动更新] **************************************************************************************************TASK [Gathering Facts] ***************************************************************************************
ok: [servere]
ok: [serverf]TASK [update web] ********************************************************************************************
changed: [servere]
changed: [serverf]PLAY RECAP ***************************************************************************************************
servera                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverb                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverc                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverd                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
servere                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverf                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

中止Play

默认情况下,Ansible尝试获取尽可能多的主机来完成play。如果某一任务对于某一主机失败,则它将从play中丢弃,但Ansible 将继续为其他主机运行play中剩余的任务。仅当所有主机都失败时,play才会停止。

但是,如果使用 serial 关键字将主机组织到批处理中,那么如果当前批处理中的所有主机都失败,则Ansible将停止所有剩余主机的 play,而不仅仅是当前批处理中剩余的主机。如果由于批处理中的所有主机失败而停止了该play的执行,则下一个批处理将不会启动。

Ansible的ansible_play_batch变量中的每个批处理保留活动服务器列表。任何有任务失败的主机都将从ansible play batch 列表中删除。Ansible会在每项任务后更新此列表。

指定容错 max_fail_percentage

这里可以通过 指定容错 的方式来提前终止剧本。通过将 max_fail_percentage 关键字添加到剧本 ,改变 Ansible 的失败行为

- name: 滚动更新hosts: allmax_fail_percentage: 30%serial:- 25%- 3- 100%tasks:- name: update webshell: sleep 2

上面的配置,即所有机器里 30% 的机器执行 tasks 任务失败,那个会提前终止 剧本。

博文参考

《Red Hat Ansible Engine 2.8 DO447》

相关文章:

Ansible最佳实践之Playbook管理滚动更新

写在前面 理解不足小伙伴帮忙指正 傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡…...

基于Citespace、vosviewer、R语言的文献计量学可视化分析及SCI论文高效写作方法教程

详情点击链接:基于Citespace、vosviewer、R语言的文献计量学可视化分析技术及全流程文献可视化SCI论文高效写作方法 前言 文献计量学是指用数学和统计学的方法,定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体,注重量…...

【MATLAB】GM(1,1) 灰色预测模型及算法

一、灰色预测模型概念 灰色预测是一种对含有不确定因素的系统进行预测的方法。 灰色预测通过鉴别系统因素之间发展趋势的相异程度,即进行关联分析,并对原始数据进行生成处理来寻找系统变动的规律,生成有较强规律性的数据序列,然后…...

Go重写Redis中间件 - Go实现Redis协议解析器

Go实现Redis协议解析器 Redis网络协议详解 在解决完通信后,下一步就是搞清楚 Redis 的协议-RESP协议,其实就是一套类似JSON、Protocol Buffers的序列化协议,也就是我们的客户端和服务端通信的协议 RESP定义了5种格式 简单字符串(Simple String) : 服务器用来返回简单的结…...

海外抖音Tiktok强势来袭,有些人半年赚别人十倍工资

TikTok作为一款流行的短视频社交应用程序,确实在全球范围内取得了很大的成功。许多人通过在TikTok上分享有趣、创意或有吸引力的视频内容,获得了广泛的关注和认可。一些用户甚至能够通过TikTok赚取高额的收入,远远超过传统职业所能获得的工资…...

devDept Eyeshot 2024 预告-Update-Crack

即将发布的版本 开发商在一个动态的环境中运作,事情可能会发生变化。本页提供的信息旨在概述 devDept 软件产品的总体方向。它仅供参考,不应作为做出任何决定性的依据。devDept Eyeshot 2024软件产品描述的任何特性或功能的开发、发布和时间安排仍由 dev…...

教雅川学缠论05-线段

线段需要满足下面4个条件: 1.是由3条笔,或者3条以上组成,同笔一样,线段也是有方向的 2.如果线段起始于向上笔,则终止与向上笔(一定不会终止与向下笔) 3.如果线段起始于向下笔,则终止…...

SpringBoot 配置⽂件

1.配置文件作用 整个项⽬中所有重要的数据都是在配置⽂件中配置的,⽐如: 数据库的连接信息(包含⽤户名和密码的设置);项⽬的启动端⼝;第三⽅系统的调⽤秘钥等信息;⽤于发现和定位问题的普通⽇…...

基于Python的电影票房爬取与可视化系统的设计与实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...

Packet Tracer – 配置系统日志和 NTP

Packet Tracer – 配置系统日志和 NTP 目标 第 1 部分:配置系统日志服务 第 2 部分:生成日志记录事件 第 3 部分:手动设置交换机时钟 第 4 部分:配置 NTP 服务 第 5 部分:验证带时间戳的日志 拓扑图 场景 在本…...

TypeScript 联合类型,类型推断,类型断言

联合类型 取值可以为多种类型中的一个 function func(str: number | string):void{}类型断言 当变量需要调用某属性的时候&#xff0c;有不确定当前的类型是什么&#xff0c;可以使用类型断言&#xff1b; 类型断言的两种方式&#xff1a; 1&#xff0c;<类型> 变量名…...

到底叫 集合还是数组还是list还是列表?

1 总体上可以将数据结构分为数组和集合两种&#xff0c;而列表是一个泛指 数组&#xff1a;在Java中&#xff0c;数组是一种基本数据类型&#xff0c;可以用来存储同一类型的多个元素&#xff0c;数组的长度是固定的。例如&#xff1a;int[] arr new int[10];List&#xff1a…...

LBERT论文详解

论文地址&#xff1a;https://arxiv.org/abs/2105.07148 代码地址&#xff1a;https://github.com/liuwei1206/LEBERT 模型创新 LEBRT采用句子中的词语对&#xff08;论文中称为Char-Word Pair&#xff09;的特征作为输入作者设计Lexicon adapter&#xff0c;在BERT的中间某一…...

C++终止cin输入while循环时多读取^Z或^D的问题

原代码&#xff1a; istream& operator>>(istream& is, map<string, int>&mm) {string ss"";int ii0;is >> ss>>ii;mm[ss]ii;return is; }int main() {map<string,int>msi;while(cin>>msi);return 0; } 问题&…...

c#[WebMethod]方法接收前端传入的JsonArray的方法

一、第一种方法&#xff1a;可以这样接收前端传入的jsonArray字符串到一个类的数组中&#xff0c;然后遍历该数组取值 这种方法需要创建PointConfig类 class PointConfig{public string ptcrossing { get; set; }public string ptcrossingId { get; set; }public string camId …...

WebService 报错 集锦

报错1&#xff1a;url错误 我的是调用的url的端口错误。调用esb的url的端口错了&#xff0c;导致报错。有的人是uri错了。例如&#xff1a; www.globalcoding.com:9001/SAP_saveProduct/1.0.0 写成了 www.globalcoding.com:9001/SAP_savePoduct/1.0.0 报错如下&#xff1a;…...

C++--菱形继承

1.什么是菱形继承 单继承&#xff1a;一个子类只有一个直接父类时称这个继承关系为单继承 多继承&#xff1a;一个子类有两个或以上直接父类时称这个继承关系为多继承 菱形继承的问题&#xff1a;菱形继承有数据冗余和二义性的问题&#xff0c;数据冗余是由于创建多个相同类型的…...

Vue 3:玩一下web前端技术(二)

前言 本章内容为VUE目录结构解析与相关工程技术讨论。 上一篇文章地址&#xff1a; Vue 3&#xff1a;玩一下web前端技术&#xff08;一&#xff09;_Lion King的博客-CSDN博客 下一篇文章地址&#xff1a; Vue 3&#xff1a;玩一下web前端技术&#xff08;三&#xff09;…...

自然语言处理14-基于文本向量和欧氏距离相似度的文本匹配,用于找到与查询语句最相似的文本

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理14-基于文本向量和欧氏距离相似度的文本匹配&#xff0c;用于找到与查询语句最相似的文本。NLP中的文本匹配是指通过计算文本之间的相似度来找到与查询语句最相似的文本。其中一种常用的方法是基于文本…...

iOS开发-聊天emoji表情与自定义动图表情左右滑动控件

iOS开发-聊天emoji表情与自定义动图表情左右滑动控件 之前开发中遇到需要实现聊天emoji表情与自定义动图表情左右滑动控件。使用UICollectionView实现。 一、效果图 二、实现代码 UICollectionView是一种类似于UITableView但又比UITableView功能更强大、更灵活的视图&#x…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...