基础设施即代码解释

来自菜鸟教程
跳转至:导航、​搜索

介绍

云计算提供按需计算资源,与物理硬件和必要的底层配置解耦。 自治软件系统在云中提供这些计算资源,以实现云计算提供的自动化。 由于这种自动化,可以通过与云提供商交互以编程方式控制和操作可用资源。 通过这种方式,基础设施变更(例如资源扩展)可以更快、更可靠地实施,并且在大多数情况下无需手动交互即可运行,但仍然能够监督整个过程并在某些事情未按计划进行时恢复变更。

Infrastructure as Code (IaC) 是通过在代码中定义所需资源状态及其相互关系来自动化基础设施部署和更改的方法。 该代码是用 IaC 工具的专门的、人类可读的语言编写的。 云中的实际资源是在您执行代码时创建(或修改)的。 然后,这会提示该工具代表您与云提供商或部署系统进行交互,以应用必要的更改,而无需使用云提供商的 Web 界面。 可以随时修改代码——在代码执行时,IaC 工具将负责查找代码中所需基础设施与云中实际基础设施之间的差异,并采取措施使实际状态与所需状态相同。

为了让 IaC 在实践中发挥作用,创建的资源之后不得手动修改( 一个不可变的基础架构 ),因为这会在代码中的预期基础架构和云中的实际状态之间造成不一致。 此外,在未来的代码执行过程中,手动修改的资源可能会被重新创建或删除,并且所有此类定制都将丢失。 对此的解决方案是将修改合并到基础架构代码中。

在这篇概念性文章中,我们将探讨 IaC 方法、它的好处以及实际实现的示例。 我们还将介绍 Terraform,一种开源 IaC 配置工具。 我们将回顾 Terraform 在这种方法中的作用以及它与其他 IaC 工具的比较。

IaC 的好处

借助 IaC,您可以在多个提供者区域中从单一事实来源快速创建所需的整个基础架构实例:您的声明性代码。 这具有许多优势,可确保您始终如一地创建资源而不会出错,同时减少管理和手动设置时间。

IaC 的主要优点是:

  • 部署:取消与云提供商的手动配置交互意味着更快的部署速度。
  • Recovery:识别配置中的问题可能意味着从故障中快速恢复。
  • 一致性:每次部署资源相同,解决基础设施脆弱性。
  • Modification:修改资源可以有一个快速的周转时间。
  • 可重用性:在未来的项目中重用部分基础设施架构。
  • 版本控制:将基础设施代码存储在版本控制系统中。
  • 可见性:将配置编写为代码充当基础架构的文档。

在 IaC 工作流程中,您可以以标准化方式反复启动基础设施,这意味着软件开发和测试是一个更快的过程,因为开发、分段、质量保证测试和生产环境是分开的。 您可以根据需要多次部署基础设施,从而重复编写代码和实时测试的过程。 一旦您的书面基础设施满足所有要求,您就可以将其部署在所需的云环境中。 当出现新的需求时,您可以重复该过程。

基于代码的 IaC 应始终与版本控制软件 (VCS) 相结合,例如 Git。 将您的基础架构声明存储在 VCS 中使其易于检索,团队中的每个人都可以看到更改,并提供历史点的快照,因此如果新的修改产生错误,您始终可以回滚到早期版本。 高级 VCS 可以配置为在添加批准的更改时自动触发 IaC 工具以更新云中的基础架构。

您现在知道 IaC 方法是什么,以及它带来了什么好处。 您现在将了解状态,即 IaC 中使用的资源跟踪机制。 然后,您将跟进使用 IaC 的 Terraform 和其他工具的角色。

什么是“状态”?

在 IaC 环境中,术语“状态”是指部署中所需基础设施资源的状态。 在给定时刻至少存在三种状态:云中的实际状态、代码中呈现的理想状态以及 IaC 工具维护的缓存状态。 缓存状态描述了云中最后一次执行代码时的状态。 Terraform 允许您多次部署相同的代码,为每个部署形成多个状态。

(托管资源的)云中的实际状态应始终与工具的缓存状态相同。 执行代码时,该工具会将理想状态与缓存状态进行比较,并将检测到的差异应用到云端。 如果缓存状态和实际状态不匹配,则很可能执行失败或资源配置不正确。

