如何在Jsonnet/Ksonnet中编写多行值生成Kubernetes ConfigMap
如何在Jsonnet的parts函数中生成带多行内容的Kubernetes ConfigMap
我来帮你搞定这个问题——在Jsonnet里生成包含多行脚本的ConfigMap,关键是要正确处理YAML的块标量格式,你之前的写法没抓住Jsonnet处理多行字符串的要点。
问题根源
你之前直接把|- line1 line2写在字符串里,Jsonnet不会自动把它解析成YAML的块标量语法,反而会把整个内容当成普通字符串输出,自然不符合预期。
正确写法1:用Jsonnet原生多行字符串(推荐)
Jsonnet支持用|||-(或""")包裹多行字符串,这种写法会直接保留换行,并且生成YAML时会自动适配块标量格式:
parts:: { bootstrap(p):: { apiVersion: 'v1', kind: 'ConfigMap', metadata: { name: p.name + '-bootstrap', labels: { app: p.app, release: p.release, }, }, data: { 'run.sh': |||- echo "Waiting to run nslookup..." sleep 30 ||| } } }
这种写法的优势是直观,和你最终想要的YAML脚本内容几乎完全一致,生成的结果会完美匹配你给出的示例YAML。
正确写法2:动态拼接多行内容(适合需要变量注入的场景)
如果你的脚本内容需要动态生成(比如根据参数调整sleep时间),可以用std.join把字符串数组拼接成多行字符串:
parts:: { bootstrap(p):: { apiVersion: 'v1', kind: 'ConfigMap', metadata: { name: p.name + '-bootstrap', labels: { app: p.app, release: p.release, }, }, data: { 'run.sh': std.join('\n', [ 'echo "Waiting to run nslookup..."', 'sleep 30', // 这里可以添加动态内容,比如从参数p中读取值 'echo "Bootstrap completed for release: ' + p.release + '"' ]) } } }
这种方式生成的YAML同样会正确识别多行内容,Kubernetes的ConfigMap也能正常读取脚本。
验证生成结果
用上面两种写法生成的YAML都会和你预期的一致:
apiVersion: v1 kind: ConfigMap metadata: name: nifi-bootstrap labels: app: nifi release: nifi data: run.sh: |- echo "Waiting to run nslookup..." sleep 30
内容的提问来源于stack exchange,提问作者Xiang Zhang
相关产品推荐
相关产品推荐

