【问题标题】:How can I automate the removal of kubernetes secrets from a yaml file?如何自动从 yaml 文件中删除 kubernetes 机密?
【发布时间】:2020-10-15 09:03:29
【问题描述】:

我有一个包含许多 Kubernetes YAML 对象的文件。 我正在寻找一种从文本文件中删除所有 K8s Secret YAML 对象的方法,这些对象由 YAML 块中包含的 "kind: Secret" 字符串标识。这应该删除从“apiVersion”到“---”之前的所有内容,表示下一个对象的开始。

我研究过 Sed、Python 和 yq 工具,但没有成功。 YAML 可以包含任意数量的秘密。

如何自动剥离这些“秘密”块?

apiVersion: v1
data:
  username: dGVzdAo=
  password: dGVzdHBhc3N3b3JkCg==
kind: Secret
metadata:
  name: my-secret-1
type: Opaque
---
apiVersion: v1
kind: Pod
metadata:
  name: test-site
  labels:
    app: web
spec:
  containers:
    - name: front-end
      image: nginx
      ports:
        - containerPort: 80
    - name: rss-reader
      image: nickchase/rss-php-nginx:v1
      ports:
        - containerPort: 88
---
apiVersion: v1
data:
  username: dGVzdAo=
  password: dGVzdHBhc3N3b3JkCg==
kind: Secret
metadata:
  name: my-secret-2
type: Opaque
---

【问题讨论】:

  • 最好的方法是使用合适的 YAML 解析器。是否有任何“标记”标识每个对象的开始和结束?除了“---”。
  • @virolino --- 是兼容的 yaml 解析器分离文档的方式

标签: regex kubernetes sed yaml yq


【解决方案1】:

yq 可以做到这一点(以及下面的jq

pip install yq
yq --yaml-output 'select(.kind != "Secret")' input.yaml

您可能需要在示例末尾删除空文档,这会导致输出有点奇怪

注意,还有一个不同的 yq utility 似乎不像 jq 那样做,所以我不知道如何制作那个工作。

【讨论】:

  • 似乎github.com/kislyuk/yq 是这个用例的方法。 mikeferah 的 yq 具有更好的功能,但在此方面效果不佳。提出功能/错误请求 - github.com/mikefarah/yq/issues/476
  • @Inian 是的,我不太确定如何在 go yq 中处理它,因为它似乎向输入输出不同的结构,这让我对多个文档感到困惑
【解决方案2】:

使用命令 awk 在每次出现 --- 时拆分文件的 shell 脚本怎么样? (有关示例,请参阅此link 的第 5 节和第 6 节。)这样,脚本可以单独评估每个部分,并将与 Secret 不对应的部分发送到新的输出文件。

【讨论】:

    【解决方案3】:

    纯正则表达式,你可以搜索

    (^|---).*?kind: Secret.*?(---|$)
    

    并替换为:

    ---
    

    测试here

    注意:最后,您可能需要“手动”删除一些额外的 --- - 但这应该没什么大不了的。

    【讨论】:

      猜你喜欢
      • 2015-03-29
      • 2021-08-31
      • 2018-09-12
      • 1970-01-01
      • 2018-07-21
      • 2018-08-17
      • 2019-10-13
      • 2021-06-09
      • 2016-08-21
      相关资源
      最近更新 更多