Yaml yq:如何读取同级元素值?
我正在探索yq以修改我的YAML,我想在ImageStream的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
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>'