如何用ytt替换多行字符串中包含的数组项的映射值?



我试图使用ytt覆盖来替换objectName在我的秘密类以下这个gist示例替换多行字符串的一部分,但它最终附加一个新项目,而不是替换现有的一个。我怎样才能让它对这个案子起作用?

输入文件

db_secret.yaml

kind: SecretProviderClass
metadata:
namespace: default
name: db_credentials
spec:
provider: aws
parameters:
objects: |
- objectName: TO_BE_REPLACED_BY_YTT
objectType: "secretsmanager"
jmesPath: 
- path: username
objectAlias: dbusername
- path: password
objectAlias: dbpassword

overlay.yaml

#@ load("@ytt:overlay", "overlay")
#@ load("@ytt:yaml", "yaml")
#@ load("@ytt:data", "data")
#@ def updates():
- objectName: #@ data.values.db_secret_name
#@ end
#@overlay/match by=overlay.subset({"kind": "SecretProviderClass", "metadata": {"name": "db_credentials"}})
---
spec:
provider: aws
parameters:
#@overlay/replace via=lambda a,_: yaml.encode(overlay.apply(yaml.decode(a), updates()))
objects:

values-staging.yaml

db_secret_name: db-secret-staging

ytt输出:

apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
kind: SecretProviderClass
metadata:
namespace: default
name: db_credentials
spec:
provider: aws
parameters:
objects: |
- objectName: TO_BE_REPLACED_BY_YTT
objectType: secretsmanager
jmesPath:
- path: username
objectAlias: dbusername
- path: password
objectAlias: dbpassword
- objectName: db-secret-staging

需要注意的是,被覆盖的YAML值本身就是一个数组。它是一个只有一项的数组,但仍然是一个数组。

为了到达包含objectName映射项的映射,您需要首先匹配它的父元素:包含数组项的父元素。

最持久的方法是选择包含objectName键的映射的数组项。你可以这样写:

#@ def updates():
+ #@overlay/match by=lambda idx,left,right: "objectName" in left
- objectName: #@ data.values.db_secret_name
#@ end

可以读作:"在被叠加的数组值中"(也就是"左"),找到其值具有映射且键包含字符串"objectname"的数组项。合并这个数组项的值(即这个叠加内的数组项中的地图)到匹配map.">

(游乐场:https://carvel.dev/ytt/#要点:https://gist.github.com/pivotaljohn/9593f971ac5962055ff38c5eeaf1df11)

当使用覆盖时,可视化值树是很有帮助的。文档中有一些很好的例子:https://carvel.dev/ytt/docs/v0.40.0/yaml-primer/

此外,最近有一个vlog帖子,据报道可以帮助人们使用ytt叠加来升级:https://carvel.dev/blog/primer-on-ytt-overlays/

相关内容

  • 没有找到相关文章

最新更新