使用 Ansible 自动化部署策略

使用自动化来消除由于重复性任务和计划外工作造成的时间浪费。
200 位读者喜欢此内容。
gears and lightbulb to represent innovation

Opensource.com

当您从底层到顶层检查您的技术栈——硬件、操作系统 (OS)、中间件和应用程序——以及它们各自的配置时,很明显,随着您在堆栈中上升,更改的频率会高得多。您的硬件几乎不会改变,您的操作系统具有较长的生命周期,并且您的中间件将跟上应用程序的需求,但是即使您的发布周期很长(几周或几个月),您的应用程序也将是最不稳定的。

Deployment strategy on Ansible

opensource.com

系统和网络管理实践 中,作者将 IT 中最大的“时间浪费”归类为手动/非标准操作系统配置和应用程序部署。 这些时间浪费将通过重复性任务或计划外工作消耗您。

为什么会这样?假设您配置了一台新服务器,但没有正确配置网络时间协议 (NTP),并且一小部分请求(在数十台服务器的集群中)开始表现异常,因为某个应用程序使用某种依赖于正确时间的调度程序。这样来看,这是一个很容易解决的问题,但是您的团队需要多长时间才能弄清楚呢?事件或计划外工作会占用您的大量时间,更糟糕的是,还会占用您最优秀的人才的时间。您真的应该浪费时间来调查这样的生产系统吗?最好将此服务器放在一边并从头开始自动配置一台新服务器,不是吗?

手动部署怎么样?想象一下,跨一个服务器群或节点部署 20 个二进制文件及其各自的配置文件?这有多容易出错? 不可避免地,它最终会导致计划外工作。

2018 DevOps 状态报告 介绍了 DevOps 采用的各个阶段,毫不奇怪,第 0 阶段包括部署自动化和部署模式的重用,而第 1 阶段和第 2 阶段则侧重于基础设施栈的标准化,以减少环境中的不一致。

请注意,不止一次,我看到运营团队将这种“标准化”作为限制开发团队交付能力的借口,迫使他们使用锤子敲击绝对不是钉子的东西。不要这样做;代价极其高昂。

这里要吸取的教训是,缺乏自动化不仅会增加您的交付周期,还会增加您流程中的问题发生率以及您面临的计划外工作量。如果您读过 凤凰项目,您就会知道这是任何价值流中一切罪恶的根源,如果您不摆脱它,它最终会扼杀您的业务。

当试图填补最大的时间浪费时,为什么不从自动化操作系统安装开始呢?我们可以这样做,但是结果需要更长的时间才能显现,因为创建新虚拟机不如部署应用程序那样频繁。换句话说,这可能无法释放我们需要的时间来推动我们的计划,因此它可能会过早夭折。

仍然不相信?从开发的角度来看,更小且更频繁的发布也非常积极。让我们进一步解释一下……

部署 ≠ 发布

首先要理解的是,尽管它们可以互换使用,但是部署发布 并不 意味着同一件事。发布是指向用户提供新版本,而部署是部署新版本的技术过程。让我们专注于部署的技术过程。

任务、组和 Ansible

我们需要从头到尾了解部署过程,包括中间的一切——任务、哪些服务器参与该过程以及执行哪些步骤——以避免落入 Mattias Geniar 在 自动化未知 中描述的陷阱。

任务

在常规部署过程中通常执行的步骤包括

  • 部署应用程序/数据库或数据库更改
  • 停止/启动服务和监控
  • 从我们的负载均衡器添加/删除服务器
  • 验证应用程序状态——它是否已准备好为请求提供服务?
  • 手动批准——有必要吗?

对于某些人来说,自动化部署过程但保留手动批准步骤就像骑着带有辅助轮的自行车。正如有人曾经告诉我的那样:“骑带有辅助轮的自行车总比根本不骑好。”

