首页 > 解决方案 > 在资源模板文件中迭代嵌套数据 for_each

问题描述

我会创建一个清单文件,其中可以是一个或多个端口。你能提示我如何迭代locals.k8_manifest吗?

我尝试使用动态块,但看起来它没有在资源内部分叉,template_file或者我的语法错误。

   ...
    spec:
      containers:
        - name: 123
          image: 123
          ports:
            - containerPort: 100
            - containerPort: 200
            - containerPort: 300
          resources:
   ....
locals {
  k8_manifest = {
    "alertmanager" = {
      name                          = "alertmanager"
      namespace                     = "victoriametrics"
      label_k8s-app                 = "alertmanager"
      label_purpose                 = "victoriametrics"
      description                   = "Prometheus alert manager for send"
      replicas_number               = 1
      container_name                = "alertmanager"
      container_image_address       = "11111111111.dkr.ecr.us-east-1.amazonaws.com/alertmanager:0.23.0"
      restartPolicy                 = "Always"
      terminationGracePeriodSeconds = "30"
      dnsPolicy                     = "ClusterFirst"
      schedulerName                 = "default-scheduler"
      strategy_type_update          = "RollingUpdate"
      resources_cpu                 = "1"
      resources_memory              = "1Gi"
      ports = {
        containerport = "9093",
        containerport = "9094",
        containerport = "9096"
      }
    },
  }
}


data "template_file" "k8_manifest" {
  for_each = local.k8_manifest
  template = file("${path.module}/manifests/manifests.tpl")

  vars = {
    name                          = try(each.value.name, null)
    namespace                     = try(each.value.namespace, null)
    label_k8s-app                 = try(each.value.label_k8s-app, null)
    label_purpose                 = try(each.value.label_purpose, null)
    description                   = try(each.value.description, null)
    replicas_number               = try(each.value.replicas_number, null)
    container_name                = try(each.value.container_name, null)
    container_image_address       = try(each.value.container_image_address, null)
    restartPolicy                 = try(each.value.restartPolicy, null)
    terminationGracePeriodSeconds = try(each.value.terminationGracePeriodSeconds, null)
    dnsPolicy                     = try(each.value.dnsPolicy, null)
    schedulerName                 = try(each.value.schedulerName, null)
    strategy_type_update          = try(each.value.strategy_type_update, null)
    resources_cpu                 = try(each.value.resources_cpu, null)
    resources_memory              = try(each.value.resources_memory, null)
    containerport                 = try(each.value.ports, null)
    # dynamic "containerport" {
    #   content {
    #     containerport = each.value.ports
    #   }
    # }
  }

}
kind: Deployment
apiVersion: apps/v1
metadata:
  name: ${name}
  namespace: ${namespace}
  labels:
    k8s-app: ${label_k8s-app}
    purpose: ${label_purpose}
  annotations:
    description: ${description}
spec:
  replicas: ${replicas_number}
  selector:
    matchLabels:
      k8s-app: ${label_k8s-app}
      purpose: ${label_purpose}
  template:
    metadata:
      name: ${name}
      labels:
        k8s-app: ${label_k8s-app}
        purpose: ${label_purpose}
      annotations:
        description: ${description}
    spec:
      containers:
        - name: ${name}
          image: ${container_image_address}
          ports:
            {% for chapter in containerport ~}
            - containerPort: ${containerport}
            {% endfor ~}
          resources:
            requests:
              cpu: ${resources_cpu}
              memory: ${resources_memory}
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 300

标签: amazon-web-servicesterraformterraform-provider-aws

解决方案


正如 Marko E 所说,它需要使用templatefile

templatefile("${path.module}/manifests/manifests.tpl

反而

file("${path.module}/manifests/manifests.tpl")


推荐阅读