如何在Terraform工作区(DNS)之间访问资源?

时间:2019-03-04 17:12:07

标签: dns google-cloud-platform terraform google-cloud-dns

我的基础架构有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"]
}

0 个答案:

没有答案