kubernetes - 将复杂的YAML转换为.tf

标签 kubernetes yaml terraform

我有以下相对复杂的YAML:

apiVersion: v1
kind: ConfigMap
metadata:
  name: aws-auth
  namespace: kube-system
data:
  mapRoles: |
    - rolearn: ${aws_iam_role.tf-eks-node.arn}
      username: system:node:{{EC2PrivateDNSName}}
      groups:
        - system:bootstrappers
        - system:nodes

我现在想将其转换为Terraform-Kubernetes兼容的资源,该资源仅由字符串,列表和映射组成。我该怎么做呢?
我找到了一个使用连字符表示列表的LimitRange如何显示here的示例:
resource "kubernetes_limit_range" "example" {
    metadata {
        name = "terraform-example"
    }
    spec {
        limit {
            type = "Pod"
            max {
                cpu = "200m"
                memory = "1024M"
            }
        }
        limit {
            type = "PersistentVolumeClaim"
            min {
                storage = "24M"
            }
        }
        limit {
            type = "Container"
            default {
                cpu = "50m"
                memory = "24M"
            }
        }
    }
}

我目前对mapRoles块的尝试如下:
mapRole { rolearn = "${aws_iam_role.tf-eks-node.arn}"
      username = "system:node:{{EC2PrivateDNSName}}"
      groups = ["system:bootstrappers","system:nodes"]}

这是不正确的,因为mapRoles是一个列表(因为连字符所表示的单数元素是一个列表元素);但是如果它是一个列表,并且连字符后面的所有内容都是list元素,那么列表标题是什么?

使用答案中提到的想法,我尝试将元数据块预先放在数据块中:
data "template_file" "map_roles" {
  template = <<EOF
- rolearn: ${var.arn}
  username: system:node:{{EC2PrivateDNSName}}
  groups:
    - system:bootstrappers
    - system:nodes
EOF

  vars {
    arn = "${var.kube-arn}"
  }
}

resource "kubernetes_config_map" "aws_auth" {
  metadata {
    name = "aws-auth"
    namespace = "kube-system"
  }
  data {
    mapRoles = "${data.template_file.map_roles.template}"
  } 
}

最佳答案

因此,当您在YAML中拥有此功能时:

data:
  mapRoles: |

这意味着|之后的所有内容都是一个字符串,它是mapRoles的值。我不太确定那是你想要的。如果需要列表列表,则需要这样的内容:
data:
  mapRoles:
  - rolearn: ${aws_iam_role.tf-eks-node.arn}
  - username: system:node:{{EC2PrivateDNSName}}
  - groups:
    - system:bootstrappers
    - system:nodes

这将转化为HCL:
"data" = {
  "mapRoles" = {
    "rolearn" = "${aws_iam_role.tf-eks-node.arn}"
  }

  "mapRoles" = {
    "username" = "system:node:{{EC2PrivateDNSName}}"
  }

  "mapRoles" = {
    "groups" = ["system:bootstrappers", "system:nodes"]
  }
}

关于kubernetes - 将复杂的YAML转换为.tf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53541656/

相关文章:

javascript - 如何将 YAML 文件转换为 Dockerfile

amazon-web-services - 如何为合并的 GitHub 拉取请求触发 CodePipeline?

amazon-web-services - 来自另一个 CloudFormation 的引用资源没有输出?

yaml - 如何检查主分支是否在 Travis 下使用标签推送?

amazon-web-services - 启动配置更新 terraform 后实例未刷新

google-cloud-platform - GCP 中的 oauth 配置是否有任何 terraform 资源(或 CLI 命令),也可以在 GCP 中添加授权域

go - 当我更新节点或使用 client-go 部署时,我偶尔会遇到这样的错误 "the object has been modified"

azure - Kubernetes - 如何从 "internal Load Balancer"切换到 "ingress controller"

kubernetes - `kubectl` 未找到。如果需要,试试: 'minikube kubectl -- get pods -A'

postgresql - KubeDB on minikube 挂载本地目录