持续交付与滚动升级

介绍

持续交付是频繁对软件应用程序持续更新的概念.

这个想法使在大量频繁的更新面前, 你不必等待在一个指定的特殊时间点, 并且使你的组织在响应过程中变得更好.

一些 Ansible 用户每小时都在部署更新给他们的最终用户甚至更加频繁 – 每时每刻都有代码修改的批准. 要实现这一点, 你需要工具能在零停机的时间内快速的应用这些更新.

本文档详细介绍了如何现实这一目标, 使用 Ansible playbooks 作为一个完整例子的模板: lamp_haproxy. 这个例子使用了大量的 Ansible 特性: roles, templates 和 group variables, 并且它还配备了一个业务流程的 playbook 可以做到零停机滚动升级 web 应用程序栈.

Note

点击这里查看最新版本的 playbook 例子.

这个 playbooks 基于 CentOS 部署 Apache, PHP, MySQL, Nagios, 和 HAProxy 这些服务.

在这里我们不去讨论如何运行这些 playbooks. 阅读包含在 github 项目中关于这个例子的 README 信息. 相反的, 我们将进一步观察这些 playbook 并且去解释它们.

部署网站

让我们首先使用 site.yml. 这是我们网站部署的 playbook. 它被用来部署我们最初的网站以及推送更新到所有的服务器:

---
# 这个 playbook 在这个网站上部署整个应用程序.# 应用通用的配置到所有的主机上
- hosts: allroles:- common# 配置和部署数据库服务器.
- hosts: dbserversroles:- db# 配置和部署 web 服务器. 注意这里我们包含了两个 roles, 这个 'base-apache' role 用来简单设置 Apache, 而 'web' 则包含了我们的 web 应用程序.- hosts: webserversroles:- base-apache- web# 配置和部署 load balancer(s).
- hosts: lbserversroles:- haproxy# 配置和部署 Nagios 监控节点(s).
- hosts: monitoringroles:- base-apache- nagios

Note

如果你不熟悉 playbooks 和 plays, 你应该回顾 Playbooks.

在这个 palybook 我们有 5 个 plays. 首先第一个目标 all (所有)主机和适用于所有主机的 commonrole. 这是整个网站要做的事像 yum 仓库的配置, 防火墙的配置, 和其他任何需要适用于所有服务器的配置.

接下来的这四个 plays 将运行于指定的主机组并特定的角色应用于这些服务器. 随着对 Nagios monitoring, 数据库角色, 和 web应用程序的应用, 我们可以通过 base-apache 角色安装和配置一个基本的 Apache. 这是 Nagios 主机和 web 应用程序所需要的.

可重用的: Roles

关于 roles 你现在应该有一点了解以及它们是如何工作的. Roles 是组织: tasks, handlers, templates, 和 files, 到可重用的组件中的方法.

这个例子有 6 个 roles: commonbase-apachedbhaproxynagios, 和 web. 你如何组织你的 roles 是由你和你的应用程序所决定, 但是大部分网站都将适用一个或多个共同的 roles, 和一些列关于应用程序特定的 roles 来安装和配置这个网站的特定部分.

Roles 可以用变量和依赖关系, 你可以通过参数来调整它们的行为. 你可以在 Playbook Roles and Include Statements 章节中关于 roles

配置: Group Variables

Group variables 是应用在服务器组上的. 通过设置和修改参数将他们应用在 templates 中来定义 playbooks 的行为. 他们被存储在和你的 inventory 相同目录下名为 group_vars 的目录中. 下面是 lamp_haproxy 的 group_vars/all 文件内容. 正如你所期望的, 这些变量将会应用到 inventory 中的所有服务器上:

---
httpd_port: 80
ntpserver: 192.168.1.2

这是一个 YAML 文件, 并且你可以创建列表和字典等更加复杂的变量结构. 在这种情况下, 我们只设置了两个变量, 一个做为 web server 的端口, 一个作为我们服务器所使用的时间同步 NTP 服务的地址.

