我正在探索yq以修改我的YAML,其中我想在spec of 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: ""发布于 2020-10-06 07:18:22
对于如何使用多个条件来获取所需的对象,mikefarah/yq中的路径表达式并没有很好的文档来展示一个实际的例子。因此,对于有问题的YAML,使用一个独特的条件,您可以这样做,如下所示。在yq version 3.3.2中验证
yq w openshift45.yaml 'items.(metadata.name == openshift45).spec.dockerImageRepository' '<$MYREGISTRY>/<$MYNAMESPACE>/<$MYPROJECT>'您可以使用-i标志和写一起修改YAML。请参阅就地更新文件
如果这是不需要的,并且需要多个条件选择才能到达所需的对象,那么建议在GitHub页面上提出一个问题-- https://github.com/mikefarah/yq/issues请求相同的正确语法。
发布于 2020-10-05 17:52:25
目前,在yq中是不可能的。您必须在变量中获得第一个命令的输出,并将该变量传递给下一个变量。
yq是jq的包装器,但它没有自定义函数的功能。自定义函数使得可以在一个地方使用文档的任何层次结构中的任何值。
感谢伊尼安指出OP没有使用包装器yq版本。不幸的是,所使用的版本目前也不允许使用自定义函数。
https://stackoverflow.com/questions/64213503
复制相似问题