Terraform 在 IaC 中的作用

Terraform 是一个开源的 IaC 资源供应工具,用 Go 编写,由 Hashicorp 开发。 它支持多个云提供商,包括 DigitalOcean。 基础设施定义是用 Hashicorp 配置语言 (HCL) 编写的,其中编写的源代码文件具有文件扩展名 tf

Terraform 通过阅读描述您的基础设施的代码并生成包含所有资源及其相互关系的图表来工作。 然后,它将其与云中资源的缓存状态进行比较,并准备一个执行计划,详细说明将应用于云的内容以及以何种顺序达到所需状态。

Terraform 中两种主要的底层组件是 providersprovisioners。 提供者负责与给定的云提供者交互,创建、管理和删除资源,而配置者用于在创建的远程资源或代码正在执行的本地机器上执行特定操作。

Terraform 支持管理基本的云提供商组件,例如计算实例、负载均衡器、存储和 DNS 记录,但由于其可扩展性,可以添加更多的提供商和供应商。

在 IaC 中,Terraform 的作用是确保云中资源的状态与代码中表达的状态相同。 它不监视已部署的资源,其主要重点不是进一步引导已配置的计算实例与软件和任务。 在下一部分中,您将了解它如何与其他工具进行比较,以及它们如何在典型的工作流程中相互扩展。

使用 IaC 的工具

IaC 方法广泛用于现代部署、 配置管理、虚拟化和编排软件。 DockerKubernetes 是用于容器创建和编排的领先工具,它们都使用 YAML 作为其语言来声明所需的最终结果。 另一方面,Hashicorp Packer 是一种用于创建部署快照的工具,它使用 JSON 来声明用于构建系统快照的模板和变量。

AnsibleChefPuppet 这三种最流行的配置管理工具都使用 IaC 方法来定义它们管理的服务器的所需状态。

Ansible 引导程序根据给定的 playbook 提供服务器。 剧本是用适当的 YAML 编写的文本文件,指示 Ansible 对现有目标资源执行哪些操作。 此类操作的示例包括运行和启动服务、使用系统提供的包管理器安装包或执行自定义 bash 命令。 要了解有关编写 Ansible 剧本的更多信息,请阅读 配置管理 101:编写 Ansible 剧本

Chef 和 Puppet 都需要在每个托管服务器上安装代理的中央服务器。 与 Ansible 不同,Chef 使用 Ruby,而 Puppet 使用自己的声明性语言来描述资源。

Terraform 与其他 IaC 工具和 DevOps 系统并不相互排斥。 它的优势在于提供硬件资源,而不是进一步的软件安装和初始服务器设置。

与 Ansible 和 Chef 等配置管理工具不同,Terraform 不适合在目标资源上安装软件和设置任务。 相反,Terraform 提供 providers 用于与其支持的资源进行交互。

Terraform 可以在单台机器上工作,并且不像其他一些工具那样需要在已配置资源上安装客户端代理的中央服务器。 它不会检查它们的实际状态并自动重新应用配置,因为它的主要重点是配置它们。 一个典型的工作流程是使用 Terraform 配置基础设施资源,然后在需要时使用配置管理工具引导它们。

对于 Chef,Terraform 有一个 内置的配置器 ,它可以在配置的远程资源上设置其客户端代理。 有了它,您可以自动将所有配置的服务器添加到主服务器,您可以在主服务器中使用 cookbooks,Chef 的基础设施声明额外配置它们。 您可以在 配置管理 101:编写厨师食谱 中了解有关编写它们的更多信息。

结论

本文介绍了 IaC 方法的范例、它相对于传统手动系统管理的优势、Terraform 作为 IaC 资源供应工具的基础知识,以及它与其他流行的基础设施自动化工具的比较。

如果您希望将基础架构即代码纳入您的工作流程,请查看我们的 Terraform 系列,了解在开发和部署过程中使用此工具的基础知识。

开始使用 Terraform 的一种方法是阅读 如何构建您的 Terraform 项目,以了解如何确保您的基础架构保持可扩展性和可扩展性。