持续交付 (CD) 和持续集成 (CI) 是 DevOps 的两个众所周知的方面。但今天流行的 CI 缺少一个关键的“I”:基础设施。
曾经有一段时间,“基础设施”意味着无头的黑匣子、巨大的服务器机房和高耸的机架——更不用说长达数月的采购流程和倾向于盈余的负载估算。然后虚拟机的革命到来了,它使基础设施变得虚拟化——世界从此变得不一样了。我们不再需要管理实体机房。只需点击几下,我们就可以创建和销毁、启动和停止、升级和降级机器。
有一个流行的故事,讲述了一家银行实现数字化并引入在线表格,客户需要手动填写、打印并通过蜗牛邮件寄给银行。这就是我们今天的基础设施所处的状态:使用新技术以相同的老方法做事。
在本文中,我们将研究渐进式基础设施管理,将基础设施视为版本化的工件,并探讨不可变服务器的概念。在后续的文章中,我们将研究如何使用开源工具来实现持续基础设施。

实践中的持续基础设施管道
这是熟悉的 CI、尽早发布、频繁发布周期管道。此管道缺少一个关键组件:基础设施。
小测验
- 您如何创建和升级您的基础设施?
- 您如何控制和跟踪对基础设施的更改?
- 您的基础设施如何随您的业务扩展?
- 您如何确保在正确的基础设施配置上进行测试?
要回答这些问题,请引入持续基础设施。将 CI 构建管道拆分为持续集成代码 (CIc) 和持续集成基础设施 (CIi),以并行开发和构建代码和基础设施,合并两者以进行统一的测试和发布。让基础设施成为 CI 管道中的头等公民。

包含基础设施的 CI 管道
CIi 的定义方面包括
1. 代码
通过代码而不是安装来创建基础设施。基础设施即代码 (IaC) 是用于从配置脚本开发基础设施的现代方法。这些脚本遵循典型的编码和单元测试开发生命周期(有关示例,请参见下面的 Terraform 脚本)。
2. 版本
IaC 工件在源代码存储库中进行版本控制。这为基础设施带来了版本控制的所有优势:一致性、可追溯性、分支和标记。
3. 管理
借助编码和版本化的基础设施,您可以应用熟悉的测试和发布流程来管理基础设施开发。
CIi 提供以下优势
1. 一致性
版本化和标记的基础设施意味着您可以明确地了解您正在使用的系统的组件和配置。这建立了一个出色的 DevOps 实践,以一致地识别和管理基础设施。
2. 可重复性
借助标记和基线化的基础设施,重新创建基础设施很容易。想想您听过多少次这句话:“但这在我的机器上可以工作!” 现在,您可以在本地测试台上快速重现类似生产的环境,以消除环境作为调试周期的变量。
3. 可追溯性
您有多少次回顾历史以找出谁更改了文件夹的权限,或者谁升级了 ssh 包?编码、版本化、发布的基础设施消除了临时更改,为基础设施管理带来了易于追溯性和可预测性。
4. 自动化
借助可编写脚本的基础设施,自动化是下一个逻辑步骤。自动化使您可以按需创建基础设施并在完成后销毁它,因此您可以将宝贵的时间和精力集中在更高效的任务上。
5. 不可变性
CIi 带来了诸如不可变基础设施之类的创新。您可以简单地创建新的基础设施组件,而不是升级(请参阅下面关于不可变基础设施的注释)。
持续基础设施是关于使用运行工件来发展运行环境。像对待代码一样对待基础设施,并通过经过验证的 DevOps 流程。传统的 CI 被重新定义为包含缺失的“i”,从而形成连贯的 CD。
(CIc + CIi) = CI → CD
基础设施即代码 (IaC)
CIi 管道的关键推动因素是基础设施即代码 (IaC)。IaC 是使用配置文件创建和升级基础设施的机制。这些配置文件像代码一样开发,并在版本控制系统中进行版本控制。这些文件遵循通常的代码开发生命周期:单元测试、提交、构建和发布。IaC 流程为基础设施开发带来了版本控制的所有优势,例如标记、版本控制一致性和变更可追溯性。
这是一个示例 Terraform 脚本,用于在 AWS 上创建两层基础设施,包括虚拟私有云 (VPC)、弹性负载均衡器 (ELB)、安全组和 NGINX 服务器。Terraform 是一种开源工具,可通过脚本创建和更改基础设施。

用于在 AWS 上创建两层基础设施的示例 Terraform 脚本。
完整的脚本可在 GitHub 上找到。
不可变基础设施
您有多个 VM 正在运行,需要应用安全补丁。一种常见的方法是使用远程推送脚本单独更新所有系统。
与其更新旧系统,不如抛弃它们并部署安装了安全补丁的新系统怎么样?这就是不可变基础设施。由于以前的基础设施版本已进行版本控制和标记,因此安装补丁只是更新脚本并将其推送到发布管道的问题。
现在您明白为什么基础设施应该成为 CI 管道中的头等公民了吗?
6 条评论