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》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/13888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

级联选择框

文章目录 实现级联选择框效果图实现前端工具版本添加依赖main.js导入依赖级联选择框样式 后端数据库设计 实现级联选择框 效果图 实现 前端 工具版本 node.js v16.6.0vue3 级联选择框使用 Element-Plus 实现 添加依赖 在 package.json 添加依赖,并 npm i 导入…

Web安全基础

1、HTML基础 什么是 HTML HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (Markup language) 标记语言是一套标记标签 (Markup tag) HTML 使用标记标签来描述网页 总的来说&…

Ubuntu中关闭防火墙

在Ubuntu中关闭防火墙可以通过以下步骤进行: 查看防火墙状态: sudo ufw status如果防火墙状态为active(活动状态),则执行以下命令来停用防火墙: sudo ufw disable输入以下命令确认是否停用防火墙&#x…

【Rust 基础篇】Rust可变静态变量:全局状态的可变性管理

导言 Rust是一种以安全性和高效性著称的系统级编程语言,其设计哲学是在不损失性能的前提下,保障代码的内存安全和线程安全。为了实现这一目标,Rust引入了"所有权系统"、"借用检查器"等特性,有效地避免了常见…

Flink之Kafka Sink

代码内容 package com.jin.demo;import org.apache.flink.api.common.serialization.SimpleStringSchema; import org.apache.flink.connector.base.DeliveryGuarantee; import org.apache.flink.connector.kafka.sink.KafkaRecordSerializationSchema; import org.apache.fli…

【LeetCode】28. 找出字符串中第一个匹配项的下标

题目: 28. 找出字符串中第一个匹配项的下标 这道题一看就是经典的KMP算法求解字符串模式匹配问题。 但这里我用了java里自带的字符串匹配函数 indexOf(),虽然有点偷懒,但运行结果还不错。主要是怕有时候竞赛会突然忘了一些算法,不过有时候多…

[数据集][目标检测]天牛数据集目标检测数据集VOC格式3050张

数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):3050 标注数量(xml文件个数):3050 标注类别数:1 标注类别名称:["longicorn"] …

Tomcat中利用war包部署

在Tomcat中利用war包部署Web应用程序时,默认情况下,应用程序的上下文路径(也称为项目名称)将是war文件的名称(去除.war扩展名)。这意味着您在访问Web应用程序时必须在URL中包含项目名称。例如,如…

Minio在windows环境配置https访问

minio启动后,默认访问方式为http,但是有的时候我们的访问场景必须是https,浏览器有的会默认以https进行访问,这个时候就需要我们进行配置上的调整,将minio从http访问升级到https。而查看minio的官方文档,并…

【Spring Cloud Alibaba】限流--Sentinel

文章目录 概述一、Sentinel 是啥?二、Sentinel 的生态环境三、Sentinel 核心概念3.1、资源3.2、规则 四、Sentinel 限流4.1、单机限流4.1.1、引入依赖4.1.2、定义限流规则4.1.3、定义限流资源4.1.4、运行结果 4.2、控制台限流4.2.1、客户端接入控制台4.2.2、引入依赖…

【Qt】QML-02:QQuickView用法

1、先看demo QtCreator自动生成的工程是使用QQmlApplicationEngine来加载qml文件&#xff0c;下面的demo将使用QQuickView来加载qml文件 #include <QGuiApplication> #include <QtQuick/QQuickView>int main(int argc, char *argv[]) {QGuiApplication app(argc,…

layui各种事件无效(例如表格重载或 分页插件按钮失效)的解决方法

下图是我一个系统的操作日志&#xff0c;在分页插件右下角嵌入了一个导出所有数据的按钮 &#xff0c;代码没有任何问题&#xff0c;点击导出按钮却失效 排查之后&#xff0c;发现表格标签table定义了ID又定义了lay-filter&#xff0c;因我使用的layui从2.7.6升级到2.8.11&…

JavaScript高级——ES6基础入门

目录 前言let 和 const块级作用域模板字符串一.模板字符串是什么二.模板字符串的注意事项三. 模板字符串的应用 箭头函数一.箭头函数是什么二.普通函数与箭头函数的转换三.this指向1. 全局作用域中的 this 指向2. 一般函数&#xff08;非箭头函数&#xff09;中的this指向3.箭头…

SSL 证书过期巡检脚本

哈喽大家好&#xff0c;我是咸鱼 我们知道 SSL 证书是会过期的&#xff0c;一旦过期之后需要重新申请。如果没有及时更换证书的话&#xff0c;就有可能导致网站出问题&#xff0c;给公司业务带来一定的影响 所以说我们要每隔一定时间去检查网站上的 SSL 证书是否过期 如果公…

Flutter - 微信朋友圈、十字滑动效果(微博/抖音个人中心效果)

demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新&#xff0c;请前往github查看最新代码 前言 一般APP都有类似微博/抖音个人中心的效果&#xff0c;支持上下拉刷新&#xff0c;并且顶部有个图片可以下拉放大&#xff0c;图片底部是几个tab&#xff0c;可…

C# IO 相关功能整合

目录 删除文件和删除文件夹 拷贝文件到另一个目录 保存Json文件和读取Json文件 写入和读取TXT文件 打开一个弹框&#xff0c;选择 文件/文件夹&#xff0c;并获取路径 获取项目的Debug目录路径 获取一个目录下的所有文件集合 获取文件全路径、目录、扩展名、文件名称 …

WPF实现DiagramChart

1、文件架构 2、FlowChartStencils.xaml <ResourceDictionary xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:s"clr-namespace:DiagramDesigner"xmlns:c&…

了解Unity编辑器之组件篇Miscellaneous(九)

一、Aim Constraint&#xff1a;是一种动画约束&#xff0c;用于使一个对象朝向另一个对象或一个指定的矢量方向 Activate按钮&#xff1a;用于激活或停用Aim Constraint。当Aim Constraint处于激活状态时&#xff0c;其约束效果将应用于目标对象。 Zero按钮&#xff1a;用于将…

Zabbix监控ActiveMQ

当我们在线上使用了ActiveMQ 后&#xff0c;我们需要对一些参数进行监控&#xff0c;比如 消息是否有阻塞&#xff0c;哪个消息队列阻塞了&#xff0c;总的消息数是多少等等。下面我们就通过 Zabbix 结合 Python 脚本来实现对 ActiveMQ的监控。 一、创建 Activemq Python 监控…

39. Linux系统下在Qt5.9.9中搭建Android开发环境

1. 说明 QT版本:5.9.9 电脑系统:Linux JDK版本:openjdk-8-jdk SDK版本:r24.4.1 NDK版本:android-ndk-r14b 效果展示: 2. 具体步骤 大致安装的步骤如下:①安装Qt5.9.9,②安装jdk,③安装ndk,④安装sdk,⑤在qt中配置前面安装的环境路径 2.1 安装Qt5.9.9 首先下载…