基础设施即代码(IaC)完全指南:自动化运维的未来

基础设施即代码(IaC)是一种通过软件代码来定义和管理IT基础设施的实践方法,能够实现资源的自动化配置、部署和管理,提高运维效率和一致性。

什么是基础设施即代码(IaC)?

基础设施即代码(IaC)是一种IT实践,通过代码形式来定义和管理底层IT基础设施。它使开发人员和运维团队能够自动管理、监控和配置资源,而不是手动配置硬件设备、操作系统、应用程序和服务。IaC也被称为可编程基础设施或软件定义基础设施。

IaC的概念类似于编程脚本,都能实现IT流程的自动化。然而,脚本主要用于在多个服务器上重复执行一系列静态步骤,而IaC使用更高级的描述性语言来编写更通用、适应性更强的配置和部署流程。

例如,IT管理和配置工具Ansible中的IaC功能可以安装MySQL服务器、验证其是否正常运行、创建用户帐户和密码、设置新数据库并删除不需要的数据库。

基于代码的基础设施自动化过程类似于软件设计实践,应用程序开发团队在其中开发声明性代码、控制代码版本、测试迭代,并在软件获得生产环境批准之前限制部署。

IaC的工作原理

简单来说,IaC使用软件代码来配置和管理IT基础设施。通过使用代码定义期望的IT结果,组织可以提高基础设施的一致性、安全性、自动化和性能。

手动配置和配置服务器、存储、网络、操作系统、应用程序以及其他设备和服务(如数据库、负载均衡器和防火墙)需要大量时间和精力。人工为企业工作负载和数据提供合适的部署环境可能需要数小时甚至数天时间。人为错误可能渗入这种手动工作的许多方面,导致以下问题:

  • 结果不一致,没有两个环境完全相同
  • 设置和配置不正确导致安全漏洞
  • 基础设施文档不完善或缺失导致故障排除困难
  • 安全和故障排除问题导致的合规性和业务连续性问
  • 有问题的管理和变更控制

IaC将所有构建和部署所需IT环境的指令具体化为软件实体。开发人员和IT人员可以创建详细指令来评估所需步骤并衡量代码结果。

基础设施代码提供可重现的结果,可以通过按钮触发或在特定条件下执行。它为配置和管理带来了高水平的自动化。

变更管理更加容易,因为对基础设施代码的任何修改都会产生一个新版本,该版本有完善的文档记录,并且可以通过任何标准版本控制系统进行管理。如果变更导致问题,可以通过运行先前已知良好的代码版本来纠正。这简化了故障排除,并提高了业务的合规性和安全性。

以下四种基本类型的IaC通常结合使用:

  • 脚本通常用于自动化简单的临时任务
  • 配置管理代码定义并自动化设备的安装和配置,如服务器
  • 配置代码自动化设置整体基础设施,将环境的各个方面连接起来
  • 容器代码依赖模板来定义包含部署和执行应用程序所需库和依赖项的镜像文件

IaC过程通常涉及以下三个步骤:

  1. 开发人员使用领域特定语言为所需基础设施创建规范
  2. 规范文件被发送或暂存到服务器或存储库(如GitHub)或API
  3. IaC平台使用规范文件自动或按需创建和配置预期的基础设施

IaC方法:声明式与命令式

基础设施即代码工具使用声明式和命令式方法进行操作。

声明式方法 声明式编程方法概述了基础设施的期望状态,但没有明确列出达到该状态的步骤。它声明了一个预期目标,并允许底层IaC工具决定如何实现这些目标。一个常见的声明式编程语言是结构化查询语言(SQL)。亚马逊网络服务(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,采用基于代码的方法来管理所有资源。了解一切即代码的工作原理,并查看它是否适合您的组织。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计