ansible自动化部署
从底层到顶层(硬件,操作系统(OS),中间件和应用程序)及其各自的配置检查技术堆栈时,很显然,随着堆栈的增加,更改的频率要高得多。 您的硬件几乎不会改变,您的OS的生命周期很长,并且中间件可以满足应用程序的需求,但是即使您的发布周期很长(数周或数月),您的应用程序也是最不稳定的。
在《系统和网络管理实践》中 ,作者将IT中最大的“时间漏洞”归类为操作系统和应用程序部署的手动/非标准配置。 这些时间漏洞将使您厌倦重复性的任务或计划外的工作。
为何如此? 假设您在未正确配置网络时间协议(NTP)的情况下配置了新服务器,并且一小部分请求(在数十个服务器的群集中)开始表现异常,因为应用程序使用某种依赖正确时间的调度程序 。 当您这样看时,这很容易解决,但是您的团队需要花多长时间才能解决? 突发事件或计划外的工作会浪费您大量的时间,甚至更糟的是,您会浪费您的才华。 您是否真的应该浪费时间来研究这样的生产系统? 将这台服务器放在一边并从头开始自动配置一台新服务器会更好吗?
手动部署呢? 想象一下,跨服务器场或节点部署20个二进制文件及其各自的配置文件? 这有多容易出错? 不可避免地,它将最终导致计划外的工作。
《 2018年DevOps状态报告》介绍了采用DevOps的各个阶段,第0阶段包括部署自动化和部署模式的重用也就不足为奇了,而第1阶段和第2阶段则专注于基础架构堆栈的标准化,以减少环境中的不一致情况。
请注意,不止一次,我看到一个运维团队以这种“标准化”为借口来限制开发团队的交付能力,迫使他们用锤子敲打那些绝对不是钉子的东西。 不要做 ; 价格非常高。
这里要学习的教训是缺乏自动化不仅会增加交货时间,而且还会增加过程中的问题发生率以及您面临的计划外工作量。 如果您读过《凤凰计划》 ,您就会知道这是任何价值流中所有邪恶的根源,如果您不摆脱它,最终将扼杀您的业务。
还是不服气? 从开发方面来说,较小且更频繁的发行版也极为有利。 让我们进一步解释一下……
部署≠发布
首先要了解的是,尽管它们可以互换使用,但是部署和发布 并不意味着同一件事。 发布是指为用户提供新版本,而部署是部署新版本的技术过程。 让我们专注于部署的技术过程。
任务,组和Ansible
我们需要从头到尾都了解部署过程,包括中间的所有内容(任务,过程中涉及的服务器以及执行的步骤),以避免陷入Mattias Geniar在“ 自动化部署过程”中描述的陷阱。 未知数 。
任务
常规部署过程中通常执行的步骤包括:
- 部署应用程序/数据库或数据库更改
- 停止/启动服务和监视
- 从我们的负载均衡器添加/删除服务器
- 验证应用程序状态-是否准备好处理请求?
- 手动批准-是否有必要?
对于某些人来说,自动执行部署过程却需要手动批准,就像骑着带有训练轮的自行车一样。 正如有人曾经告诉我的那样:“骑行训练轮总比根本不骑行要好。”
如果工具不包含用于启用任务自动化的API或命令行界面(CLI),该怎么办? 好吧,也许是时候考虑更换工具了。 有许多易于实现自动化的开源应用程序服务器,数据库,监视系统和负载平衡器,这在很大程度上要归功于Unix方式 。 在采用新技术时,请消除非自动化的选项,并利用您的创造力来支持您的旧技术。 例如,我见过人们对网络设备配置文件进行版本控制并使用FTP更新它们。
你猜怎么着? 这是采用开源工具的绝佳时机。 最新的Accelerate:DevOps状态报告发现,高性能组织中主要使用开源技术。 逻辑很简单:开源项目以“达尔文主义”模型运作,那些不适应和发展的项目将因缺乏用户群或贡献而死亡。 反馈对于软件发展至关重要。
团体
要确定要实现自动化的服务器组,请考虑要自动化的大多数任务,例如:
- 部署应用程序/数据库或数据库更改
- 停止/启动服务和监视
- 从负载均衡器添加/删除服务器
- 验证应用程序状态-是否准备好处理请求?
剧本
高层部署过程可以是:
- 停止监视(避免误报)
- 从负载均衡器中删除服务器(以防止用户收到错误代码)
- 停止服务(以启用正常关机)
- 部署新版本的应用程序
- 等待应用程序准备好接收新请求
- 执行步骤3、2和1。
- 对接下来的N台服务器执行相同的操作。
拥有流程的文档很好,但是拥有可执行文件的部署更好! 对于完全开源的堆栈,这是Ansible中的步骤1-5的样子:
- 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成为绝佳选择的因素包括:
- 多层编排(例如, proxy_to )使您可以有序地针对服务器的不同组:监视,负载平衡器,应用程序服务器,数据库等。
- 滚动升级(即串行)以控制进行更改的方式(例如,1乘1,N乘N,一次X%等)
- 错误控制, max_fail_percentage和any_errors_fatal ,我的进程是全包进程还是容忍失败?
- 大量的模块库,用于:
- 监视(例如,Nagios,Zabbix等)
- 负载均衡器(例如,HAProxy,F5,Netscaler,Cisco等)
- 服务(例如,服务,命令,文件)
- 部署(例如,复制,取消存档)
- 程序验证(例如,命令,统一资源标识符)
翻译自: https://opensource.com/article/19/1/automating-deployment-strategies-ansible
ansible自动化部署