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 流程中添加此验证步骤,可以在早期发现配置错误,减少后续部署中的问题,提高模块的稳定性和可靠性。

results matching ""

    No results matching ""