1.6.1.1. terraform
一个毋庸多言的事实是,维护一个 Terraform 模块,一个必须使用的工具就是 Terraform 本身。在维护模块时,我们会依赖 Terraform 为我们实现:
- 代码格式化和格式检查
- 代码语法验证
1.6.1.1.1. 代码格式化和格式检查
在维护大规模 Terraform 模块时,确保代码风格一致、可读性强是团队协作和长期维护的关键。Terraform 提供了 terraform fmt
命令,用于自动格式化配置文件,使其符合官方的规范和风格。
1.6.1.1.1.1. 什么是 terraform fmt
terraform fmt
命令用于格式化 Terraform 配置文件,使其符合官方的风格规范。该命令会自动调整缩进、对齐、空格等,使代码更易读且风格统一。这对于多人协作和代码审查尤为重要。
默认情况下,terraform fmt
会扫描当前目录下的所有 .tf
文件,并进行格式化。如果文件已经符合规范,命令不会做出任何更改。
1.6.1.1.1.2. -check
使用 terraform fmt -check
可以检查配置文件是否已经按照规范格式化。如果所有文件都符合规范,命令返回状态码 0
;否则,返回非零状态码,并列出未格式化的文件。该选项不会修改任何文件,适用于在 CI/CD 流程中作为格式检查步骤。
1.6.1.1.1.3. -recursive
默认情况下,terraform fmt
只处理当前目录下的文件。添加 -recursive
选项后,命令会递归处理所有子目录中的 .tf
文件。这对于包含多个模块或子模块的大型项目尤为重要。
1.6.1.1.1.4. 示例命令
以下是一些常用的命令示例:
# 格式化当前目录下的所有 .tf 文件
terraform fmt
# 检查当前目录及所有子目录中的 .tf 文件是否已格式化
terraform fmt -check -recursive
1.6.1.1.1.5. terraform fmt 在 CI/CD 流程中的应用
将 terraform fmt
集成到 CI/CD 流程中,可以自动检查代码格式,确保所有提交的代码都符合规范。例如,以下脚本可被用来检查模块代码格式:
#!/usr/bin/env bash
echo "==> Checking terraform codes are formatted..."
error=false
terraform fmt -check -recursive || error=true
if ${error}; then
echo "------------------------------------------------"
echo ""
echo "The preceding files contain terraform codes that are not correctly formatted or contain errors."
echo ""
echo "to easily fix all terraform codes:"
echo "$ make fmt"
echo ""
exit 1
fi
exit 0
1.6.1.1.1.6. 注意事项
- 版本兼容性:不同版本的 Terraform 可能对格式化的规范有所调整。在升级 Terraform 版本后,建议重新运行
terraform fmt
,以确保所有文件符合新的规范。 - 不可配置性:
terraform fmt
是一个“意见强烈”的工具,不提供自定义格式化规则的选项。其目标是鼓励所有 Terraform 项目采用统一的风格。 - 手动调整:对于某些复杂的表达式或特定的格式需求,
terraform fmt
可能无法满足。在这种情况下,开发者可能需要手动调整格式,或者在代码审查中达成一致。
1.6.1.1.2. 代码语法检查
在 CI/CD 流水线中,除了使用 terraform fmt
保持代码风格一致外,另一个关键步骤是使用 terraform validate
命令对配置文件进行语法和结构的验证。
1.6.1.1.2.1. 什么是 terraform validate
terraform validate
命令会验证当前目录中的 .tf
或 .tf.json
配置文件,检查其语法是否正确,以及资源块、模块调用、变量引用等是否符合 Terraform 的语法规范。
该命令不会连接到远程状态文件或云提供商的 API,因此适用于本地开发和持续集成(CI)流程中的早期验证步骤。
1.6.1.1.2.2. 使用方法
在使用 terraform validate
之前,需确保工作目录已初始化(即运行过 terraform init
)。如果不希望连接到远程后端,可以使用以下命令初始化(-backend=false
很重要,确保不会尝试连接远程后端,因为那将需要用户提供连接凭据,而我们仅仅只想执行语法检查,更麻烦的是,检查的代码可能来自于未知第三方,其中可能包含有旨在窃取凭据的恶意代码):
terraform init -backend=false
然后,运行以下命令进行验证:
terraform validate
如果配置文件语法正确且结构一致,命令将输出:
Success! The configuration is valid.
否则,将显示错误信息,帮助定位和修复问题。
1.6.1.1.2.3. terraform validate 在 CI/CD 流程中的应用
将 terraform validate
集成到 CI/CD 流程中,可以在代码合并或部署之前,自动检查配置文件的语法和结构,确保其有效性。例如,以下脚本可被用来验证模块配置文件:
#!/usr/bin/env bash
echo "==> Validating module terraform codes..."
error=false
(terraform init -upgrade && terraform validate -json | jq -e .valid) || error=true
if ${error}; then
echo "------------------------------------------------"
echo ""
echo "Some Terraform codes contain errors."
echo "$(terraform validate -json)"
echo ""
exit 1
fi
echo "==> Checking examples terraform codes are validate..."
examples=$(find ./examples -maxdepth 1 -mindepth 1 -type d)
for d in $examples; do
(echo "===> Terraform validating in " $d && cd $d && rm -f .terraform.lock.hcl && rm -rf .terraform && terraform init -upgrade && terraform validate -json | jq -e .valid) || error=true
if ${error}; then
echo "------------------------------------------------"
echo ""
echo "Some Terraform codes contain errors."
pwd
echo "$(cd $d && terraform validate -json)"
echo ""
exit 1
fi
done
echo "==> Checking module terraform code are validate..."
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 "===> Terraform validating in " $d && cd $d && rm -f .terraform.lock.hcl && rm -rf .terraform && terraform init -upgrade && terraform validate -json | jq -e .valid) || error=true
if ${error}; then
echo "------------------------------------------------"
echo ""
echo "Some Terraform codes contain errors."
pwd
echo "$(cd $d && terraform validate -json)"
echo ""
exit 1
fi
done
fi
exit 0
通过在 CI/CD 流程中添加此验证步骤,可以在早期发现配置错误,减少后续部署中的问题,提高模块的稳定性和可靠性。