听说有个叫Terragrunt的东西

关于这篇文章

这里所记录的全部内容都来自Terragrunt的官方文档。(我不知道是否有帮助,但我在GitHub上创建了一个沙箱。)
重点不在于如何使用,而是关注如何能够使用。

Terragrunt是什么?

总结

Terragrunt是一个官方支持的Terraform包装工具,它以DRY(Don’t Repeat Yourself)作为口号。
简而言之,就是让这个工具来完成Terraform中繁琐的任务!

支持的 Terraform 版本可以在公开的 Terraform 版本兼容表中找到。只要你有接触过 Terraform,就可以处理 terragrunt.hcl 文件。

可以像Terraform一样运行命令的工具是Terragrunt(apply | plan ….)。

对于导向的担忧

Considerations for CI/CD Pipelinesで触れられているように一般的なケースに現在対応できていない。回避策はあるが、余計なトイルが発生する気が。

Terraform Registryをモジュールとして利用する場合には問題ないが、プライベートGitリポジトリを利用する場合のガバナンスコストが未知。
既存のプロダクトに導入するにはメリットが少なすぎる。新規プロジェクトの方が導入する価値がある。

run-all …コマンドというのがあるがCI/CDの際にそれぞれの出力を取得したい場合、一工夫必要。

你能做什么?

这只是一个例子,但是可以通过Terragrunt实现一些DRY的方法如下所示。

后端

首先介绍一下。使用Terraform来配置后端相当繁琐对吧?
只需要在root的terragrunt.hcl中添加定义,就可以配置子后端的设置。
如果后端资源不存在(第一次创建时),Terraform会自动创建该后端资源。

假设以下为目录结构。

stage
├── terragrunt.hcl <- こいつ
├── frontend-app
│   ├── main.tf
│   └── terragrunt.hcl
└── mysql
    ├── main.tf
    └── terragrunt.hcl

当terragrunt.hcl根目录配置如下时,会生成一个backend.tf文件,并根据目录结构创建tfstate的路径。
(例如,本例中将生成frontend-app/terraform.tfstate和mysql/terraform.tfstate)。

# stage/terragrunt.hcl
remote_state {
  backend = "s3"
  generate = {
    path      = "backend.tf"
    if_exists = "overwrite_terragrunt"
  }
  config = {
    bucket = "my-terraform-state"

    key = "${path_relative_to_include()}/terraform.tfstate"
    region         = "us-east-1"
    encrypt        = true
    dynamodb_table = "my-lock-table"
  }
}

最终的目录结构如下所示。

stage
├── terragrunt.hcl
├── frontend-app
│   ├── main.tf
│   ├── backend.tf
│   └── terragrunt.hcl
└── mysql
    ├── main.tf
    ├── backend.tf
    └── terragrunt.hcl

服务提供者 zhě)

使用Terraform时,指定提供程序也有点麻烦。像下面这样配置,并生成一个provider.tf给子模块。generate块很直观,所以不需要特别解释。

# stage/terragrunt.hcl
generate "provider" {
  path = "provider.tf"
  if_exists = "overwrite_terragrunt"
  contents = <<EOF
provider "aws" {
  assume_role {
    role_arn = "arn:aws:iam::0123456789:role/terragrunt"
  }
}
EOF
}

命令行参数

不必每次输入命令“-var-file=path”是很麻烦的!因此,我们可以让Terragrunt自动添加它。

在执行指定命令时,会自动为您指定参数。

# terragrunt.hcl
terraform {
  extra_arguments "common_vars" {
    commands = ["plan", "apply"]

    arguments = [
      "-var-file=../../common.tfvars",
      "-var-file=../region.tfvars"
    ]
  }
}

我个人想要介绍的功能和命令。

前后钩子

您可以指定在执行前后触发的命令。根据使用方式可能会非常方便。

terraform {
  before_hook "before_hook" {
    commands     = ["apply", "plan"]
    execute      = ["echo", "Running Terraform"]
  }

  after_hook "after_hook" {
    commands     = ["apply", "plan"]
    execute      = ["echo", "Finished running Terraform"]
    run_on_error = true
  }
}

图依赖命令

可以通过运行`terragrunt graph-dependencies`来表示模块之间的依赖关系,类似于`terraform graph`或`inframap`。

image.png

依赖块

从概念上讲,它与Terraform的模块相同。

dependency "vpc" {
  config_path = "../vpc"
}

inputs = {
  vpc_id = dependency.vpc.outputs.vpc_id
}

请参考以下链接

Terragrunt 是一个用于管理 Terraform 环境的开源工具。

Translation: Terragrunt是用于管理Terraform环境的开源工具。

广告
将在 10 秒后关闭
bannerAds