繁体   English   中英

使用 Helm 创建包含引用元素列表的 json 可解析 k8s 配置映射

[英]Create a json parsable k8s configmaps containing lists of quoted elements with Helm

我试图修改一个掌舵图(这个),并且有一个模板可以生成一个 configMap。

配置 map 然后被不同的模块加载并解析为 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 解析器很高兴,但我需要那些 arguments 用于该过程的 rest。

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

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

提前致谢。

[编辑]

我通过以下方式找到了一个可行的策略: "val": [{{ join ",".Values.val }}]

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

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

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

您可以使用toJson function 将部分(在您的值文件的情况下)转换为 JSON:

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

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

还有一个toYaml function。


例子

所有示例都使用稍微修改的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM