什么是基础设施即代码(IaC)?
基础设施即代码(IaC)是一种将底层IT基础设施编码并作为软件管理的IT实践。它使开发人员和运维团队能够自动管理、监控和配置资源,而不是手动配置硬件设备、操作系统、应用程序和服务。IaC也被称为可编程或软件定义基础设施。
IaC的概念类似于编程脚本,后者可以自动化IT流程。然而,脚本主要用于自动化在多个服务器上重复多次的一系列静态步骤。IaC使用更高级的描述性语言来编码更通用和自适应的配置和部署流程。
例如,IT管理和配置工具Ansible包含的IaC功能可以安装MySQL服务器、验证其是否正常运行、创建用户帐户和密码、设置新数据库并删除不需要的数据库。
基于代码的基础设施自动化过程类似于软件设计实践,应用程序开发团队在其中开发声明性代码、控制代码版本、测试迭代并限制部署,直到软件获准投入生产。
IaC还与云计算有着相同的抽象IT资源的目标,但它自动化了整个流程——从配置和部署到管理。IaC还用于配置和管理云基础设施,使用云提供商的应用程序编程接口(API)来访问和与提供商的资源和服务交互。
基础设施即代码如何工作?
简单来说,IaC使用软件代码来配置和管理IT基础设施。通过使用代码定义所需的IT结果,组织可以提高基础设施的一致性、安全性、自动化和性能。
手动配置和配置服务器、存储、网络、操作系统、应用程序以及其他设备和服务(如数据库、负载均衡器和防火墙)涉及大量时间和精力。人类可能需要数小时甚至数天才能为企业工作负载和数据提供合适的部署环境。人为错误可能渗入这种手动工作的许多方面,导致以下问题:
- 结果不一致,没有两个环境是相同的
- 设置和配置不正确时出现安全漏洞
- 基础设施文档不完善或不存在时故障排除困难
- 由安全和故障排除问题引起的合规性和业务连续性问題
- 有问题的管理和变更控制
IaC将所有构建和部署所需IT环境的指令具体化为一个软件实体。开发人员和IT人员可以创建详细指令来评估所需步骤并衡量代码结果。
基础设施代码提供可重现的结果,可以通过按按钮或响应特定条件来执行。它为配置和管理带来了高水平的自动化。
变更更易于管理,因为对基础设施代码的任何修改都会产生一个新版本,该版本有详细文档记录,并且可以通过任何标准版本控制系统进行管理。如果由于变更而出现问题,可以通过运行先前已知良好的代码版本来纠正。这简化了故障排除,并提高了企业的合规性和安全性。
以下四种基本类型的IaC通常结合使用:
- 脚本通常用于自动化简单的临时任务
- 配置管理代码定义并自动化设备(如服务器)的安装和配置
- 配置代码自动化设置整体基础设施,将环境的各个方面联系在一起
- 容器代码依赖模板来定义包含部署和执行应用程序所需的库和依赖项的镜像文件
IaC过程通常涉及以下三个步骤:
- 开发人员使用领域特定语言为所需基础设施创建规范
- 规范文件被发送或暂存到服务器或存储库(如GitHub)或API
- IaC平台使用规范文件自动或按需创建和配置预期基础设施
IaC使IT团队能够将数据中心的物理资源、服务和离散配置转化为代码,以自动配置和管理这些资源。
IaC方法:声明式与命令式
基础设施即代码工具使用声明式和命令式方法操作。
声明式方法
声明式编程方法概述了基础设施的所需预期状态,但没有明确列出达到该状态的步骤。它声明了一个预期目标,并允许底层IaC工具决定如何实现这些目标。一个众所周知的声明式编程语言是结构化查询语言(SQL)。Amazon Web Services (AWS) CloudFormation模板等是以声明式风格编写的基础设施即代码。
命令式方法
命令式编程方法定义了使基础设施达到所需状态的命令。它定义了实现预期结果的确切步骤及其顺序,并且不偏离这些步骤。面向对象的语言,如C++和Java,可以用于命令式编程。像Chef这样的工具可以根据需要以声明式或命令式使用。
在这两种方法中,IaC都在模板上配置,用户在模板中指定基础设施中每个服务器所需的资源。模板用于验证系统是否正确配置或已适当设置。模板可以构建为一组资源层,如在AWS CloudFormation中,它构成一个堆栈。
IaC最佳实践
IaC涉及具有高度自动化的基础设施配置和基础设施管理。虽然没有部署和使用IaC的通用方法,但许多最佳实践有助于简化这些部署。标准的IaC最佳实践包括:
-
使用版本控制:通过软件配置和配置基础设施意味着IaC遵循许多软件开发最佳实践,例如强大的版本控制。组织应为IaC文件使用存储库、全面的版本控制以及强大的文档和记录保存,以跟踪谁访问了文件以及版本之间发生了哪些更改。
-
不共享密钥:IaC中涉及的许多配置元素需要密码或加密证书。这些通常在没有保护的情况下包含在IaC文件中,可能暴露敏感系统并危及安全。使用单独的密钥管理器以受保护的方式存储身份和访问管理详细信息。
-
保持文件安全:IaC旨在拥抱与其他DevOps和敏捷软件设计相同的协作态度。然而,IaC文件可能包含知识产权、密钥或其他敏感内容。将它们与企业使用的其他源代码一样保持安全非常重要。
-
测试和验证文件:IaC文件永远不应被视为理所当然。在发布到生产环境之前,应以与其他软件测试相同的方式对它们进行测试和验证。这通常涉及使用持续集成/持续交付(CI/CD)、DevOps和敏捷技术。
-
使用较小的文件:可以使用几个较小的IaC文件来执行特定任务,然后通过脚本或另一个IaC模板连接。使用大量较小的文件可以实现更好的模块化,并促进IaC文件的重用,而不是创建和维护一个单一的大型通用文件来完成所有工作。
-
监控和纠正漂移:当正确实施并密切关注不变性时,IaC理想情况下不应允许配置漂移。然而,由于系统问题、故障排除和人为错误,漂移仍然可能发生。必须监控基础设施环境,将环境与IaC定义进行比较以发现漂移实例,并记录和纠正任何实例。
-
使用代码作为单一事实来源:IaC应作为基础设施配置的参考点。将IaC代码视为单一事实来源应有助于确保环境之间的一致性,最小化依赖关系并减少可能手动发生的错误。
-
专注于不可变基础设施:软件定义了基础设施。对于IaC,应使用不可变基础设施方法。一旦代码被配置和部署,就不应对基础设施进行更改。如果需要更改,应删除当前基础设施,并使用新版本的IaC文件部署新基础设施。这防止了任何配置漂移的可能性。
可变与不可变基础设施
可变基础设施指的是在生产中更改组件,而整体服务或应用程序正常运行。不可变基础设施组装和设置组件和资源以创建完整的服务或应用程序。如果任何组件需要更改,它不会被更改或重新配置;它会在一个实例中全部更新并有效地重新部署。一个新的迭代被组装、测试、验证和启动,而旧的迭代被停用,其资源被释放以供重用。
不可变基础设施已经获得青睐,特别是对于高度可扩展且涉及许多相互依赖的组件和服务的云和微服务环境。任何针对特定问题的一次性更新都可能导致配置漂移,随着更新迅速推送到生产环境而级联。重新发布不可变服务和组件集比修补和重新配置单个基础设施组件更有效。IaC强调使用不可变基础设施技术,尽管不变性不是IaC的先决条件。
基础设施即代码的优势和挑战
IaC有许多优势,从自动化效率到与其他现代IT实践相结合的灵活性。其他IaC优势包括:
-
速度和效率:自动化配置和管理比手动流程更快、更高效。这扩展到配置的资源和虚拟化、数据库、网络、用户帐户管理和其他关联服务。IaC还可以包括通过添加或关闭不再需要的环境和资源来自动扩展的代码。
-
一致性:软件开发人员可以使用代码根据业务实践和政策来配置和部署服务器和应用程序——而不是在DevOps环境中依赖系统管理员。开发人员可能会创建一个配置文件来配置和部署新应用程序以进行质量保证或实验性部署,然后运维接管在生产环境中的实时部署。
-
问责制:代码和相应的存储库管理为记录IaC代码提供了坚实的基础。很容易看到诸如谁开发了每个版本以及IaC代码版本之间发生了哪些更改等因素。这加强了业务合规性和代码质量标准。
-
投资回报:实施IaC需要大量投资,但在速度、效率、一致性、合规性、故障排除和自动化方面的回报通常值得投资。IaC将以小时计的手动流程替换为以分钟计的自动化流程。它消除了与手动基础设施配置和配置相关的许多问题。
-
与DevOps对齐:编写为代码的基础设施设置可以经历与开发人员用于应用程序代码相同的版本控制、自动化测试和CI/CD管道的其他步骤。组织可能会将IaC与容器结合,容器在操作系统级别将应用程序从基础设施中抽象出来。由于操作系统和硬件基础设施是自动配置的,并且应用程序是封装的,这些技术被证明对于不同的部署目标(如测试、暂存和生产)是互补的。
-
共享资源:IaC改进了在使用相同资源的其他系统上复制基础设施。在这种用途中,IaC提供了一致性,并有助于简化故障排除流程。
尽管有其优势,IaC也带来了一些缺点,包括:
-
需要额外工具:基础设施即代码需要额外的IaC特定或IaC能力工具,如配置管理工具和自动化与编排系统,这可能会引入学习曲线和错误。错误可以通过服务器快速扩散,特别是在广泛的自动化情况下,因此监控版本控制和执行全面的预发布测试至关重要。
-
功能缺失:IaC工具提供了各种强大的特性和功能,但有些可能不完整或缺失。评估和审查工具非常重要,特别是针对业务需求,并保持对每个工具提供商产品或功能路线图的仔细监督。
-
现有工具的复杂性:将新工具、流程和标准引入DevOps和运维环境可能会给已有流行工具和平台的领域增加复杂性。需要企业范围内的支持,IaC才能为企业提供持久且有意义的益处。
-
配置漂移的可能性:如果管理员在设置的IaC模板之外更改服务器配置,在没有额外变更管理工具的情况下,有可能发生配置漂移。将IaC完全集成到系统管理、IT运维和DevOps实践中,并制定有详细记录的政策和程序非常重要。如果传统安全和监控工具无法处理IaC,这将需要投资更多工具,并进行额外培训和测试以将其集成到工作流程中。
-
能力差距:IaC将更多责任放在开发人员身上,要求他们了解如何编写能无缝转化为生产环境的高效代码。他们还必须对用于IaC的语言有深入了解,包括JavaScript对象表示法(JSON)、YAML、Ruby、C++和SQL。知识渊博的员工可能更难找到和留住。
基础设施即代码工具
IaC工具配置和自动化基础设施配置。这些自动化工具可以自动执行基础设施部署,例如具有编排功能的服务器。它们还可以配置和监控先前配置的系统。
IaC工具使用推送或拉取方法强制执行模板中的设置。在推送方法中,集中式服务器将所需配置发送到特定系统或系统。拉取方法由基础设施中一个或多个系统向集中式服务器发起请求启动。工具通常默认设计用于代码的推送或拉取部署,但可以为特定实例设置执行相反操作。这些工具还应能够在更新出现意外问题时回滚对代码的更改。
以下是IaC工具的示例:
- AWS CloudFormation
- Chef
- Google Cloud Deployment Manager
- Microsoft Azure Resource Manager
- Puppet
- Red Hat Ansible Automation Platform
- HashiCorp的Terraform
- VMware Tanzu Salt
一些工具依赖于领域特定语言,而其他工具使用标准模板格式,如JSON和YAML。
组织应考虑目标部署环境并为该环境选择工具。例如,AWS CloudFormation设计用于在AWS上配置和管理基础设施,并与其他AWS产品配合使用。类似地,Microsoft Azure Resource Manager管理Azure平台上的基础设施,而Google Cloud Deployment Manager是Google的基础设施部署服务。或者,Chef与本地服务器和多个云提供商的基础设施即服务产品配合使用。
IT运维可以超越IaC,采用基于代码的方法来管理其所有资源。了解一切即代码的工作原理,并查看它是否适合您的组织。