这是另外一个 group variables 文件. 这个 group_vars/dbservers 适用于在 dbservers 组中的主机:

---
mysqlservice: mysqld
mysql_port: 3306
dbuser: root
dbname: foodb
upassword: usersecret

如果你看了这个例子, 你会发现对于 webservers 组合 lbservers 组的 group variables 十分相似.

这些变量可以用于任何地方. 你可以在 playbooks 中使用它们, 像这样, 在 roles/db/tasks/main.yml:

- name: Create Application Databasemysql_db: name={{ dbname }} state=present- name: Create Application DB Usermysql_user: name={{ dbuser }} password={{ upassword }}priv=*.*:ALL host='%' state=present

你也可以在 templates 中使用这些变量, 想这样, 在 roles/common/templates/ntp.conf.j2:

driftfile /var/lib/ntp/driftrestrict 127.0.0.1
restrict -6 ::1server {{ ntpserver }}includefile /etc/ntp/crypto/pwkeys /etc/ntp/keys

你可以看到这些变量替换的语法 {{ and }} 和 templates 中的变量是相同的. 这种花括号格式是采用的jinj2语法, 你在对于内部的数据做各种操作及应用不同的过滤器. 在 templates, 你也可以使用循环和 if 语句来处理更加复杂的情况, 想这样, 在 roles/common/templates/iptables.j2:

{% if inventory_hostname in groups['dbservers'] %}
-A INPUT -p tcp  --dport 3306 -j  ACCEPT
{% endif %}

这是用来判断, 名为 (inventory_hostname) 的机器是否存在于组 dbservers. 如果这样的话, 该机器将会添加一条 目标端口为 3306 的 iptables 允许规则.

这有一些其他的例子, 来自相同的模板:

{% for host in groups['monitoring'] %}
-A INPUT -p tcp -s {{ hostvars[host].ansible_default_ipv4.address }} --dport 5666 -j ACCEPT
{% endfor %}

这里循环了一个组名为 monitoring 中的所有主机, 并且配置了源地址为所有监控主机的 IPV4 地址目标端口为 5666 的 iptables 允许规则到当前主机上, 正因为如此 Nagios 才可以监控这些主机.

你可以学到更多关于 Jinja2 的功能 here, 并且你可以读到更多关于 Ansible 所有的变量在这个 Variables 章节

滚动升级

现在你有了一个全面的网站包含 web servers, 一个 load balancer, 和 monitoring. 如何更新它? 这就是 Ansible 的特殊功能发挥作用. 尽管一些应用程序使用’业务流程’来编排命令执行的逻辑, Ansible将指挥编排这些机器, 并且拥有一个相当复杂的引擎.

Ansible 有能力在一次操作中协调多种应用程序, 使在进行更新升级我们的 web 应用程序时更加实现零停机时间. 这是一个单独的 playbook, 叫做 roleing_upgrade.yml.

看这个 playbook, 你可以看到它是由两个 plays 组成. 首先第一个看起来十分简单像这样:

- hosts: monitoringtasks: []

这里要做什么, 为什么没有 tasks? 你可能知道 Ansible 在运行之前会从服务上收集 “facts”. 这些 facts 是很多种有用的信息: 网络信息, OS/发行版本, 配置. 在我们的方案中, 在更新之前我们需要了解关于所有监控服务器的环境信息, 因此这个简单的 paly 将会在我们的所监控的服务器上强制收集 fact 信息. 你有时会见到这种模式, 这是一个有用的技巧.

接下来的部分是更新 play. 第一部分看起来是这样:

- hosts: webserversuser: rootserial: 1

我们仅仅是像通常一样在 webservers 组中定义了 play. 这个 serial 关键字告诉 Ansible 每次操作多少服务器. 如果它没有被指定, Ansible 默认根据配置文件中 “forks” 限制指定的值进行并发操作. 但是对于零停机时间的更新, 你可能不希望一次操作多个主机. 如果你仅仅有少数的 web 服务器, 你可能希望设置 serial 为 1, 在同一时间只执行一台主机. 如果你有 100 台, 你可以设置 serial 为 10, 同一时间执行 10 台.

