1.6.5.1. avmfix

avmfix 旨在帮助您确保我们的 Terraform 模块符合 Azure 验证模块 (AVM) 规范avmfix 工具会分析我们的 Terraform 代码,识别与 AVM 规范的偏差,并自动应用修复以满足要求的标准。

1.6.5.1.1. 目的和功能

avmfix 的主要目的是自动化地修复某些 Terraform 代码,使 Terraform 模块符合 AVM 规范的过程。 它解决了常见问题,例如:

  • 块内的排序:确保 resourcedata 块内的属性按照 AVM 规范正确排序。
  • 变量定义:强制执行定义变量的正确顺序,如规范中所述。
  • 输出排列:按字母顺序排列 output 块。
  • 移动块:将那些被声明在错误文件中的 variableoutput 块移动到 variables.tfoutputs.tf 文件。
  • 删除不必要的声明:删除输入变量和输出值的不必要声明,如 nullable = truesensitive = false
  • 排序 local:按字母顺序排列 local 块。
  • moved 块中的排序:确保 from 属性位于 to 属性之前。
  • module 块修复:对顶级变量进行排序。 object 类型的字段中的嵌套字段将不会排序。

通过自动化这些修复,avmfix 减少了维护高质量、合规的 Terraform 模块所需的手动工作。

1.6.5.1.2. 为什么需要 avmfix?

保持符合 AVM 规范对于确保 Terraform 模块的一致性、可靠性和最佳实践至关重要。 该规范提供了目录结构、命名约定、文档标准和代码组织的指南。 遵守这些准则可以提高模块的可维护性和可信度。

但是,手动执行这些标准可能既费时又容易出错。我们希望避免有关代码格式的不同意见,通过自动识别和纠正常见问题来简化此过程,使您可以专注于模块开发的更复杂方面。

1.6.5.1.3. 如何使用 avmfix

安装

使用 go install 命令安装 avmfix

go install github.com/lonegunmanb/avmfix@latest

此命令下载最新版本的 avmfix 并将其安装到您的 Go 工作区中。

运行工具

要使用 avmfix,请打开一个 shell 或终端并运行以下命令:

avmfix -folder /path/to/your/terraform/module

/path/to/your/terraform/module 替换为包含 Terraform 模块的目录的路径。

分析和应用修复

该工具分析指定的目录,并自动应用规范中确定的任何问题的修复。 如果该过程成功完成,您将看到消息“DirectoryAutoFix completed successfully.”。如果发生错误,该工具将显示一条错误消息。

手动干预

请记住,avmfix 可能无法自动解决所有问题。 对于某些问题,可能需要手动干预。 定期查看您的 Terraform 模块并按照 AVM 规范进行更新,以维护高质量的模块。

1.6.5.1.4. 支持的 Provider

avmfix 当前支持以下提供商的变量块描述生成:

  • 阿里云 (alicloud)
  • AWS (aws)
  • AWS Cloud Control (awscc)
  • AzAPI (azapi)
  • Azure Active Directory (azuread)
  • AzureRM (azurerm)
  • Google Cloud Platform (google)
  • Helm (helm)
  • Kubernetes (kubernetes)
  • Local (local)
  • Modtm (modtm)
  • Null (null)
  • Random (random)
  • Template (template)
  • Time (time)
  • Tls (tls)

它还支持对 ephemeral 资源块修复。

1.6.5.1.5. 注意事项

虽然 avmfix 可以自动执行许多常见的修复,但它不能替代对 AVM 规范的透彻理解。 定期查看您的 Terraform 模块,并手动解决该工具无法自动解决的任何问题。

avmfix 内置了支持的 Provider 的 Schema 信息,但这些信息是以静态 Json 字符串的形式保存在源代码中的,所以我们需要时不时地更新 avmfix 版本,以确保当前使用的版本包含了尽可能新的 Provider 版本的 Schema。

通过将 avmfix 纳入我们的 Terraform 工作流程中,可以显著减少维护 AVM 合规性所需的工作量,并确保 Terraform 模块的质量和一致性。

1.6.5.1.6. avmfix 在 AVM CI 流水线中的应用

AVM 提供了以下脚本,可以对模块中的 Terraform 代码执行自动格式修复:

#!/usr/bin/env bash
avmfix -folder "$(pwd)"

examples=$(find ./examples -maxdepth 1 -mindepth 1 -type d)
for d in $examples; do
  echo "===> Autofix in $d" && avmfix -folder "$d"
done


if [ ! -d modules ]; then
  echo "==> Warning - no modules directory found"
else
  modules=$(find ./modules -maxdepth 1 -mindepth 1 -type d)
  for d in $modules; do
    echo "===> Autofix in $d" && avmfix -folder "$d"
  done
fi
exit 0

在我们运行 make pre-commit 或是 make autofix 时就会执行该脚本。

AVM 的 GitHub Actions 流水线定义中有如下检查:

author: AVM
name: avmfix
description: Ensures that avmfix has been run.

runs:
  using: composite
  steps:
    - name: run avmfix
      shell: bash
      run: |
        docker run --rm -v $(pwd):/src -w /src mcr.microsoft.com/azterraform make autofix

    - name: detect changes
      shell: bash
      run: |
        if [ -z "$(git status -s)" ]; then
          echo "No changes detected"
          exit 0
        else
          echo "AVMfix changes detected, please run:"
          echo "> docker run --rm -v $(pwd):/src -w /src mcr.microsoft.com/azterraform make pre-commit"
          echo "... or if you have the avm helper script installed:"
          echo "> ./avm pre-commit"
          echo "> avm.bat pre-commit (on Windows)"
          echo
          echo "Then commit and push the changes"
          exit 1
        fi

对提交的 Pull Request 的分支,我们会运行 make autofix,随后检查是否有文件发生了变动,来判断 Pull Request 变更的代码是否已经经由 avmfix 格式化过。

results matching ""

    No results matching ""