原文:Infrastructure as Code in a Private or Public Cloud

随着技术的进步,我们的工具也在不断变化。但是,由于大多数人抵制变革,因此往往需要某种类型的失败–系统中断、灾难恢复失败等–才能让我们改变我们的管理实践。

例如,当公司将其业务转移到云端时,他们倾向于用管理内部物理硬件的方式来管理云基础架构,即登录到虚拟基础架构的 Web 界面,或直接进入系统并通过 GUI 或 CLI 应用更改。这些用户还没有通过使用 HashiCorp Terraform 等工具来使用基础设施即代码(IaC)。

什么是 IaC?它是在定义文件中定义为代码的基础设施(CPU、内存、磁盘、防火墙等)。但为什么要改变我们定义和构建基础设施的方式呢?

虚拟计算使我们能够通过软件命令对基础设施进行构建和配置更改。虽然这些命令通常是脚本化的,但人类仍然很难读懂。更现代的工具接受人类和机器都能读懂的代码,并提供额外的好处。它们简化了代码测试,可以应用并跟踪迭代之间的变化,最重要的是,它们使团队能够在不同项目中重复使用代码组件(如模块)。难怪 IaC 会受到如此广泛的追捧和采用。

IaC 和基础设施生命周期

那么,IaC 如何融入基础设施生命周期呢?IaC 可应用于整个生命周期,既包括初始构建,也包括基础设施的整个生命周期。这些通常被称为 “第 0 天 “和 “第 1 天 “活动。”第 0 天 “代码提供并配置初始基础架构。

如果您的基础架构在初始构建后从未改变(无操作系统更新、无补丁、无应用程序配置等),那么您可能不需要支持后续更新、更改和扩展的工具。”第 1 天 “指的是在最初构建基础架构后应用的操作系统和应用程序配置。

IaC 可轻松调配和应用基础架构配置,节省时间。它通过在不同的基础架构提供商(如 VMware、AWS、Azure、GCP 等)之间使用通用语法,实现了工作流程的标准化。

IaC 易于理解基础架构更改的意图,因为它可以跨越多个文件,允许人工操作员根据意图组织代码。例如,操作员可以创建不同的文件来定义不同的基础架构组件,或者在不影响执行的情况下将变量定义从执行块中分离出来。

以下是 IaC 工具 Terraform 用来配置亚马逊 VPC 的代码示例。请注意,代码既可由人工读取,也可由机器读取。

1
2
3
resource "aws_vpc" "default" {
cidr_block = "10.0.0.0/16"
}

Terraform 等工具通常包含提供程序和模块库,便于编写代码来提供和应用配置。使用 Terraform,尤其是当只需要第 0 天时,通常会应用像下面这样的初始配置来安装和启动网络服务器:

1
2
3
4
5
6
7
provisioner "remote-exec" {
inline = [
"sudo apt-get -y update",
"sudo apt-get -y install nginx",
"sudo service nginx start"
]
}

如果需要应用第 1 天到第 N 天的配置,代码可以利用 Chef、Ansible、Docker 等工具。

1
2
3
4
**provider** "chef" {
server_url = "https://api.chef.io/organization/example"
run_list = [ "recipe[example]" ]
}

您可以在此 Hashicorp Learn 教程中找到一个更复杂的 Terraform IaC 示例,其中提供了一个双层应用程序:部署联合多云 Kubernetes 集群。

IaC 使基础设施更加可靠

IaC 使变更具有可篡改性、一致性、可重复性和可预测性。如果没有 IaC,要扩展基础设施以满足日益增长的需求,操作员可能需要远程连接到每台机器,然后通过执行一系列命令/脚本手动配置许多服务器。他们可能会打开多个会话并在屏幕之间移动,这往往会导致跳过步骤或完成工作的方式出现细微差别,从而不得不进行回滚。也许某个命令在某个实例上运行不正确,在重新正确运行之前进行了回滚。

这些流程上的不一致可能会导致服务器之间出现细微差别,随着时间的推移,这些差异会逐渐增大,并可能影响服务器的性能、可用性或安全性。如果一个庞大的团队正在应用变更,风险就会增加,因为每个人并不总是完全按照相同的指令操作。

有了 IaC,我们可以在将代码应用到目标环境之前测试代码并审查结果。如果结果与我们的预期不符,我们会反复修改代码,直到结果通过测试并符合我们的预期。按照这种模式,我们可以在将代码应用到生产环境之前预测结果。一旦准备就绪,我们就可以通过自动化大规模应用该代码,确保应用方式的一致性和可重复性。

由于代码会被检查到 GitHub、GitLab、BitBucket 等版本控制系统中,因此可以查看基础架构是如何随时间演变的。IaC 工具提供的幂等特性确保了即使多次使用相同的代码,结果也不会改变。

IaC 让基础设施更易于管理

利用 HashiCorp Terraform IaC 可以在必要时通过代码实现突变。假设已配置了一个环境,其中包含几台服务器和一个负载平衡器。为应对增加的负载,需要增加服务器。可以对 IaC 进行修改,只需最小的改动,就能使用之前定义的配置将新服务器上线。

在执行过程中,Terraform 将检查当前运行的基础架构的状态,确定当前状态与修订后的理想状态之间存在哪些差异,并指出必须应用的必要变更。如果获准继续执行,将只应用必要的变更,而不触及现有的有效基础架构。

IaC 是有意义的

成功管理基础设施的生命周期非常困难,管理决策失误可能会造成重大影响,从财务和声誉损失,到考虑到政府和军队对基础设施的依赖性时,甚至会造成生命损失。使用 IaC 工具(如 HashiCorp Terraform),并结合相关的既定工具、流程和工作流,是降低这些风险的必要步骤

要了解有关 Terraform 和 HashiCorp 其他基础架构工具的更多信息,请访问 Terraform 文档,并在 HashiCorp Learn 上查看我们的学习课程。

评论

通过 Google Trends 搜索 Infrastructure as code,发现全球范围内的趋势是自 2014 年起势以来,一致呈现波动上升的趋势,而 Related topics 第 4 位就是 Terraform。切换到 China 也就 2023 年一个波动然后戛然而止,讨论的 Subregion 也只有北京、上海、广东。

参考

  1. 翻译自Infrastructure as Code in a Private or Public Cloud