一、历史的选择
随着软件迭代速度快,且复杂度的上升,组织结构和职能发生了变化。
- 第一阶段,开发(Dev)和运维(Ops)组织分开,开发负责编写软件,运维负责管理硬件。→问题: 跨团队协作,开发和运维环境不一致,运维人员大多数部署通过手动完成,代码冲突、服务故障和停机频繁。
- 第二阶段,上云计算平台,运维团队任务从硬件管理转移到编写软件管理,需要编写代码,这样开发和运维都需要编写代码,所以Dev和Ops合并,演化成
DevOps
。
DevOps自动化的目标是将软件交付过程自动化。所以落实到管理基础设施方面,也要尽可能多地通过代码来实现,减少点击网页或手动执行Shell命令的方式,即采用IaC(基础设施即代码)。
二、走进IaC
IaC(Infrastructure as Code)即基础设施即代码,核心思想为通过编写和执行代码来定义、部署、更新和销毁基础设施。
它是一种观念的转变,其将运维的各个工作都视为与软件相关,甚至一些明显针对硬件的工作,即将所有事物都在代码中进行管理,包括
- 服务器
- 数据库
- 网络
- 日志文件
- 应用程序配置
- 文档
- 自动化测试,部署过程
2.1 IaC解决方案的价值
- 版本控制(可Review)
- 建立CI/CD自动化(不依赖于UI操作,减少人为错误)
- 重复使用(减少时间上的浪费)
- 环境切换控制(保持生产、预发、测试环境的一致性,平滑切换)
- 团队成长和协作(文档分享)
总的来说,周而复始的手动管理基础设施,难免枯燥乏味,如此工作,既无创意又无挑战,使用Iac在改进我们工作的同时,让我们关注更有价值的事情。
2.2 IaC工具分类
IaC
是一种思想,实现这种思想的工具有很多,大致分为五大类。
- 专项脚本(为每一项任务写一个专项脚本,比如配置docker环境,配置web服务等。其维护难度相当大,可针对小规模、一次性的任务。)
- 配置管理工具(Chef、Puppet、Absible、SaltStack属于此类,目的是在现有服务器上安装和管理软件,优于专项脚本,可用作大规模、分布式、统一管理的场景)
- 服务器模板工具(Docker、Packer、Vagrant属于此类,使用容器镜像、虚拟机(VM)的方式拥有一个完全独立的服务器,然后在所有服务器上统一安装)
- 编排工具(管理服务器模板工具创建虚拟机和容器等,具体实现包括K8s,Marathon/Mesos、AmazonElastic Container Service(Amazon ECS)、Docker Swarm和Nomad等等)
- 服务开通工具(创建云资源,比如服务器,网络、防火墙设施、路由规则、负载均衡等等,具体实现包括Terraform、CloudFormation、OpenStack Heat、Pulumi等等)