1.6.5.1. avmfix
avmfix
旨在帮助您确保我们的 Terraform 模块符合 Azure 验证模块 (AVM) 规范。 avmfix
工具会分析我们的 Terraform 代码,识别与 AVM 规范的偏差,并自动应用修复以满足要求的标准。
1.6.5.1.1. 目的和功能
avmfix
的主要目的是自动化地修复某些 Terraform 代码,使 Terraform 模块符合 AVM 规范的过程。 它解决了常见问题,例如:
- 块内的排序:确保
resource
和data
块内的属性按照 AVM 规范正确排序。 - 变量定义:强制执行定义变量的正确顺序,如规范中所述。
- 输出排列:按字母顺序排列
output
块。 - 移动块:将那些被声明在错误文件中的
variable
和output
块移动到variables.tf
与outputs.tf
文件。 - 删除不必要的声明:删除输入变量和输出值的不必要声明,如
nullable = true
和sensitive = 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
格式化过。