Terraform Kubernetes, используйте EOF для применения внутри null_resource - PullRequest
0 голосов
/ 19 февраля 2019

Terraform Kubernetes не разрешает использовать что-либо, кроме apiVersion: v1.Однако я хотел обойти это, используя средство null_resource для запуска kubectl apply -f ... и kubectl delete -f ...when = "destroy").

Я пытался заставить это работать, используя kubernetes apply EOFшаблон, но пока не справился.

Вот где я дошел, но, похоже, | - это недопустимый символ.

Также надеюсь, что смогу вытащить ямлстрока в многострочную переменную, поэтому мне не нужно повторять это в нулевом ресурсе.

resource "null_resource" "res_name" {
  provisioner {
    command = <<EOF | kubectl apply -f -
      apiVersion: extensions/v1beta1
      kind: Ingress
      metadata:
        name: some-ingress-name
        annotations:  
          kubernetes.io/ingress.class: nginx
      spec:
        rules:
        - host: subdomain.example.com
          http:
            paths:
            - backend:
                serviceName: some-cluster-ip-service
                servicePort: 80
  }

  provisioner {
    when = "destroy"

    command = <<EOF | kubectl delete -f -
      apiVersion: extensions/v1beta1
      kind: Ingress
      metadata:
        name: some-ingress-name
        annotations:  
          kubernetes.io/ingress.class: nginx
      spec:
        rules:
        - host: subdomain.example.com
          http:
            paths:
            - backend:
                serviceName: some-cluster-ip-service
                servicePort: 80
  }
}

1 Ответ

0 голосов
/ 19 февраля 2019

В вашем коде было несколько ошибок.

  • Вы пропустили окончание EOF для синтаксиса <<EOF ( "here-doc" )
  • Оболочка не может быть запущена командой pipe (|).Поставщик local-exec запускает команду в локальной оболочке.Поэтому используйте трюк <<EOF stdin из комментария к выпуску Github .Спасибо за подсказку.Я тоже этого не знал.

Этот код работает на моей стороне:

resource "null_resource" "res_name" {
  provisioner "local-exec" {
    command = "kubectl apply -f - <<EOF\n${var.ingress_yaml}\nEOF"
  }

  provisioner "local-exec" {
    when = "destroy"
    command = "kubectl delete -f - <<EOF\n${var.ingress_yaml}\nEOF"
  }
}

variable "ingress_yaml" {
  default = <<EOF
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: some-ingress-name
      annotations:
        kubernetes.io/ingress.class: nginx
    spec:
      rules:
      - host: subdomain.example.com
        http:
          paths:
          - backend:
              serviceName: some-cluster-ip-service
              servicePort: 80
    EOF
}

Вместо этого я предлагаю читать в конфигурации YAML из файла.Затем вы можете получить подсветку синтаксиса YAML и ошибки, отображаемые в вашей IDE.Используйте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...