kubernetes 使用jq将SecretMapKeyRef转换为SecretKeyRef

jm81lzqq  于 12个月前  发布在  Kubernetes
关注(0)|答案(3)|浏览(111)

下面是我的部署输入

{
  "apiVersion": "apps/v1",
  "kind": "Deployment",
  "spec": {
    "replicas": 1,
    "selector": {
      "matchLabels": {
        "io.kompose.service": "item-api"
      }
    },
    "strategy": {
      "type": "Recreate"
    },
    "template": {
      "spec": {
        "containers": [
          {
            "env": [
              {
                "name": "APP_JWTSECRET",
                "valueFrom": {
                  "configMapKeyRef": {
                    "key": "APP_JWTSECRET",
                    "name": "item-api-env"
                  }
                }
              },
              {
                "name": "SPRING_DATASOURCE_BASEXML_JDBCURL",
                "valueFrom": {
                  "configMapKeyRef": {
                    "key": "SPRING_DATASOURCE_BASEXML_JDBCURL",
                    "name": "item-api-env"
                  }
                }
              }
...

字符串
对于env中的每个项目,如果名称包含(SECRET),我想将configMapKeyRef转换为secretKeyRef|密码|KEY)模式,然后将secretKeyRef名称替换为小写的键名。
例如:

"name": "APP_JWTSECRET",
                "valueFrom": {
                  "configMapKeyRef": {
                    "key": "APP_JWTSECRET",
                    "name": "item-api-env"
                  }
                }
              }


将转变为

"name": "APP_JWTSECRET",
                "valueFrom": {
                  "secretKeyRef": {
                    "key": "APP_JWTSECRET",
                    "name": "app-jwtsecret"
                  }
                }
              }


我尝试了一些操作with_entries没有任何成功:

jq -r '.spec.template.spec.containers[].env[]|with_entries(.key |test(PASSWORD|SECRET))'

pxyaymoc

pxyaymoc1#

  • 导航到所需位置:.spec.template.spec.containers[].env[]?
  • 筛选符合您标准的产品:select(.name | test("SECRET|PASSWORD|KEY"))
  • 利用这些结果并深入研究:(…).valueFrom
  • 通过访问.key.value来更新它:|= with_entries(…)
  • 仅当密钥与该名称匹配时:select(.key == "configMapKeyRef") |= …
  • 通过重新定义键和值:{key: "secretKeyRef", value: …}
  • 新值基于前一个值,并为name:.value | .name = (.key | ascii_downcase)分配了一个关键字
(
    .spec.template.spec.containers[].env[]?
    | select(.name | test("SECRET|PASSWORD|KEY"))
)

.valueFrom |= with_entries(select(.key == "configMapKeyRef") |= {
    key: "secretKeyRef", value: (.value | .name = (.key | ascii_downcase))
})

个字符
Demo
注:我认为从app_jwtsecretapp-jwtsecret的更改是一个错字。

d6kp6zgx

d6kp6zgx2#

这里有一种方法,containersenv数组被重写为所需的修改,或者如果不满足条件则保持 “原样”

.spec.template.spec.containers
|= map(
    (.env
     |= map(
          if (.name|test("SECRET|PASSWORD|KEY"))
          then .valueFrom
            |= with_entries(.key="secretKeyRef"
                 |.value.name=(.value.key|ascii_downcase|gsub("_";"-"))
               )
          else .
          end
        )
    )? // .
)

字符串
jqplay.org上试试。

ecbunoof

ecbunoof3#

使用jq的一种方法是下面这样做。

.spec.template.spec.containers[].env[] |= {name} + 
if .name | test("SECRET|PASSWORD|KEY") then 
    .valueFrom |= ( 
        with_entries(
            if .key == "configMapKeyRef" then .key = "secretKeyRef" end | 
                .value |= {key} + {name: .key|ascii_downcase}
        )
    )
end

字符串
jqplay演示-https://jqplay.org/s/UfYQYpJIa6o

相关问题