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{}类型断言 当变量需要调用某属性的时候,有不确定当前的类型是什么,可以使用类型断言; 类型断言的两种方式: 1,<类型> 变量名…...
到底叫 集合还是数组还是list还是列表?
1 总体上可以将数据结构分为数组和集合两种,而列表是一个泛指 数组:在Java中,数组是一种基本数据类型,可以用来存储同一类型的多个元素,数组的长度是固定的。例如:int[] arr new int[10];List:…...
LBERT论文详解
论文地址:https://arxiv.org/abs/2105.07148 代码地址:https://github.com/liuwei1206/LEBERT 模型创新 LEBRT采用句子中的词语对(论文中称为Char-Word Pair)的特征作为输入作者设计Lexicon adapter,在BERT的中间某一…...
C++终止cin输入while循环时多读取^Z或^D的问题
原代码: 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的方法
一、第一种方法:可以这样接收前端传入的jsonArray字符串到一个类的数组中,然后遍历该数组取值 这种方法需要创建PointConfig类 class PointConfig{public string ptcrossing { get; set; }public string ptcrossingId { get; set; }public string camId …...
WebService 报错 集锦
报错1:url错误 我的是调用的url的端口错误。调用esb的url的端口错了,导致报错。有的人是uri错了。例如: www.globalcoding.com:9001/SAP_saveProduct/1.0.0 写成了 www.globalcoding.com:9001/SAP_savePoduct/1.0.0 报错如下:…...
C++--菱形继承
1.什么是菱形继承 单继承:一个子类只有一个直接父类时称这个继承关系为单继承 多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承 菱形继承的问题:菱形继承有数据冗余和二义性的问题,数据冗余是由于创建多个相同类型的…...
Vue 3:玩一下web前端技术(二)
前言 本章内容为VUE目录结构解析与相关工程技术讨论。 上一篇文章地址: Vue 3:玩一下web前端技术(一)_Lion King的博客-CSDN博客 下一篇文章地址: Vue 3:玩一下web前端技术(三)…...
自然语言处理14-基于文本向量和欧氏距离相似度的文本匹配,用于找到与查询语句最相似的文本
大家好,我是微学AI,今天给大家介绍一下自然语言处理14-基于文本向量和欧氏距离相似度的文本匹配,用于找到与查询语句最相似的文本。NLP中的文本匹配是指通过计算文本之间的相似度来找到与查询语句最相似的文本。其中一种常用的方法是基于文本…...
iOS开发-聊天emoji表情与自定义动图表情左右滑动控件
iOS开发-聊天emoji表情与自定义动图表情左右滑动控件 之前开发中遇到需要实现聊天emoji表情与自定义动图表情左右滑动控件。使用UICollectionView实现。 一、效果图 二、实现代码 UICollectionView是一种类似于UITableView但又比UITableView功能更强大、更灵活的视图&#x…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
