envsubst 使用 identation 的 yaml 文件

envsubst 使用 identation 的 yaml 文件

这是一个 kubernetes yaml 配置图

apiVersion: v1
kind: ConfigMap
metadata:
  name: $CONFIG_NAME
  namespace: processing
data:
  configuration.json: |
    {
      "test" : $TESTOBJECT
    }

$TESTOBJECT是一个 JSON 对象示例,例如

{
  "sample1":"sample1",
  "sample2":"sample2"
}

我尝试解决该问题的方法是使用 jq 提取对象,然后使用 envsubst 注入。问题是这样做会导致 identation 错误

#!/bin/bash
export TESTOBJECT=$(jq .formats configuration.json)
envsubst '$TESTOBJECT' < "configuration.yml" > "configuration2.yml"

我该如何修复这个缩进?

答案1

方法 1:使用-c( --compact-output) 选项杰奇,为您提供单行文档。

方法 2:将整个configuration.yml文件转换为 JSON,使用杰奇以 JSON 兼容的方式替换变量,将其转换回 YAML。

yaml2json configuration.yaml \
  | jq --slurpfile obj configuration.json \
    '(.data | .["configuration.json"]) = ({test: $obj[0] | .formats} | tojson)' \
  | json2yaml > configuration2.yaml

方法 3:使用具有自身 YAML 和 JSON 支持的编程语言:

#!/usr/bin/env python3
import json, yaml
with open("configuration.yml", "r") as fh:
    yconf = yaml.load(fh)
with open("configuration.json", "r") as fh:
    jconf = json.load(fh)
jconf = {"test": jconf["formats"]}
yconf["data"]["configuration.json"] = json.dumps(jconf)
with open("configuration2.yml", "w") as fh:
    yaml.dump(yconf, stream=fh)

相关内容