基础架构即代码 (IaC) 是使用代码和软件开发技术配置和管理基础架构的实践。IaC 背后的主要思想是消除每次部署时对服务器、负载均衡器或数据库等资源的手动基础设施配置和配置的需要。由于基础架构现在是整个软件开发过程中不可或缺的一部分,并且与应用程序交付的耦合度越来越高,因此让交付基础架构更改变得更加容易非常重要。
使用代码定义和管理基础架构及其配置使您能够采用版本控制、测试和自动部署等技术。这使得更容易防止各种应用程序问题,从性能瓶颈到功能故障。
本文将解释 IaC 的工作原理,重点介绍这两种方法,以及在 DevOps 环境中以代码形式交付基础设施的优势和挑战。
从历史上看,基础架构管理主要是由专门的系统管理员完成的手动过程。您需要手动创建虚拟机 (VM)、管理其软件更新并配置其设置。这变得非常昂贵和耗时,尤其是随着现代软件开发的快速发展。
IaC 演变为可扩展基础架构管理的解决方案。它允许您对基础架构进行编码,然后能够创建标准化、可重用和可共享的配置。IaC 还允许您以代码文件的形式定义基础设施配置。例如,图 1 演示了如何使用 CloudFormation在 AWS 中定义 S3 存储桶的创建。
Resources: S3Bucket: Type: 'AWS::S3::BUCKET' DeletionPolicy: Retain Properties:BucketName: DOC-EXAMPLE-BUCKET
当您将基础架构定义为代码时,您可以实施与应用程序开发代码相同的做法,例如版本控制、代码审查和自动化测试。
图 1:IaC 工作流程
要实施 IaC,您可以使用各种工具和技术,例如:
有两种不同的基础架构即代码方法:命令式(过程式)IaC 和声明式(功能性)IaC。
使用命令式方法,开发人员指定 IaC 创建配置所需遵循的确切步骤。用户完全命令自动化,这使得这种方法对于需要完全控制的更具体的用例很方便。
命令式方法的主要优点是它允许您自动执行基础架构配置的几乎每个细节。这也意味着您需要更高水平的专业知识来实现这种类型的自动化,因为它主要是通过直接在系统上执行脚本来完成的。
以下是使用 AWS CLI 创建 S3 存储桶的命令式方法示例:
aws s3api create-bucket --bucket my-new-bucket --region eu-central-1
my-new-bucket当您运行此命令时,AWS CLI 将使用该区域中的名称创建一个新的 Amazon S3 存储桶eucentral-1。
使用声明性方法,开发人员指定所需的结果,而无需提供实现该状态所需的确切步骤。用户通过 JSON 或 YAML 等声明性语言描述他们希望基础架构如何查看。此方法有助于标准化、变更管理和云交付。可以更快地发布功能,并显着降低人为错误的风险。
以下是使用 AWS CloudFormation 的声明性基础设施即代码的简单示例:
{“Resources”: {“EC2Instance”: {“Type”: “AWS::EC2::Instance”,“Properties”: {“InstanceType”: “t2.micro”,“ImageId”: “ami-0c94855bac71e”,“KeyName”: “my-key” } }}}
该脚本告诉 CloudFormation 创建一个类型为 EC2 的实例t2.micro,CloudFormation 将处理所有必需的步骤以使用您定义的特定属性实现该状态。
图 2:IaC 方法概述
基础架构即代码是 DevOps 中的关键实践之一,提供了许多节省时间和金钱以及降低风险的好处。但与您在组织中采用的任何工具、解决方案或实践一样,重要的是要权衡实施 IaC 方法时可能面临的挑战。
表 1:IaC 优势与挑战——需要考虑的因素
借助 IaC,系统可以轻松复制和重用;过程是一致的。随着 DevOps 文化变得越来越普遍,通过 IaC 保持战略优势可能会成为一个越来越重要的目标。如果您所在的组织旨在在其现有流程中实施基础架构即代码,那么了解您的团队可能遇到的好处和挑战会很有帮助。诀窍是在了解您的业务基础设施需求和认识到 IaC 提供的改进潜力之间找到一个很好的界限。
为确保正确实施 IaC,从小事做起很重要。您希望逐渐增加任务的复杂性,避免使代码库过于复杂,持续监控 IaC 实施以确定需要改进和优化的领域,并继续自学 IaC 中的不同工具、框架和最佳实践。
查看这些额外资源以继续了解 IaC: