掌舵configmap在values.yaml中包含客户端脚本

时间:2019-04-26 12:38:07

标签: kubernetes kubernetes-helm

我必须将客户端脚本文件包含为configmap,并挂载到pods中,以便在values.yaml中为以下结构创建configmap

app:
  server:
    client-cli1.sh: |
      #!/bin/bash
      echo "Hello World"
    client-cli2.sh: |
      #!/bin/bash
      echo "Hello World"

这是configmap文件

apiVersion: v1
kind: ConfigMap
metadata:
  name: cli-config
data: 
{{ range  $key, $val:= .Values.app.server }}
  {{ $key }}: |
    {{ $val  }}
{{ end }}

我遇到错误“将YAML转换为JSON时发生错误:yaml:第14行:找不到预期的':'” 注意:不能更改结构并且不能使用File函数,因为构建发生在其他地方,仅会提供values.ymal。

如何解析它。

2 个答案:

答案 0 :(得分:1)

尝试一下:

localStorage

答案 1 :(得分:0)

您可以将helm template与相同的-f--set标志一起使用,以查看模板的输出是什么。这是调试此类问题的关键,您可以在继续阅读之前先尝试一下,以了解发生了什么问题以及是否已解决问题。

Kubernetes消耗的YAML文件对缩进非常敏感。 Helm的Go文本/模板引擎并不是特别了解YAML结构。您可能会看到,脚本第二行上的echo根本没有缩进,这违反了YAML的缩进规则。

对此有两个答案:

  1. 使用indent模板函数来缩进要注入的内容。请注意,这包括第一行,因此您无需在YAML模板中缩进该行。

    data: 
    {{ range  $key, $val:= .Values.app.server }}
      {{ $key }}: |
    {{ $val | indent 4 }}
    {{ end }}
    
  2. 头盔有several undocumented extensions。特别是,您可以使用toJson将字符串转换为JSON字符串,包括转义换行符之类的详细信息。 YAML 1.2旨在作为JSON的超集,因此应该可以使用:

    data: 
    {{ range  $key, $val:= .Values.app.server }}
      {{ $key }}: {{ $val | toJson }}
    {{ end }}
    

    为此,您可以使用toYaml使Helm为您完成艰苦的工作:

    data:
    {{ .Values.app.server | toYaml | indent 2 }}
    

请与helm template核对,以确保它们输出的是您期望的结果。第一个选项将产生更具可读性的ConfigMap YAML;第二个是更简洁的模板;但两者应该相等。