3

我正在探索 yq 来修改我的 YAML,我想spec在 ImageStream下添加一个新元素name == openshift45

apiVersion: v1
items:
- apiVersion: image.openshift.io/v1
  kind: ImageStream
  metadata:
    annotations:
      openshift.io/generated-by: OpenShiftNewApp
    creationTimestamp: null
    labels:
      app: openshift45
      app.kubernetes.io/component: openshift45
      app.kubernetes.io/instance: openshift45
    name: nodejs-10
  spec:
    lookupPolicy:
      local: false
    tags:
    - annotations:
        openshift.io/imported-from: registry.access.redhat.com/ubi8/nodejs-10
      from:
        kind: DockerImage
        name: registry.access.redhat.com/ubi8/nodejs-10
      generation: null
      importPolicy: {}
      name: latest
      referencePolicy:
        type: ""
  status:
    dockerImageRepository: ""
- apiVersion: image.openshift.io/v1
  kind: ImageStream
  metadata:
    annotations:
      openshift.io/generated-by: OpenShiftNewApp
    creationTimestamp: null
    labels:
      app: openshift45
      app.kubernetes.io/component: openshift45
      app.kubernetes.io/instance: openshift45
    name: openshift45
  spec:
    lookupPolicy:
      local: false
  status:
    dockerImageRepository: ""

以下命令返回有效metadata元素。现在,我想移动到父级,然后选择spec. 这可能与yq- https://github.com/mikefarah/yq吗?

yq r openshift45.yaml --printMode pv "items(kind==ImageStream).(name==openshift45)"

返回

items.[1].metadata:
  annotations:
    openshift.io/generated-by: OpenShiftNewApp
  creationTimestamp: null
  labels:
    app: openshift45
    app.kubernetes.io/component: openshift45
    app.kubernetes.io/instance: openshift45
  name: openshift45

预期输出:

apiVersion: v1
items:
- apiVersion: image.openshift.io/v1
  kind: ImageStream
  metadata:
    annotations:
      openshift.io/generated-by: OpenShiftNewApp
    creationTimestamp: null
    labels:
      app: openshift45
      app.kubernetes.io/component: openshift45
      app.kubernetes.io/instance: openshift45
    name: nodejs-10
  spec:
    lookupPolicy:
      local: false
    tags:
    - annotations:
        openshift.io/imported-from: registry.access.redhat.com/ubi8/nodejs-10
      from:
        kind: DockerImage
        name: registry.access.redhat.com/ubi8/nodejs-10
      generation: null
      importPolicy: {}
      name: latest
      referencePolicy:
        type: ""
  status:
    dockerImageRepository: ""
- apiVersion: image.openshift.io/v1
  kind: ImageStream
  metadata:
    annotations:
      openshift.io/generated-by: OpenShiftNewApp
    creationTimestamp: null
    labels:
      app: openshift45
      app.kubernetes.io/component: openshift45
      app.kubernetes.io/instance: openshift45
    name: openshift45
  spec:
    *dockerImageRepository: <$MYREGISTRY>/<$MYNAMESPACE>/<$MYPROJECT>*
    lookupPolicy:
      local: false
  status:
    dockerImageRepository: ""
4

2 回答 2

2

mikefarah/yq中的路径表达式没有完整记录,以展示如何使用多个条件到达所需对象的真实示例。因此,对于有问题的 YAML,使用一个独特的条件,您可以执行以下操作。验证于yq version 3.3.2

yq w openshift45.yaml 'items.(metadata.name == openshift45).spec.dockerImageRepository' '<$MYREGISTRY>/<$MYNAMESPACE>/<$MYPROJECT>'

您可以使用该-i标志和 write 来就地修改 YAML。请参阅就地更新文件

如果不希望这样做,并且您需要多个条件选择来获得所需的对象,建议在 GitHub 页面上提出问题 - https://github.com/mikefarah/yq/issues请求相同的正确语法。

于 2020-10-06T07:18:22.533 回答
0

目前在 yq 中是不可能的。您必须在变量中获取第一个命令的输出并将该变量传递给下一个。

yq 是 jq 的一个包装器,但它没有自定义函数的功能。自定义函数可以在一个地方使用文档的任何层次结构中的任何值。

感谢 Inian 指出 OP 没有使用包装器 yq 版本。不幸的是,使用的版本目前也不允许使用自定义函数。

于 2020-10-05T17:52:25.170 回答