Loading…

关于 在线 HCL / Terraform 格式化工具

Terraform、Packer 和其他 HashiCorp 工具都使用 HCL2——并且它们在格式一致时看起来更好。此 HCL 格式化工具将您的配置发送到安全后端,应用 terraform fmt 风格的缩进、间距和布局规则,然后返回标准化的 HCL2,同时保持语义不变。

主要特性

  • 支持 HCL2 的格式化,适用于 Terraform 风格的块、属性、列表/映射和 heredoc
  • 一致的缩进和围绕 =、逗号、大括号和嵌套块的间距
  • 尽可能保留注释和有意空行以提高可读性
  • 适用于 .tf、.hcl、基于 HCL 的 .tfvars 和 Packer .pkr.hcl 文件
  • 幂等输出:再次运行格式化工具会得到相同结果
  • 最小化界面:单一“格式化”操作,无需争论样式选项
  • 一键复制或从编辑器下载格式化结果
  • 通过安全端点进行服务器支持处理 — 适合快速修复;对于高度敏感代码,建议使用本地 CLI

🔧 如何使用 HCL 格式化工具 for hcl-formatter

1

1. 粘贴或拖入代码

打开您的HCL/Terraform文件(.tf、基于HCL的.tfvars、.hcl、.pkr.hcl等),将内容粘贴到编辑器中,或如果浏览器支持,直接拖入文件。

2

2. 点击“格式化”

点击格式化按钮。您的配置将发送至安全后端,应用terraform fmt风格的缩进、间距和布局规则,然后返回格式化后的HCL2代码。

3

3. 检查、复制或下载

在编辑器中检查结果,然后将其复制回IDE,或下载格式化后的文件并提交至代码库。

技术规格

执行模式

格式化器采用服务器后端,旨在模拟terraform fmt风格的HCL2布局规范化。

方面详情
模式服务器后端(无浏览器内WASM)
范围空白、缩进、间距、基本布局
重排序不对资源或块进行语义重排序
选项无——单一格式化操作确保输出可预测
限制约1–2 MB输入,~25秒服务器超时(可能调整)
保留临时处理——格式化后输入即被丢弃
与任何在线工具一样,请避免粘贴生产环境密钥。敏感代码请本地使用terraform fmt或packer fmt。

语言覆盖

理解Terraform及其他HashiCorp工具中常用的HCL2结构。

结构示例备注
resource、variable、output、module、locals、job、task保留嵌套块结构
属性name = "web"、count = 2围绕=及属性间间距规范化
集合[1, 2, 3]、{ key = value }列表和映射/对象的统一布局
多行字符串<<-EOF ... EOF保留标记;尽可能规范化缩进
注释# 和 // 风格的注释尽可能保留以维护意图和文档

格式化前后对比

Terraform 资源中缩进和间距清理的小示例。

# 格式化前
resource "aws_s3_bucket" "b"{bucket="demo"
  tags={Name="demo"}}

# 格式化后
resource "aws_s3_bucket" "b" {
  bucket = "demo"

  tags = {
    Name = "demo"
  }
}
仅布局转换:标识符、表达式和引用保持不变。

错误与边缘情况

如果格式化失败或返回错误,通常是由于 HCL2 输入中的解析问题。

症状可能原因检查内容
无输出 / 解析错误未闭合的大括号、方括号或圆括号统计匹配的 { }、[ ]、( ) 对并闭合所有块
多行字符串问题缺失或不匹配的终止符确保 EOF 等标记准确出现在独立行上
混合样式制表符/空格或杂散字符规范化缩进,移除杂散控制字符
.tfvars 混淆JSON 与 HCL 语法对 *.tfvars.json 文件使用 JSON 格式化器或 terraform fmt

命令行替代方案

对于日常的基础设施即代码工作流,请在本地和 CI 中使用官方格式化工具,并将此在线工具用于快速临时清理。

macOS / Linux

Terraform:原地格式化

terraform fmt

重写当前目录中的 .tf 和基于 HCL 的 .tfvars 文件。

Terraform:递归 CI 检查(不写入)

terraform fmt -check -recursive

如果有任何文件需要格式化,则非零退出——非常适合 CI 和预提交钩子。

Packer:格式化模板

packer fmt path/to/template.pkr.hcl

原地格式化指定的 Packer HCL 文件。

