【Terraform】我试着自己找到了最佳的目录结构实践

首先

你好!我是高斯。

我差不多三周前开始参与使用terraform进行基础设施搭建的任务。
因为尝试一下后发现很复杂,所以我会把记录作为备忘录留下来。
顺便说一下,因为我之前没有任何terraform的经验,所以可能会有一些我不能理解的部分,希望您可以随意指正!

环境

    • terraform v0.12.19

 

    • terragrunt v0.23.14

 

    • OCI (Oracle Cloud Infrastructure)

 

    • computeの構築

 

    • production環境 / staging環境が存在

 

    plan/apply実行は各ディレクトリ毎に行う(compute_stg/prdディレクトリ配下)

我想做的事情

(1) ☆每个compute目录仅包含设置参数文件(var文件),而module则包含配置文件(tf文件)。

(2) 将 remote-state 的引用集中存放在模块的直接下方

在执行计划/应用时,将要使用的参数定义在常量文件中,并且只需加载公共文件和所需的各个文件。

想做但無法實現的事情。

    providerの設定ファイル共通化とバージョン管理

由于设置值完全相同,我希望将其统一化并放入模块中,但无法成功。此外,由于terraform的规则,需要进行硬编码以确定版本。

    terraformバージョン管理ファイルの共通化(調査中)

由于目录中的版本相同, 所以我想把它们好好整合起来(也许可以使用库来实现)。

目录结构。

terraform/
├── constant-common.tfvars // どのディレクトリでplan/applyしても必ず呼ばれる
├── constant-compute.tfvars  // computeディレクトリで実行時のみ呼ばれる
├── terragrunt_base.hcl // terragrunt baseファイル
├── modules  // base module
│   ├── compute-common  // compute-common module
│   │   ├── compute.tf  // resourceの定義など
│   │   ├── main.tf
│   │   └── variables.tf
│   ├── output.tf  // remote stateからの参照ファイル
│   ├── terraform_remote_state.tf  // remote stateからの参照ファイル
│   └── valuables.tf
├── region1
│       ├── compute_stg
│       │   ├── compute-var.tf  // 設定パラメータファイル
│       │   ├── main.tf
│       │   ├── provider.tf  // oci provider
│       │   ├── terraform.tf  // terraformバージョン管理ファイル
│       │   ├── terragrunt.hcl  // terragrunt差分ファイル
│       │   └── variables.tf
│       └── compute_prd
│           ├── compute-var.tf
│           ├── main.tf
│           ├── provider.tf
│           ├── terraform.tf
│           ├── terragrunt.hcl
│           └── variables.tf
└── region2

(1) 每个compute目录都只包含配置参数文件(var文件),而模块具有组态文件(tf文件)。

通过main.tf的传递可以实现文件的分离。

不要忘记在参考目录中定义变量。


module "compute-common" {
  source = "../../modules/compute-common"

  # constant.tfvarsから受け取った値もここから渡す
  hoge             = var.hoge

  # compute variable
  instance_list = var.instance_list

}


# 必須項目でない場合はdefault値を指定してください
variable "instance_list" {}

(2)将从远程状态中引用的内容整理到模块的直属部分。

在上述的目录结构中,对应于output.tf和terraform_remote_state.tf。

请您不要忘记从各个模块进行引用


module "base" {
  source               = "../../modules"
  # baseへ渡したい値があればここに書く
  hoge = var.hoge
}


在执行计划/应用时,将要使用的参数定义在常量文件中,并仅加载共享文件和必要的文件。

如果将参数定义在constant文件中,只需要在terragrunt_base.hcl中加载共通文件,并将差异记录在各个目录下的terragrunt.hcl文件中。

terraform {
  extra_arguments "common_vars" {
    commands = ["plan", "apply", "destroy", "import"]

    arguments = [
      "-var-file=${get_parent_terragrunt_dir()}/terraform_base.tfvars",
      "-var-file=${get_parent_terragrunt_dir()}/constant-common.tfvars"
    ]
  }
}

# 差分を記載
terraform {
  extra_arguments "custom_vars" {
    commands = ["plan", "apply", "destroy", "import"]

    arguments = [
      "-var-file=${get_parent_terragrunt_dir()}/constant-compute.tfvars"
    ]
  }
}

# baseを参照する
include {
  path = find_in_parent_folders("terragrunt_base.hcl")
}

为了实现其他事情,我们需要的是什么?

    各ディレクトリからmoduleに向けてのremote stateの移動

如果是从零开始构建的情况下,可能并不需要这样做,但如果模块中没有的话,请移步至其他地方。

terraform state mv "移動元" "module.${モジュール名}.${インスタンス名}"

额外的

进行类型定义

尽管Terraform可以进行类型推断,但为了保险起见,我们还是应该正确地进行定义。

variable "instance_list" {
  type = map(object({
    ad                                  = string
    // 中略
  }))
}
variable instance_list {
  default = {
    instance1 = {
      ad                                  = "hoge"
      // 中略
    }
  }
}

请提供相关的参考资料。

https://www.terraform.io/docs/index.html -《Terraform官方文档》
https://terragrunt.gruntwork.io/docs/reference/built-in-functions/ – 《Terragrunt内置函数参考手册》
https://future-architect.github.io/articles/20190903/ – 《未来架构师-GitHub博客》

bannerAds