【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博客》