我已经开始使用Terraform并完全买入它 - 太棒了!我已经根据AWS VPC,子网,NACL,SG,路由表等创建了我的整个Dev环境,我已经决定最好把它变成可重用的模块 .
所以现在我把它变成了模块,变量等 . 现在我的开发模板只需要变量并将它们用作模块的输入 . 我最终得到了这个:
terraform {
backend "s3" {
bucket = "redacted"
key = "dev/vpc/terraform.tfstate"
region = "eu-west-1"
encrypt = true
dynamodb_table = "terraform_statelock_redacted"
}
}
provider "aws"{
access_key = ""
secret_key = ""
region = "eu-west-1"
}
module "base_vpc" {
source = "git@github.com:closed/terraform-modules.git//vpc"
vpc_cidr = "${var.vpc_cidr}"
vpc_region = "${var.vpc_region}"
Environment = "${var.Environment}"
Public-subnet-1a = "${var.Public-subnet-1a}"
Public-subnet-1b = "${var.Public-subnet-1b}"
Private-subnet-1a = "${var.Private-subnet-1a}"
Private-subnet-1b = "${var.Private-subnet-1b}"
Private-db-subnet-1a = "${var.Private-db-subnet-1a}"
Private-db-subnet-1b = "${var.Private-db-subnet-1b}"
Onsite-computers = "${var.Onsite-computers}"
browse_access = "${var.browse_access}"
}
现在我在s3后端管理所有状态,正如您在上面的配置中看到的那样 . 我还有正在运行的服务/实例的其他状态文件 . 我的问题是,现在我把它变成了一个模块,如上所述引用它,它想要吹走我的状态!我的印象是它会导入模块并运行它,同时尊重其他配置 . 实际的模块代码是从原始模板复制的,所以没有任何改变 .
它是否有理由试图将一切都吹走并重新开始?在使用模块的情况下,如何管理每个环境的单独状态?我没有其他错误 . 我目前有开发人员正在开发一些服务器,所以我现在瘫痪了!
我想我误会了什么,任何帮助非常感谢:)谢谢 . 编辑 - 使用Terraform 0.9.8
2 回答
好的,所以我认为我误解的是使用模块改变状态文件中路径的方式 . 我意识到我在阅读关于州迁移的Terraform文档时处于正确的位置 .
我发现这篇很棒的博客文章可以帮助我解决这个问题:https://ryaneschinger.com/blog/terraform-state-move/
没有评论部分让我感谢那家伙!无论如何,在看到它有多容易之后,我只是将
terraform state list
命令输出到主文件的文本文件中 . 使用PowerShell快速迭代这些并编写我正在移动它们的模块的命令 . 当我尝试用这个脚本执行行时,我得到了"Terraform has crashed!!!!"错误,所以只需将它们剪切并粘贴到我的shell中 . 适当的nooby,但只有50左右的资源,所以不是那么耗费时间 . 我很高兴我在开发阶段这样做,而不是决定在 生产环境 中回顾性地做这件事 .所以我排序了 . 感谢您通过JBirdVegas提供的输入 .
我们遇到了这个问题,并决定每个环境都需要一个代码表示,我们可以在需要时同时查看其他代码,即将开发配置与qa进行比较 .
所以现在我们有一个dev文件夹和一个qa文件夹,我们从那里启动terraform . 每个基本上都是调用每个组件的模块的变量列表 .
这是我的树,用于直观表示
dev/main.tf
和qa/main.tf
导入其他文件夹提供的模块,为每个模块提供特定于环境的配置 .编辑:这是我
dev/main.tf
的消毒版本然后我的QA基本相同(在顶部修改几个变量)然而最重要的区别是
qa/main.tf
的最顶层这些变量:使用这个我们的后端
dev
和qa
在不同的aws帐户中的不同存储桶中有不同的状态文件 . Idk您的要求是什么,但这已经满足了我与之合作的大多数项目,实际上我们正在扩展我的组织在我的组织中的使用 .