Yaml yq:如何读取同级元素值?

Yaml yq:如何读取同级元素值?,yaml,yq,Yaml,Yq,我正在探索yq以修改我的YAML,我想在ImageStream的spec下添加一个新元素,使用name==openshift45 apiVersion: v1 items: - apiVersion: image.openshift.io/v1 kind: ImageStream metadata: annotations: openshift.io/generated-by: OpenShiftNewApp creationTimestamp: null

我正在探索yq以修改我的YAML,我想在ImageStream的
spec
下添加一个新元素,使用
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: ""
下面的命令返回有效的
元数据
元素。现在,我想移动到父级,然后选择
spec
。这是否可能与yq一起使用

返回

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: ""
apiVersion:v1 项目: -apiVersion:image.openshift.io/v1 种类:ImageStream 元数据: 注释: openshift.io/generated-by:OpenShiftNewApp creationTimestamp:空 标签: 应用程序:openshift45 app.kubernetes.io/component:openshift45 app.kubernetes.io/instance:openshift45 名称:nodejs-10 规格: lookupPolicy: 本地:错 标签: -注释: openshift.io/imported-from:registry.access.redhat.com/ubi8/nodejs-10 发件人: 种类:DockerImage 名称:registry.access.redhat.com/ubi8/nodejs-10 生成:空 进口政策:{} 姓名:最新 参考政策: 类型:“” 地位: DockerMagnePository:“ -apiVersion:image.openshift.io/v1 种类:ImageStream 元数据: 注释: openshift.io/generated-by:OpenShiftNewApp creationTimestamp:空 标签: 应用程序:openshift45 app.kubernetes.io/component:openshift45 app.kubernetes.io/instance:openshift45 名称:openshift45 规格: *DockerManager地址://* lookupPolicy: 本地:错 地位: DockerMagnePository:“
目前在yq中不可能。您必须获取变量中第一个命令的输出,并将该变量传递给下一个变量

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

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

没有完整的文档说明如何使用多个条件到达所需对象的真实示例。因此,对于所讨论的YAML,使用一个独特的条件,您可以执行如下操作。已在yq版本3.3.2中验证

yq w openshift45.yaml 'items.(metadata.name == openshift45).spec.dockerImageRepository' '<$MYREGISTRY>/<$MYNAMESPACE>/<$MYPROJECT>'
yq w openshift45.yaml'项。(metadata.name==openshift45)。spec.dockerImageRepository'/'
您可以将
-i
标志与写入一起使用,以就地修改YAML。看


如果不需要这样做,并且需要多个条件选择才能到达所需的对象,建议在GitHub页面上提出一个问题-为相同的对象请求正确的语法。

您希望获得什么样的预期输出?如问题中所述,您希望在ImageStream的规范中添加一个名为openshift45Yes的新元素,但是请更新所需的确切输出结构,而不是让人们假设输出用预期的输出更新了我的问题,并向要添加的元素添加了*。有两个版本的
jq
outthere@Inian,谢谢你指出。不幸的是,它也不支持自定义函数。您不需要自定义函数,一个正确的路径表达式就足够了。看看我的答案。同样,你的答案可能会让未来的读者感到困惑。因此,如果你没有一个明确的解决方案,建议删除它就像一个符咒,但我必须添加
-I
来更新YAML
内联
@VidyasagarMachupalli:只是添加了一个相同的注释,这就是将dockerImageRepository添加到所有类型(服务、部署等)中。我希望将其添加到唯一的ImageStream类。Thanks@VidyasagarMachupalli:我确实加了一条关于那件事的说明,对吗?mikefarah/yq中没有详细记录多个条件表达式。让我再试一次time@VidyasagarMachupalli:从现在起,yq不可能-也是
yq w openshift45.yaml 'items.(metadata.name == openshift45).spec.dockerImageRepository' '<$MYREGISTRY>/<$MYNAMESPACE>/<$MYPROJECT>'