Windows (PowerShell)

递归格式化所有 Terraform 文件

Get-ChildItem -Recurse -Filter *.tf | ForEach-Object { terraform fmt $_.FullName }

对当前目录下找到的每个 .tf 文件运行 terraform fmt。

CI 风格的格式化检查

terraform fmt -check -recursive

在构建流水线中使用,当格式化过时时使构建失败。

GitHub Actions

如果需要格式化,则使构建失败

steps:
  - uses: hashicorp/setup-terraform@v3
  - run: terraform fmt -check -recursive

当任何 Terraform 文件未正确格式化时停止工作流。

在拉取请求上自动格式化(可选)

steps:
  - run: terraform fmt -recursive
  - run: git diff --quiet || (git config user.name "bot" && git config user.email "bot@example" && git commit -am "chore: terraform fmt" && git push)

应用 terraform fmt 并将仅包含格式化的提交推回分支。

对于受监管或机密的基建代码,建议使用本地 CLI 工具,并在 CI 中强制执行 `terraform fmt -check -recursive`,而不是将文件发送到在线格式化工具。

实际应用

PR 整洁与审查

统一空白和缩进,让审查者专注于实际的基建变更。

  • 在打开拉取请求前运行格式化
  • 减少 Terraform 审查中关于样式的琐碎评论
  • 保持 git 差异小而意义明确

Terraform 模块开发

保持模块在团队、仓库和注册表之间的一致性。

  • 对齐共享模块中的变量和输出块
  • 确保示例配置符合统一的内部风格

CI 把关

在 CI 中使用 terraform fmt 检查,防止样式随时间漂移。

  • 将 `terraform fmt -check -recursive` 添加为强制流水线步骤
  • 在所有 .tf 文件格式化前阻止合并

入职与文档

可读性强的示例帮助新团队成员快速学习 Terraform 和内部风格。

  • 在 README 中发布格式一致的代码片段
  • 在内部 Terraform 培训中使用清晰的示例

❓ Frequently Asked Questions

🔒我的代码是在本地处理的吗?

不是。此 HCL 格式化工具是服务器支持的:您的输入被发送到安全端点进行格式化,结果 HCL 返回到您的浏览器。对于高度敏感或受监管的基建代码,建议在本地运行 `terraform fmt`(或 `packer fmt`)。

🛡️我可以在这里粘贴密钥吗?

我们强烈建议您不要在任何在线工具中粘贴生产环境密钥。尽管该服务是安全的且专为瞬时处理而设计,但长期存在或高度敏感的凭据应仅存在于本地文件、密钥存储库或CI保险库中——而非浏览器工具中。

🧩格式化会改变配置行为吗?

不会。格式化器专注于布局:空白、缩进和间距。资源块、参数、表达式和引用保持不变,前提是原始HCL是有效的。

📄我可以格式化 .tfvars 文件吗?

可以,只要 .tfvars 文件使用 HCL 语法。Terraform 还通过 `.tfvars.json` 支持基于 JSON 的变量;这些遵循 JSON 规则,最好由 JSON 格式化器或 `terraform fmt` 本身处理。

⚙️这与 `terraform fmt` 有何不同?

`terraform fmt` 是 Terraform 附带的规范格式化器,非常适合本地开发和 CI。此 Web 工具适用于当您手头没有 CLI 或想在浏览器中整理小段代码时进行快速、临时的清理。

🧯为什么格式化失败了?

大多数失败是解析错误:未闭合的大括号或方括号、格式错误的 heredoc,或将 JSON 风格的 tfvars 与 HCL 语法混合使用。修复结构问题(或使用正确的方言/格式化器)后重试。

Pro Tips

CI Tip

在 CI 中强制执行 `terraform fmt -check -recursive` 以防止大型基础设施仓库中的格式漂移。

Security Tip

避免将密钥或状态相关数据粘贴到在线工具中;保持配置示例的清洁,并对真实的基础设施代码运行本地 CLI 格式化器。

Best Practice

在编辑器中规范化尾随换行符和缩进,使 Terraform 文件在不同平台上产生干净、稳定的差异。

Best Practice

添加一个运行 `terraform fmt` 的预提交钩子,使拉取请求在提交时已格式化,评审对话可以专注于架构和风险。

Additional Resources

Other Tools