下面是更新 play 接下来的部分:

pre_tasks:
- name: disable nagios alerts for this host webserver servicenagios: action=disable_alerts host={{ inventory_hostname }} services=webserverdelegate_to: "{{ item }}"with_items: groups.monitoring- name: disable the server in haproxyshell: echo "disable server myapplb/{{ inventory_hostname }}" | socat stdio /var/lib/haproxy/statsdelegate_to: "{{ item }}"with_items: groups.lbservers

这个 pre_tasks 关键字仅仅是让在 roles 调用前列出运行的 tasks. 这段时间将十分有用. 如果你看到这些 tasks 的名称, 你会发现我们禁用了 Nagios 的报警并且将当前更新的服务器从 HAProxy load balancing pool 中移除.

参数``delegate_to`` 和 with_items 一起来使用, 因为 Ansible 循环每一个 monitoring 服务器和 load balancer, 并且针对循环的值在 monitoring 或 load balancing 上操作(delegate 代表操作). 从编程方面来说, 外部的循环是 web 服务器列表, 内部的循环是 monitoring 服务器列表.

请注意 HAProxy 的步骤看起来有点复杂. 我们使用它作为例子是因为它是免费的, 但如果你有(例如)一个 F5 或 Netscaler 在你的基础设施上(或者你有一个 AWS 弹性 IP 的设置?), 你可以使用 Ansible 的模块而不是直接和他们进行交互. 你也可能希望使用其他的 monitoring 模块来代替 nagios, 但是这仅仅是展示了在任务开始前的部分 – 把服务从监控中移除并且轮换它们.

下一步重新简单的使正确的角色应用在 web 服务器上. 这将导致一些名为 web 和 base-apache 的配置管理角色应用到 web 服务器上, 包含一个更新 web 应用程序自身代码. 我们不需要这样做 – 我们仅需要将其修改为纯碎的更新 web 程序, 但是这是一个很好的例子关于如何通过 roles 来重用这些任务:

roles:
- common
- base-apache
- web

最后, 在 post_tasks 部分, 我们反向的改变 Nagios 的配置并且将 web 服务器重新添加到 load balancing pool:

post_tasks:
- name: Enable the server in haproxyshell: echo "enable server myapplb/{{ inventory_hostname }}" | socat stdio /var/lib/haproxy/statsdelegate_to: "{{ item }}"with_items: groups.lbservers- name: re-enable nagios alertsnagios: action=enable_alerts host={{ inventory_hostname }} services=webserverdelegate_to: "{{ item }}"with_items: groups.monitoring

再一次说明, 如果你在使用一个 Netscaler 或 F5 或 Elastic 的负载均衡器, 你仅仅需要替换为适合的模块对象.

管理其他的负载均衡

在这个例子中, 我们使用了简单的 HAProxy 负载均衡到后端的 web 服务器. 它是非常容易配置和管理的. 正如我们所提到的, Ansible 已经为其他的负载均衡器像 Citrix NetScaler, F5 BigIP, Amazon Elastic Load Balancers 等提供了内建的支持.信息 模块相关

对于其他的负载均衡器, 如果公开一个负载均衡时, 你可能需要向它们发送 shell 命令 (像上面我们对 HAProxy 一样), 或者调用一些 API. 你可以越多更多关于 local actions 在这个 委托,滚动更新,本地动作章节中. 对于一些硬件的开发将更加有趣, 他们没有一个核心模块, 所以你可以使用更好的模块将他们封装起来!

持续交付结束

现在你有一个自动化的方式来部署更新你的应用程序, 你将如何将他们绑定在一起? 许多组织使用持续集成的工具像 Jenkins 或 Atlassian Bamboo 来完成开发, 测试, 发布, 和部署这样的流程步骤. 你也可以使用这些工具像 Gerrit 来添加一个 code review 的步骤来审查提交的应用程序的本身或者 Ansible playbooks.

