【发布时间】:2021-05-21 04:28:59
【问题描述】:
我想使用通用模块为域创建每种类型的 DNS 记录,因此可以使用以下方式调用它:
module "example_com_dns" {
source = "[PATH_TO_MODULES]/modules/dns"
domain = "example.com"
a_records = {
"@" = [SOME IP]
"www" = [SOME IP]
"home" = [SOME IP]
}
txt_records = {
"@" = "txt-foobar1"
"@" = "txt-foobar2"
"mail._domainkey.self" = "foobar"
}
mx_entries = {
"10" = "mail.someprovider.com"
"20" = "mail2.someprovider.com"
}
cname_records {
"cname-foo" = "cname-bar
}
}
我有一些适用于 A、CNAME 和 MX 记录的东西,但 TXT 有一个我需要解决的极端情况。我的模块为每种类型的记录都有资源块,这些记录通过循环运行。我只是粘贴 TXT 的,但它们都是一样的:
resource "digitalocean_record" "this_txt_record" {
for_each = var.txt_records
domain = var.domain
type = "TXT"
name = each.key
value = each.value
}
这一切都很好,除了因为有 2 条记录的键为“@”,因此只创建了最后一条记录(在我上面的示例中,这是"txt-foobar2"):
...
# module.example_com.digitalocean_record.this_txt_record["@"] will be created
+ resource "digitalocean_record" "this_txt_record" {
+ domain = "example.com"
+ fqdn = (known after apply)
+ id = (known after apply)
+ name = "@"
+ ttl = (known after apply)
+ type = "TXT"
+ value = "txt-foobar2"
}
我希望它同时创建“txt-foobar1”和“txt-foobar2”,即使在地图中给定非唯一键。
也许这是错误的方法,我只需要找出一个聪明的循环来解析这个结构吗?:
txt_records = [
{ "@" = "foo" },
{ "@" = "bar"},
{ "mail._domainkey.self" = "foobar"}
]
如果是这样,我目前也失败了:)
【问题讨论】:
-
在您提议的新结构中,
"mail._domainkey.self" = "foobar"会在哪里? -
哦,在同一个列表中,我只是忘了添加它。我现在编辑了问题中的示例以包含它。
-
mail._domainkey.self"是常量字符串,还是可以取不同的值? -
那个总是一样的,但这只是一个例子。大多数情况下,您会有一个 TXT 的唯一记录映射(对于某些其他记录类型,我相信它甚至是强制性的),但是对于我们需要设置 SPF 记录之类的用例,我们总是使用“@ "。