首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >terrraform得到yaml值

terrraform得到yaml值
EN

Stack Overflow用户
提问于 2021-09-22 15:32:08
回答 1查看 577关注 0票数 0

我需要将yaml片段中的值输入到1. Route53区域中,其中我需要apex_nme作为区域名称,2.将作为Route53记录添加到特定区域的记录。我不知道该怎么做。任何帮助都是非常感谢的。

代码语言:javascript
复制
resource "aws_route53_zone" "this" {
  for_each = {
    for apex in var.source_domains : apex =>  {

      name = apex.name
      }
  }
}

resource "aws_route53_record" "this" {
  for_each = {
  for records in var.source_domains : records =>  {
    zone_id = aws_route53_zone.this[each.key].zone_id
    name    = subdomains.records
    type    = "A"
    records = ["192.168.0.1"]
  }
  }
}
代码语言:javascript
复制
source_domains:
  - apax_name: elastic2ls.com
    records:
      - elastic2ls.com
      - www.elastic2ls.com
  - apax_name: elastic2ls.ch
    records:
    - elastic2ls.ch
    - www.elastic2ls.ch
    - image.elastic2ls.ch
    - m.elastic2ls.ch
    - static.elastic2ls.ch
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-22 16:34:59

您的问题似乎是关于YAML解析的,但我怀疑您实际上是在询问如何为aws_route53_record.this编写aws_route53_record.this表达式,以便在所有域创建所有记录。

为了完整起见,我将注意到,您可以通过让调用模块用如下表达式定义该变量来从该YAML中填充var.source_domains

代码语言:javascript
复制
module "example" {
  source = "../modules/example"

  source_domains = yamldecode(file("${path.module}/example.yaml")).source_domains
  # ...
}

那么,在模块内部,我首先声明具有适当类型约束的模块,以明确我们期望的数据结构,如下所示:

代码语言:javascript
复制
variable "source_domains" {
  type = set(object({
    apax_name = string
    records   = set(string)
  }))
}

在这里,我将顶级结构和嵌套记录定义为set类型,因为我们使用它们的方式意味着排序并不重要,我们期望它们都是唯一的。

有了所有这些,我们就可以开始写出资源定义了。让我们从区域开始,这是比较简单的情况,因为var.source_domains已经满足了每个资源实例都有一个元素的主要要求:

代码语言:javascript
复制
resource "aws_route53_zone" "example" {
  for_each = {
    for d in var.source_domains : d.apax_name => d
  }

  name = each.value.apax_name
}

使用您共享的示例YAML输入,此块将声明此资源的两个实例:

  • aws_route53_zone.example["elastic2ls.com"]
  • aws_route53_zone.example["elastic2ls.ch"]

aws_route53_record声明有点棘手,因为我们需要将输入数据结构投影到一个新结构中,在这个结构中,每个记录都有一个元素要声明,而不是每个区域有一个元素。for_each函数的常用用法,我们可以调整文档中的网络和子网示例来处理区域和记录:

代码语言:javascript
复制
locals {
  zone_records = flatten([
    for d in var.source_domains : [
      for r in d.records : {
        zone_name = d.apax_name
        zone_id   = aws_route53_zone.example[d.apax_name].id
        record    = r
      }
    ]
  ])
}

这个局部值正在构造一个对象列表,其中每个对象表示一个区域和记录的有效配对。这意味着元素的数量与我们需要声明的aws_route53_record实例的数量相匹配,因此我们可以在for_each中使用这个数据结构。

代码语言:javascript
复制
resource "aws_route53_record" "example" {
  for_each = {
    for zr in local.zone_records : zr.record => zr
  }

  zone_id = each.value.zone_id
  name    = each.value.record
  # ...
}

这个示例与典型的flatten/for_each模式略有不同,因为所有记录名称都已经嵌入了区域名称,因此我们不需要通常的表达式来生成包含多个部分的复合唯一键,比如文档示例中的"${subnet.network_key}.${subnet.subnet_key}"。在这种情况下,仅记录名称就足以使所有对之间都有唯一的键。

然后,再次根据您的YAML示例声明以下实例:

  • aws_route53_record.example["elastic2ls.com"]
  • aws_route53_record.example["www.elastic2ls.com"]
  • aws_route53_record.example["elastic2ls.ch"]
  • aws_route53_record.example["www.elastic2ls.ch"]
  • aws_route53_record.example["image.elastic2ls.ch"]
  • aws_route53_record.example["m.elastic2ls.ch"]
  • aws_route53_record.example["static.elastic2ls.ch"]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69287279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档