根据你的环境, 你可能会部署到一个测试环境, 在这个环境中运行一些集成测试, 然后自动部署到生产环境. 你可以保持他们的简单性仅按需来进行滚动升级到测试或者指定的生产环境中. 这些你都随你决定.

与持续集成工具的结合, 你可以通过 ansible-playbook 命令行工具很容易的触发 playbook 的运行, 或者, 如果你使用 Ansible Towertower-cli 或者内置的 REST API. (这个 tower-cli 命令的 ‘joblaunch’ 将通过 REST API 远程产生一个 job 这非常棒).

Ansible 对于如何组合多层应用程序在任务编排和持续交付给客户的最终目标上给了你很好的主意. 你可以使用滚动升级的思路来扩展一些应用程序之间的不同部分; 也许向前端 web 服务器添加后端应用服务, 例如, 使用 MongoDB 或 Riak 来替换 SQL 数据库. Ansible 可以给你在复杂的环境中轻松完成常见的自动化操作.

See also

lamp_haproxy example
The lamp_haproxy example discussed here.
Playbooks
An introduction to playbooks
Playbook Roles and Include Statements
An introduction to playbook roles
Variables
An introduction to Ansible variables
Ansible.com: Continuous Delivery
An introduction to Continuous Delivery with Ansible

转载于:https://www.cnblogs.com/kevinX/p/8340756.html

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

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

相关文章

2-05 使用固态存储SSD或PCIe卡

在大量并发的情况下,才能体现固态磁盘的吞吐量,在大并发下提供良好随机io的性能,这正是关系型数据库所需要的,相对应机械磁盘,固态磁盘更容易损坏(第三点是固态磁盘的缺点),由于固态…

面试问题汇总 精选 分析 解答 职业规划 part 3

《剑指Offer——名企面试官精讲典型编程题》已经出版 非常感谢博客上的读者,是大家的关心、支持和鼓励让我有信心写完这本书并最终出版发行( china-pub互动网、 亚马逊卓越网、 淘宝网、 京东网、 当当网上有售)。网友们的鼓励让我在 博客上的…

java 分布式rpc框架_分布式RPC框架Apache Dubbo(一)

4 Dubbo快速入门Dubbo作为一个RPC框架,其最核心的功能就是要实现跨网络的远程调用。本小节就是要创建两个应用,一个作为服务的提供方,一个作为服务的消费方。通过Dubbo来实现服务消费方远程调用服务提供方的方法。4.1 服务提供方开发开发步骤…

轻松获知数据库事务

标题索引事务作用事务流程隔离级别实例验证事务作用事务是确保数据库系统数据的完整性的功能,如现在互联网行业支付业务,不管服务器出于什么原因异常中断,客户要么支付成功要么支付不成功,支付成功数据库金额即会发生变化&#xf…

Python冒泡排序(4)

