本文档涵盖了基础设施即代码 (IaC) 工具的 gitignore 模式,特别是 Terraform、Packer 和 Terragrunt。它解释了在使用这些工具时,哪些文件应从版本控制中排除以及原因。有关构建工具和依赖管理的一般信息,请参阅构建工具和依赖管理。
基础设施即代码 (IaC) 是通过机器可读的定义文件而非手动流程来管理和配置基础设施的实践。本文档涵盖的主要工具包括
图示:基础设施即代码工具关系
来源:Terraform.gitignore Packer.gitignore community/Terragrunt.gitignore
Terraform 的 gitignore 模板排除了数类不应提交到版本控制中的文件
**/.terraform/*
.terraform 目录包含在 terraform init 期间下载的提供程序插件和模块。这些是特定于环境的,应在每个环境中重新下载。
*.tfstate
*.tfstate.*
.terraform.tfstate.lock.info
Terraform 状态文件跟踪 Terraform 创建的实际资源。它们通常包含敏感数据,并且特定于环境。锁定信息文件是 Terraform 操作期间创建的临时文件。
来源:Terraform.gitignore4-6 Terraform.gitignore26-27
crash.log
crash.*.log
崩溃日志是在 Terraform 遇到错误并崩溃时生成的。它们可能包含有关您的基础设施的敏感信息。
*.tfvars
*.tfvars.json
变量定义文件通常包含 API 密钥、密码和其他机密等敏感数据,这些数据不应存储在版本控制中。
override.tf
override.tf.json
*_override.tf
*_override.tf.json
覆盖文件用于自定义特定环境的基础设施,通常不应纳入版本控制。但是,如果需要,您可以使用否定模式包含特定的覆盖文件。
来源:Terraform.gitignore19-24 Terraform.gitignore29-30
.terraformrc
terraform.rc
CLI 配置文件可能包含敏感的提供程序凭据,并且是用户特定的。
图示:Terraform 工作流和生成的文件
Packer 是一个用于从单一源配置为多种平台创建相同机器镜像的工具。其 gitignore 模板排除
packer_cache/
Packer 缓存目录包含下载的 ISO 文件和其他工件。这些是大型文件,应在每个环境中重新下载。
crash.log
与 Terraform 类似,Packer 会生成可能包含敏感信息的崩溃日志。
*.pkrvars.hcl
Packer 的变量文件可能包含凭据等敏感数据,不应纳入版本控制。
*.box
.box 文件是已构建的机器镜像,它们是大型二进制文件,不应存储在版本控制中。
图示:Packer 工作流和生成的文件
Terragrunt 是 Terraform 的一个轻量级包装器,它提供了额外工具来处理多个 Terraform 模块。其社区 gitignore 模板排除
.terragrunt-cache
.terragrunt-cache 目录包含缓存的 Terraform 配置和下载的模块。此目录在运行 Terragrunt 命令时重新创建,不应纳入版本控制。
来源:community/Terragrunt.gitignore1-3
在使用基础设施即代码工具时,请遵循以下管理 gitignore 文件的最佳实践:
| 类别 | 最佳实践 | 原理 |
|---|---|---|
| 状态文件 | 将状态存储在远程后端(S3、Azure Storage 等) | 支持团队协作,并将敏感数据排除在版本控制之外 |
| 秘密 | 使用 Vault 或 AWS KMS 等密钥管理工具 | 提供对敏感值的安全处理,而不是将它们存储在 .tfvars 文件中 |
| 变量文件 | 提交包含虚拟/示例值的模板文件 | 帮助新团队成员理解需要哪些变量 |
| 覆盖文件 | 改用标准化的环境文件夹 | 为大多数用例提供比覆盖文件更好的组织 |
当在项目中同时使用不同的 IaC 工具时,将它们的 gitignore 模式合并到一个文件中。例如,如果在项目中同时使用 Terraform 和 Packer,请在项目的 .gitignore 文件中包含这两个模板的模式。
图示:基础设施即代码应排除的文件类别
来源:Terraform.gitignore Packer.gitignore community/Terragrunt.gitignore
基础设施即代码工具的 gitignore 模板侧重于排除
通过正确配置这些工具的 gitignore 设置,您可以维护干净的存储库,而不会暴露敏感信息或将不必要的大型文件纳入版本控制。