如果某个工具不包含 API 或命令行界面 (CLI) 来启用任务自动化怎么办?那么,也许是时候考虑更换工具了。 有许多开源应用服务器、数据库、监控系统和负载均衡器可以轻松实现自动化——这在很大程度上归功于 Unix 哲学。 在采用新技术时,消除未自动化的选项,并发挥您的创造力来支持您的传统技术。 例如,我见过人们对网络设备配置文件进行版本控制并使用 FTP 对其进行更新。

猜猜怎么着?现在是采用开源工具的绝佳时机。 最新的 加速:DevOps 状态 报告发现,开源技术在高绩效组织中得到广泛使用。 逻辑很简单:开源项目以“达尔文主义”模式运作,其中那些不适应和进化的人会因缺乏用户群或贡献而消亡。 反馈对于软件发展至关重要。

要识别要用于自动化的服务器组,请考虑要自动化的最多任务,例如

  • 部署应用程序/数据库或数据库更改
  • 停止/启动服务和监控
  • 从负载均衡器添加/删除服务器
  • 验证应用程序状态——它是否已准备好为请求提供服务?

剧本

高级部署流程可以是

  1. 停止监控(以避免误报)
  2. 从负载均衡器中删除服务器(以防止用户收到错误代码)
  3. 停止服务(以实现平稳关机)
  4. 部署新版本的应用程序
  5. 等待应用程序准备好接收新请求
  6. 执行步骤 3、2 和 1。
  7. 对下一个 N 个服务器执行相同操作。

拥有流程文档很好,但拥有可执行的部署文档更好!以下是步骤 1-5 在完全开源栈中使用 Ansible 的外观

- name: Disable alerts
  nagios:
    action: disable_alerts
    host: "{{ inventory_hostname }}"
    services: webserver
  delegate_to: "{{ item }}"
  loop: "{{ groups.monitoring }}"

- name: Disable servers in the LB
  haproxy:
    host: "{{ inventory_hostname }}"
    state: disabled
    backend: app
  delegate_to: "{{ item }}"
  loop: " {{ groups.lbserver }}"

- name: Stop the service
  service: name=httpd state=stopped

- name: Deploy a new version
  unarchive: src=app.tar.gz dest=/var/www/app

- name: Verify application state
  uri:
    url: "http://{{ inventory_hostname }}/app/healthz"
    status_code: 200
  retries: 5

为什么选择 Ansible?

还有其他应用程序部署的替代方案,但是使 Ansible 成为一个绝佳选择的因素包括

  • 多层编排(即,delegate_to)允许您有条不紊地定位不同的服务器组:监控、负载均衡器、应用服务器、数据库等。
  • 滚动升级(即,serial)来控制如何进行更改(例如,一次一个、一次 N 个、一次 X% 等)
  • 错误控制,max_fail_percentageany_errors_fatal,我的流程是全有还是全无,还是可以容忍失败?
  • 一个庞大的模块库,用于
    • 监控(例如,Nagios、Zabbix 等)
    • 负载均衡器(例如,HAProxy、F5、Netscaler、Cisco 等)
    • 服务(例如,service、command、file)
    • 部署(例如,copy、unarchive)
    • 程序化验证(例如,command、Uniform Resource Identifier)
User profile image.
DevOps 会议上的开发人员、演讲者、开源贡献者、偶尔的作家,并且痴迷于测试和自动化。 没有 CLI 工具就无法生存。

2 条评论

关于 Andibke 的精彩文章,您涵盖了所有我关心的有趣领域。 但是,我应该选择 Ansible 而不是 K8s 有什么原因吗?

Ansible 和 Kubernetes 服务于不同的目的,但有一些重叠。 如果您查看 k8s 的 Deployment 资源,它已经实现了几种策略:蓝/绿、滚动等,验证是自动化的(活性和就绪探测),pod 在准备就绪时被放置在负载均衡器(服务)后面,以及我们在示例部署剧本中涵盖的所有其他内容。 主要区别在于您需要一个容器化(最好是云原生)工作负载才能使 k8s 从中受益,而 Ansible 为更广泛的工作负载(甚至是遗留工作负载)提供相同的功能。

回复 Armstrong Foundjem

© . All rights reserved.