为了实现规模化,DevOps 团队始终正在寻找使用受信任且可重复的过程快速部署代码的方法。 在云和基础结构方面,此过程越来越多地通过基础结构即代码(IaC)完成。 IaC 工具的范围从常规用途工具到适用于特定环境的工具。 Terraform 是前者的示例,而 Bicep 旨在处理与 Azure 相关的任务。
在本文中,我们将比较 Bicep 和 Terraform 的 9 个基础结构和集成功能。 了解这些差异有助于确定哪种工具最能支持基础结构和进程。
状态和后端
Terraform 和 Bicep 都是所需的状态配置 (DSC),因此可以轻松地将 IT 和开发基础结构作为代码进行管理。 Terraform 存储托管基础结构和配置的状态。 Terraform 使用此信息将实际资源映射到配置、跟踪元数据并提高大型基础结构的性能。 状态存储在命名 terraform.tfstate
的本地文件中,但也可以 远程存储。 备份和保护状态文件至关重要。 和 Terraform 一样,Bicep 是声明性的,也是追求目标。 但是,Bicep 不存储状态。 相反,Bicep 依赖于增量部署。
基础结构目标
将 Bicep 与用于管理云基础结构的 Terraform 进行比较时,请务必考虑目标云环境:
Bicep 是特定于 Azure 的,不适用于其他云服务。
如果目标是自动部署到以下任何环境,Terraform 可能是更好的选择:
- 虚拟化环境
- 多云方案 - 例如 Azure 和其他云(s)
- 本地工作负荷
Terraform 使用称为 提供程序的插件与其他云提供程序或 API 进行交互。 有几个 Terraform Azure 提供程序 可用于管理 Azure 基础结构。 编码 Terraform 配置时,请指定正在使用的必需提供程序。 运行 terraform init 时,将从代码中安装和使用指定的提供程序。
命令行接口(CLI)工具通过自动化技术的实现和管理在业务流程中发挥关键作用。 Bicep 和 Terraform 都提供 CLI 工具。
Bicep 与 Azure CLI 集成,允许开发人员使用 az
以下命令,例如:
az bicep
:az bicep 命令允许执行安装 Bicep 以及生成和发布 Bicep 文件等任务。
az deployment
:有关如何使用 Bicep 和 Azure CLI 部署资源的文章介绍了如何将 Azure CLI 与 Bicep 文件配合使用,将资源部署到 Azure。
使用 Terraform CLI 可以执行验证和格式化 Terraform 代码等任务,并创建并应用执行计划。
Bicep 还提供一项功能,可轻松地将 Bicep 与 Azure Pipelines 集成。 Terraform 提供类似的功能,但必须下载并安装适用于 Visual Studio 的 Azure Pipelines Terraform Tasks 扩展。 安装后,可以从 Azure Pipelines 运行 Terraform CLI 命令。 此外,Terraform 和 Bicep 都支持 GitHub Actions 来自动执行软件生成、测试和部署。
Processing
Bicep 和 Terraform 在部署效率和优化方面存在一些重要差异。 使用 Bicep 时,处理在核心 Azure 基础结构服务端进行。 此功能提供一些优势,例如预检处理来检查策略或可用性,以便在一个区域内部署多个实例。 使用 Terraform 时,处理在 Terraform 客户端中完成。 因此,预处理不涉及对 Azure 的调用,因为它使用状态和 HCL(HashiCorp 语言)来确定所需的更改。
身份验证
Azure 身份验证功能在 Bicep 和 Terraform 之间有所不同。 在 Bicep 中,在提交 Bicep 文件和 ARM 模板的请求期间提供授权令牌。 ARM 可确保你有权在指定的模板中创建部署和部署资源。 Terraform 基于提供程序凭据(例如 Azure CLI、服务主体或 Azure 资源的托管标识)对每个 API 进行身份验证。 此外,可以在单个配置中使用多个提供程序凭据。
Azure 集成
还应考虑使用 Azure Policy 等 Azure 功能,以及每个功能如何与其他工具和语言交互。 Bicep 的预检验证确定资源是否不符合策略,以便在部署之前失败。 因此,开发人员可以使用提供的 ARM 模板通过策略修正资源。 ARM 模板可用于为另一个资源创建策略分配,以便自动修正。 但是,部署由于策略而不允许的资源时,Terraform 会失败。
门户集成
Bicep 在 Terraform 上拥有的一个主要优势是能够自动执行门户操作。 使用 Bicep,可以使用Azure 门户导出模板。 导出模板有助于了解部署资源的语法和属性。 可以通过从导出的模板开始,并对其进行修改以满足你的需求来自动执行将来的部署。 在支持 Terraform 模板之前,需要手动翻译导出的模板。
尽管 Terraform 不提供与 Bicep 相同的门户集成,但可以使用适用于 Terraform 的 Azure 导出在 Terraform 管理下使用现有 Azure 基础结构。 (适用于 Terraform 的 Azure 导出是 Microsoft 在 上 拥有和维护的开源工具Azure/aztfexport GitHub 存储库。)
带外更改
带外配置更改是在工具上下文之外对设备配置所做的更改。 例如,假设你使用 Bicep 或 Terraform 部署虚拟机规模集。 如果使用门户更改虚拟机规模集,则更改将是“带外”,并且 IaC 工具未知。
如果使用 Bicep,则应将带外更改与 Bicep 和 ARM 模板代码进行协调,以避免在下一部署中覆盖这些更改。 这些更改不会阻止部署。
如果使用 Terraform,则需要将带外更改导入 Terraform 状态并更新 HCL。
因此,如果环境涉及频繁的带外更改,Bicep 会更加用户友好。 使用 Terraform 时,应尽量减少带外更改。
云框架
云采用框架(CAF)是一系列文档、最佳做法和工具,可在整个云旅程中加速云采用。 Azure 提供用于部署登陆区域的本机服务。 Bicep 使用基于 ARM 模板和登陆区域实现的门户体验简化了此过程。 Terraform 利用 企业规模登陆区域模块 来部署、管理和操作 Azure。
总结
Bicep 和 Terraform 提供了许多用户友好的基础结构和集成功能。 这些功能使实现和管理自动化技术变得更加容易。 在确定最适合你的环境时,请务必考虑是部署到多个云,还是基础结构由多云环境或混合云环境组成。 此外,请务必考虑本文中讨论的 9 项功能,以便为组织做出最佳选择。
如今的组织面临着动态挑战,这些挑战需要大量的灵活性和敏捷性。 公有云环境通过自动化来满足这些需求,特别是通过基础结构即代码(IaC)。 两个主要的 IaC 选项是 Hashicorp Terraform 和 Bicep。 Terraform 是一种开源工具,可帮助 DevOps 专业人员使用声明性代码管理本地和云服务。 Microsoft Bicep 利用声明性语法来简化 Azure 资源的部署。
在本文中,我们将比较几个关键的用户体验功能,以确定 Terraform 和 Bicep 之间的相似性和差异。
语言语法
Bicep 和 Terraform 是特定于域的语言(DSL),易于使用并节省开发人员时间。 这两种工具都包含类似的关键字 (keyword)和概念。 其中一些概念是参数化、对多文件项目的支持,以及对外部模块的支持。 但是,Terraform 为某些任务提供了更丰富的内置功能库。 在两者之间做出决定是偏好和经验的问题。 以下是每个语言语法提供的简要概述和一些用户友好功能。
Bicep 是一种声明性语言。 因此,在代码中定义元素的顺序不会影响部署的处理方式。 Bicep 的默认目标范围是 resourceGroup
。 用户可以使用变量来封装复杂表达式,并使 Bicep 文件更易于阅读。 模块的概念允许跨项目或团队重复使用 Bicep 代码。
Terraform 也是使用 HashiCorp 配置语言(HCL)的声明性语言。 HCL 的主要用途是声明资源。 其他语言功能有助于更方便地定义资源。 与 Bicep 一样,Terraform 配置文件中的代码排序并不重要。
语言帮助程序
Bicep 和 Terraform 都提供 语言帮助程序 来简化编码任务。 由于两者都是用户友好的,选择在很大程度上取决于首选项和要求。
Bicep 支持表达式,使代码更具动态性和灵活性。 可以在 Bicep 文件中使用不同类型的函数。 其中一些函数类型是逻辑函数、数字函数和反对函数。 循环可以定义资源、模块、属性、变量或输出的多个副本。 循环有助于避免在 Bicep 文件中重复语法。
Terraform 还提供从表达式内部调用的内置函数,用于转换和合并值。 与 Bicep 一样,Terraform 表达式可以包含复杂的表达式,例如对资源导出的数据和条件计算的引用。 循环可以处理集合,并且可以生成资源的多个实例,而无需重复代码。
模块
Bicep 和 Terraform 都支持模块的概念。 通过模块,可以从代码创建可重用组件。 模块在缩放基础结构和保持配置干净方面发挥着关键作用。 由于模块封装了一组资源,因此它们减少了必须为类似基础结构组件开发的代码量。 虽然模块在 Bicep 和 Terraform 中同样运作,但它们在实现上有所不同。
在 Bicep 中,模块只是从另一个 Bicep 文件部署的 Bicep 文件。 Bicep 模块有助于提高 Bicep 文件的可读性。 这些模块也是可缩放的。 用户可以跨团队共享模块,以避免代码重复并减少错误。 有关定义 Bicep 模块的详细信息,请参阅 Bicep 模块。
在 Terraform 中, 模块 是跨团队打包和重用资源配置的主要手段。 Terraform 模块是打包为单个逻辑单元的多个资源的容器。 模块由存储在目录中的 .tf
集合和/或 .tf.json
文件组成。 除了本地文件系统中的模块外,Terraform 还可以从各种源加载模块。 这些源包括注册表、本地路径、模块和 GitHub。
预配生命周期
Terraform 和 Bicep 都允许开发人员在部署之前验证配置,然后应用更改。 Terraform 提供更大的灵活性来销毁由特定配置管理的所有远程对象。 完成工作后,此功能可用于清理临时对象。 选择最佳选项时,必须考虑典型基础结构部署的生命周期要求。
Bicep 提供了一项 假设 操作,可用于在部署 Bicep 文件之前预览更改。 Azure 资源管理器提供操作what-if
,不会对现有资源进行任何更改。 然后,可以将 Azure PowerShell 或 Azure CLI 与 Bicep 文件配合使用,将 资源部署到 Azure。 Azure PowerShell 和 Azure CLI 不支持部署远程 Bicep 文件。 但是,可以使用 Bicep CLI 将 Bicep 文件生成到 JSON 模板,然后将 JSON 文件加载到远程位置。
在 Terraform 中 ,terraform 计划 命令类似于 Bicep what-if
操作。 terraform plan
使用命令,可以在应用之前创建要预览的执行计划。 然后,通过 terraform apply 命令应用执行计划。 与 Terraform 执行的任何操作几乎都涉及使用 terraform plan
命令和 terraform apply
命令。
入门
Bicep 和 Terraform 都提供了资源来帮助你入门。 适用于 Bicep 的 Learn 模块可帮助你定义 Azure 资源的配置方式。 你还将指导你部署多个 Azure 资源,以为你提供实践体验。
同样,HashiCorp Learn 为用户提供了各种 Terraform 培训资源 ,教你如何安装和使用 Terraform。 这些资源包括演示如何使用 Terraform 在 Azure 上预配基础结构的信息。
代码创作
代码创作体验取决于可供所选编辑器使用的加载项数量。 幸运的是,Bicep 和 Terraform 都提供了资源来提高代码创作效率。
对于 Bicep,最有效的加载项之一是 Bicep Visual Studio Code 扩展。 该扩展提供代码验证、Intellisense、dot-property access 和属性自动完成等功能。
对于 Terraform,Terraform 语言服务器的 Terraform Visual Studio Code 扩展提供了与 Bicep Visual Studio Code 扩展相同的许多功能。 例如,该扩展还支持语法突出显示、IntelliSense、代码导航和模块资源管理器。 HashiCorp 在其 GitHub 存储库(https://github.com/hashicorp/terraform-ls/blob/main/docs/USAGE.md)上还提供了[详细的安装说明],用于配置和使用 Terraform 语言服务器。
Azure 覆盖范围
在配置 Azure 资源方面,Bicep 的优势优于 Terraform。 Bicep 与 Azure 服务深度集成。 此外,它还立即支持新的 Azure 功能。 Terraform 提供了两个提供程序,允许用户管理 Azure:AzureRM 和 AzAPI。 AzureRM 提供商为稳定的 Azure 服务提供完全定制的体验。 有时,获得这种定制体验可能会导致有点延迟。 AzAPI 提供程序是 Azure 资源管理器 REST API 之上的精简层,它(如 Bicep)支持立即支持新的 Azure 功能。 在做出决策之前,请务必考虑组织的基础结构要求以及它们是否完全受支持。
社区和支持
社区在帮助学习和克服挑战方面发挥了关键作用。 Terraform 和 Bicep 社区都提供高水平的参与和支持。
对于 Bicep 支持,在何处寻求帮助取决于问题的性质:
对于 Terraform 支持,在何处寻求帮助取决于问题的性质:
文档 bug:有关 Microsoft Learn 上的 Terraform 文档的问题,每篇文章都有一个反馈部分。
提供程序源代码和提交 bug:Microsoft 有 GitHub 存储库,你可以在其中提交 bug 并参与开源 Terraform Azure 提供程序。 若要列出可用的提供程序,请浏览到 Azure GitHub 组织,然后输入 terraform-provider-
“ 查找存储库...” 字段。
Terraform 核心问题:访问 HashiCorp 社区门户的 Terraform 部分。
与 Terraform 提供程序相关的问题:访问 HashiCorp 社区门户的 Terraform 提供程序部分。
总结
Bicep 和 Terraform 是两个领先的 IaC 选项,可用于轻松配置和部署 Azure 资源。 两者都提供用户友好的功能,可帮助组织提高效率和工作效率。 评估最适合组织时,请仔细考虑基础结构要求和偏好。