Перевод комплекса YAML в .tf - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть следующий, относительно сложный фрагмент 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 ресурс, который состоит исключительно из String, Lists и Maps.Как мне это сделать?Я нашел пример того, как LimitRange будет выглядеть здесь с использованием дефисов для обозначения списка:

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 является списком (потому что его единственный элемент является элементом списка, как показано дефисом);но если это список, и все, что после дефиса является элементом списка, каков заголовок списка?

, используя идею, упомянутую в ответе, я попытался заранее поместить блок метаданных в блок данных.:

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}"
  } 
}

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Первый шаг - найти тип ресурса Terraform, который соответствует тому, что вы ищете. Провайдер Terraform Kubernetes исторически был немного скудным, но теперь включает базовые объекты, такие как Deployments и ConfigMaps .(Однако, не DaemonSets.)

Как отмечает @Rico в своем ответе, data: ConfigMap - это просто отображение от строкового имени к строковому значению, а в вашем примере используется многострочный строковый синтаксис YAML.,HCL имеет другой синтаксис, который выглядит как оболочка-документы.Чтобы выполнить интерполяцию, вам также необходимо передать его через шаблон .Таким образом, вы должны быть в состоянии перевести это на:

data "template_file" "map_roles" {
  template = <<EOF
- rolearn: ${arn}
  username: system:node:{{EC2PrivateDNSName}}
  groups:
    - system:bootstrappers
    - system:nodes
EOF

  vars {
    arn = ${aws_iam_role.tf-eks-node.arn}
  }
}

resource "kubernetes_config_map" "aws_auth" {
  metadata {
    name = "aws-auth"
    namespace = "kube-system"
  }
  data {
    mapRoles = ${data.template_file.map_roles}
  } 
}
0 голосов
/ 03 декабря 2018

Мне удалось заставить его работать с некоторыми изменениями в ответе Дэвида Мэйза:

resource "kubernetes_config_map" "aws_auth" {
  metadata {
    name = "aws-auth"
    namespace = "kube-system"
  }
  data {
    mapRoles = <<EOF
- rolearn: ${var.kube-arn}
  username: system:node:{{EC2PrivateDNSName}}
  groups:
    - system:bootstrappers
    - system:nodes
EOF
  } 
}

Идея поместить | -вход в EOF-блок - это то, чего мне не хватало.Terraform может разрешить ввод переменных непосредственно в этом блоке, поэтому мне даже не понадобился блок данных, чтобы сначала установить шаблон.

0 голосов
/ 30 ноября 2018

Итак, если у вас есть это в 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"]
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...