我的基础架构有3个环境。它们都一样,但是大小各异。我了解这是Terraform工作空间的一个很好的用例。在这方面,它确实运行良好。但是,如果这不是正确的方法,请纠正我。
现在,我唯一的问题是在工作区中管理DNS。我使用的是Google提供程序,它通过两种资源来工作:google_dns_managed_zone
代表区域,每个DNS记录的google_dns_record_set
类型。
请注意,记录集类型需要引用托管区域类型。
考虑到这一点,我需要从生产环境中管理DNS区域。我无法在其他工作空间中共享该资源,因为我应该能够在不破坏DNS区域的情况下破坏开发或暂存工作空间。
我尝试使用count
解决该问题。我将其用作布尔值,如下面的代码所示,发现它有点黑,但这就是我在Terraform社区中发现的东西。欢迎任何改进。
这样,我就可以仅在prod工作区中显示区域和生产记录(例如以下示例所示的MX)。
但是,在仅在特定工作区中管理记录集时,我陷入了困境。例如,在dev工作区中创建nginx并为其自动创建DNS记录集的情况下,例如dev.example.com。
为此,我需要访问托管区域资源。如下所示,我使用terraform_remote_state
来从prod工作区访问资源。据我所知,它可以与output
一起使用,您可以在下面看到。当选择prod工作区时,确实可以输出托管区域。然后,如果我选择另一个工作区,则使用远程状态可以成功地从prod中检索托管区域。但是我的问题是,涉及output
行的Terraform失败,因为它仅存在于prod工作空间中,并且不存在于任何其他工作空间中,因此无法输出。
所以这有点废话,我不知道是否有更好的方法来实现。我做了相当多的研究,并询问了社区,但找不到答案。在我看来,管理DNS对于所有基础结构都是通用的,应该涵盖得很清楚。我在做什么错,应该怎么做?
locals {
environment="${terraform.workspace}"
dns_zone_managers = {
"dev" = "0"
"staging" = "0"
"prod" = "1"
}
dns_zone_manager = "${lookup(local.dns_zone_managers, local.environment)}"
}
resource "google_dns_managed_zone" "base_zone" {
name = "base_zone"
dns_name = "example.com."
count = "${local.dns_zone_manager}"
}
resource "google_dns_record_set" "mx" {
name = "${google_dns_managed_zone.base_zone.dns_name}"
managed_zone = "${google_dns_managed_zone.base_zone.name}"
type = "MX"
ttl = 300
rrdatas = [
"10 spool.mail.example.com.",
"50 fb.mail.example.com."
]
count = "${local.dns_zone_manager}"
}
data "terraform_remote_state" "dns" {
backend = "local"
workspace = "prod"
}
output "dns_zone_name" {
value = "${google_dns_managed_zone.base_zone.*.name[0]}"
}
然后,我只能在特定的工作空间中引入记录集,再次使用count
并通过远程状态引用托管区域,如下所示:
resource "google_dns_record_set" "a" {
name = "dev"
managed_zone = "${data.terraform_remote_state.dns.dns_zone_name}"
type = "A"
ttl = 300
rrdatas = ["1.2.3.4"]
}