Python代码: """ 冒泡排序(4)在未排序的数中,通过两两比较[换位]的方式,将最小的数移至首位 N个数排序,则需要执行N-1轮,第1轮比较N-1次,后续每轮比上一轮少比较1次本…

打印hello world java_java – 如何打印“hello world”?

数字4946144450195624适合64位,其二进制表示为:10001100100100111110111111110111101100011000010101000该程序对每5位组的字符进行解码,从右到左00100|01100|10010|01111|10111|11111|01111|01100|01100|00101|01000d | l | r | o | w | | o…

研发人员为什么留不住

研发人员为什么留不住?(1)——问题与现象 研发团队做为公司的核心,承担了完成项目为公司赚钱的目的。研发人员在公司倍受重视的同时,并没有降低流失率。 问题与现象 以下问题相信您会在朋友口中,甚至自己的公司听到。 老板说&a…

算法与编程--1

1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 package com.test;import java.io.File; import java.io.FileNotFoundException; import …

Safari支不支持HTML5录音? 现在浏览器中最好的解决方案是WebRTC下的 navigator.getUserMedia API。...

先放结论:Safari支不支持HTML5录音? ——据我调查,不支持。 现在浏览器中最好的解决方案是WebRTC下的 navigator.getUserMedia API。 可是当使用Can I use查看兼容性的时候,我发现 不过这个是有历史原因的,我记得RTC是…

python lambda map reduce_简单了解python filter、map、reduce的区别

这篇文章主要介绍了简单了解python filter、map、reduce的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下python中有一些非常有趣的函数,面试的时候可能会遇到。今天也来总结一下,不…

面试问题汇总 精选 分析 解答 职业规划 part 4

程序员做业余项目、记笔记和写博客的重要性【经典】 编程是一种创造过程,业余项目允许程序员在没有截止日期或各种限制的条件下,以探索形式编程。业余项目之所以重要,有以下几个原因。 探索新技术 每天都会不断有新技术出现,而…

NB-IOT连接移动onenet平台流程

1. 先创建账号,然后创建产品 2. 创建设备,用ATCGSN和ATCIMI查询NB-IOT的IMEI和IMSI填写上去。 3. 创建好的设备。 转载于:https://www.cnblogs.com/429512065qhq/p/8359247.html

sort,uniq,wc指令简单用法

sort用于排序,可以根据不同的数据类型来进行排序,例如想要查看最后一个登陆的用户信息,可以把last和sort结合起来使用,按照登陆时间排序。 使用sort排序: sort常用参数: -f :忽略大小写的差异 -…

java ejb jsp 架构_JavaEE架构

B/S 体系结构image.pngJava EE 经典架构image.pngJava EE 13规范JDBCimage.pngJDBC 对象与接口java.sql.DriverManager:用于管理JDBC驱动的服务类,当JDBC驱动加载至内存后,DriverManager会自动注册JDBC驱动,然后通过getConnection…

音视频中的CBR,VBR,ABR

视频码率CBR和VBR 固定码率(CBR)与可变码率(VBR) 一般在我们输出视频文件的时候都会碰到一个选择即CBR与VBR,CBR的英文全称是Constant Bit Rate翻译过来是固定码率,就是说每一秒种的画面如果看做是一个…

fifo java_java – 如何保证ThreadPoolExecutor中的FIFO执行顺序

我用这行代码创建一个ThreadPoolExecutor:private ExecutorService executor new ThreadPoolExecutor(5, 10, 120, TimeUnit.SECONDS, new ArrayBlockingQueue(20, true));然后,我运行25个任务(T01到T25),所以情况是:>目前正在运行的5个任务(T01到T0…

HihoCoder 1671 DFS

本以为是个简单的水题,好吧,其实就是个水题,虽然我还是…… 题意的理解上有一点小小的问题orz,这里的括号里的字母是可以看成一个整体的,可以看作一个字母来进行反转, 比如说,(abc(de))&#xf…

avs 中国音视频标准DRA 中音频标准及应用

DRA 是Digital Rise Audio的缩写。是广州广晟数码技术有限公司(Digital Rise Technology)开发的一项数字音频编码技术,目前是音频编码的国家标准。2007年1月被批准成为中国电子行业标准(标准号SJ/T11368-2006)。DRA音频标准可应用…

UWP数据绑定

已针对 Windows 10 上的 UWP 应用更新。 有关 Windows 8.x 文章,请参阅存档 ] 数据绑定是你的应用 UI 用来显示数据的一种方法,可以选择与该数据保持同步。 借助数据绑定,你可以将关注的数据从关注的 UI 中分离开来,从而可形成一个…

资源链接

http://cn.epubee.com/ 电子书 http://www.feemic.cn/mooc_search/1002384010 中国大学mooc视频下载 http://www.icourse163.org 中国大学mooc http://www.xuetangx.com 学堂在线 http://yun.java1234.com/ 视频搜索 http://www.52studyit.com/转载于:https://www.cnblogs.co…