kubernetes 使用jq将SecretMapKeyRef转换为SecretKeyRef

jm81lzqq  于 2024-01-06  发布在  Kubernetes
关注(0)|答案(3)|浏览(138)

下面是我的部署输入

  1. {
  2. "apiVersion": "apps/v1",
  3. "kind": "Deployment",
  4. "spec": {
  5. "replicas": 1,
  6. "selector": {
  7. "matchLabels": {
  8. "io.kompose.service": "item-api"
  9. }
  10. },
  11. "strategy": {
  12. "type": "Recreate"
  13. },
  14. "template": {
  15. "spec": {
  16. "containers": [
  17. {
  18. "env": [
  19. {
  20. "name": "APP_JWTSECRET",
  21. "valueFrom": {
  22. "configMapKeyRef": {
  23. "key": "APP_JWTSECRET",
  24. "name": "item-api-env"
  25. }
  26. }
  27. },
  28. {
  29. "name": "SPRING_DATASOURCE_BASEXML_JDBCURL",
  30. "valueFrom": {
  31. "configMapKeyRef": {
  32. "key": "SPRING_DATASOURCE_BASEXML_JDBCURL",
  33. "name": "item-api-env"
  34. }
  35. }
  36. }
  37. ...

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

  1. "name": "APP_JWTSECRET",
  2. "valueFrom": {
  3. "configMapKeyRef": {
  4. "key": "APP_JWTSECRET",
  5. "name": "item-api-env"
  6. }
  7. }
  8. }


将转变为

  1. "name": "APP_JWTSECRET",
  2. "valueFrom": {
  3. "secretKeyRef": {
  4. "key": "APP_JWTSECRET",
  5. "name": "app-jwtsecret"
  6. }
  7. }
  8. }


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

  1. 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)分配了一个关键字
  1. (
  2. .spec.template.spec.containers[].env[]?
  3. | select(.name | test("SECRET|PASSWORD|KEY"))
  4. )
  5. .valueFrom |= with_entries(select(.key == "configMapKeyRef") |= {
  6. key: "secretKeyRef", value: (.value | .name = (.key | ascii_downcase))
  7. })

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

展开查看全部
d6kp6zgx

d6kp6zgx2#

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

  1. .spec.template.spec.containers
  2. |= map(
  3. (.env
  4. |= map(
  5. if (.name|test("SECRET|PASSWORD|KEY"))
  6. then .valueFrom
  7. |= with_entries(.key="secretKeyRef"
  8. |.value.name=(.value.key|ascii_downcase|gsub("_";"-"))
  9. )
  10. else .
  11. end
  12. )
  13. )? // .
  14. )

字符串
jqplay.org上试试。

展开查看全部
ecbunoof

ecbunoof3#

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

  1. .spec.template.spec.containers[].env[] |= {name} +
  2. if .name | test("SECRET|PASSWORD|KEY") then
  3. .valueFrom |= (
  4. with_entries(
  5. if .key == "configMapKeyRef" then .key = "secretKeyRef" end |
  6. .value |= {key} + {name: .key|ascii_downcase}
  7. )
  8. )
  9. end

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

相关问题