首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用ytt替换包含在多行字符串中的数组项的映射值?

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

Stack Overflow用户
提问于 2022-05-17 14:32:58
回答 1查看 350关注 0票数 1

我试图使用ytt覆盖来替换此要点示例仅替换多行字符串的一部分。后面的秘密类中的此要点示例仅替换多行字符串的一部分。,但是它最终会追加一个新项,而不是替换现有的条目。我怎么才能让它为这个案子工作呢?

输入文件

db_secret.yaml

代码语言:javascript
复制
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

代码语言:javascript
复制
#@ 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

代码语言:javascript
复制
db_secret_name: db-secret-staging

ytt产出:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-22 15:51:19

注意,要覆盖的YAML值本身就是一个数组。它是一个由一个项目组成的数组,但仍然是一个数组。

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

要做到这一点,最持久的方法是选择包含objectName键的映射的数组项。你可以这样说:

代码语言:javascript
复制
  #@ def updates():
+ #@overlay/match by=lambda idx,left,right: "objectName" in left
  - objectName: #@ data.values.db_secret_name
  #@ end

可以阅读:“在被覆盖的数组值‘(也称为’左‘)中,查找其值具有包含字符串”objectName“的映射的数组项.将该数组项的值(即该覆盖范围内的数组项中的映射)合并到该匹配的映射中。”

(游乐场:https://carvel.dev/ytt/#gist: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/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72275910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档