【问题标题】:Create a json parsable k8s configmaps containing lists of quoted elements with Helm使用 Helm 创建包含引用元素列表的 json 可解析 k8s 配置映射
【发布时间】:2020-08-03 15:37:47
【问题描述】:

我正在尝试修改 helm 图表 (this one),并且有一个模板可以生成 configMap。

配置映射随后被不同的模块加载并解析为 json。

问题是我需要在某个时候将字符串列表放入 json 中。仅传递模板中的值会导致未引用的列表。然后我尝试使用一个范围逐个元素地执行它,但后来我得到了一个最后的逗号。我正在部署的图像使用的 json 解析器(我无法控制)不会接受非严格的 json。即,列表中的最后一个元素不能有尾随逗号。

这是一个例子values.yaml

val:
  - "a"
  - "b"
  - "c"

还有一些template.tpl

apiVersion: v1
kind: ConfigMap
metadata:
  name: some-configmap
data:
  cfg.json: |
    {
      "val": [{{ range .Values.val }}{{ . | quote }},{{ end }}]
    }

但这会产生:

{
  "val": ["a","b","c",]
}

json 解析器拒绝,并显示如下消息:

internal/modules/cjs/loader.js:1008
    throw err;
    ^

SyntaxError: /etc/config/..2020_08_03_15_32_26.221540866/pelias.json: Unexpected token ] in JSON at position 1744
    at JSON.parse (<anonymous>)
    at Object.Module._extensions..json (internal/modules/cjs/loader.js:1005:27)
    at Module.load (internal/modules/cjs/loader.js:811:32)
    at Function.Module._load (internal/modules/cjs/loader.js:723:14)
    at Module.require (internal/modules/cjs/loader.js:848:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at getConfig (/code/pelias/schema/node_modules/pelias-config/index.js:66:21)
    at Object.generate (/code/pelias/schema/node_modules/pelias-config/index.js:24:18)
    at Object.<anonymous> (/code/pelias/schema/scripts/create_index.js:2:41)
    at Module._compile (internal/modules/cjs/loader.js:955:30)

如果我只传递空列表,json 解析器会很高兴,但我需要这些参数用于其余的过程。

有没有办法删除最后一个逗号,甚至使用 helm 模板以更优雅的方式加载字符串列表?

(我知道我可以对模板中的值进行硬编码,但我希望此部署可与其他参数一起使用)

提前致谢。

[编辑]

我发现了一个可行的策略: "val": [{{ join "," .Values.val }}]

现在唯一的问题是我需要在values.yaml 中使用双引号:

val:
  - '"a"'
  - '"b"'
  - '"c"'

这没关系,但如果有人有,我会对更清洁的解决方案感兴趣。

【问题讨论】:

    标签: json kubernetes kubernetes-helm


    【解决方案1】:

    您可以使用 toJson 函数将部分(在您的值文件中)转换为 JSON:

    这两个都有效(区别在于您喜欢什么以及您之前是否要应用其他功能):

    "val": {{ toJson .Values.val }}
    
    "val": {{ .Values.val | toJson }}
    

    还有一个toYaml函数。


    示例

    所有示例都使用稍作修改的values.yaml

    config:
      val:
        - a
        - b
        - c
    

    示例 1:仅数组

    data:
      cfg.json: |-
        {
          "val": {{ toJson .Values.config.val }}
        }
    

    结果

    data:
      cfg.json: |-
        {
          "val": ["a","b","c"]
        } 
    

    示例 2:整个部分

    data:
      cfg.json: {{ .Values.config | toJson | quote }}
    

    结果

    data:
      cfg.json: "{\"val\":[\"a\",\"b\",\"c\"]}"
    

    示例 3:漂亮的 JSON

    data:
      cfg.json: |-
        {{- .Values.config | toPrettyJson | nindent 4 }}
    

    结果

    data:
      cfg.json: |-
        {
          "val": [
            "a",
            "b",
            "c"
          ]
        }
    

    示例 4:YAML

    data:
      cfg.json: |-
        {{- .Values.config | toYaml | nindent 4 }}
    

    结果

    data:
      cfg.json: |-
        val:
        - a
        - b
        - c
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 2019-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多