这是我的输入:
{
"apiVersion": "apps/v1",
"kind": "Deployment",
"spec": {
"template": {
"spec": {
"containers": [
{
"volumeMounts": [
{
"mountPath": "/var/www/html",
"name": "shared"
},
{
"mountPath": "/var/www/html/LocalSettings.d/LocalSettings.override.php",
"name": "movies-wikibase-claim1"
},
{
"mountPath": "/var/www/html/img/wikibase_logo.png",
"name": "movies-wikibase-claim2"
}
]
}
],
"volumes": [
{
"name": "shared",
"persistentVolumeClaim": {
"claimName": "shared"
}
},
{
"name": "movies-wikibase-claim1",
"persistentVolumeClaim": {
"claimName": "movies-wikibase-claim1"
}
},
{
"name": "movies-wikibase-claim2",
"persistentVolumeClaim": {
"claimName": "movies-wikibase-claim2"
}
}
]
}
}
}
}
我想将以扩展名结尾的任何挂载路径转换为指向相应“configMaps”对象的挂载路径,该对象本身会替换预先存在的关联“persistentVolumeClaim”。
结果如下:
{
...
"volumeMounts": [
{
"mountPath": "/var/www/html",
"name": "shared"
},
{
"mountPath": "/var/www/html/LocalSettings.d/LocalSettings.override.php",
"name": "movies-wikibase-localsettings-override-php",
"subPath": "LocalSettings.override.php"
},
{
"mountPath": "/var/www/html/img/wikibase_logo.png",
"name": "movies-wikibase-wikibase-logo-png",
"subPath": "wikibase_logo.png"
}
]
}
],
"volumes": [
{
"name": "shared",
"persistentVolumeClaim": {
"claimName": "shared"
}
},
{
"configMap": {
"defaultMode": 420,
"name": "movies-wikibase-localsettings-override-php"
},
"name": "movies-wikibase-localsettings-override-php"
}
{
"configMap": {
"defaultMode": 420,
"name": "movies-wikibase-wikibase-logo-png"
},
"name": "movies-wikibase-wikibase-logo-png"
}
我已经开始了一些事情,但我没能实现它:
cat movies-wikibase-deployment.json|
jq -r '((.spec.template.spec.containers[].volumeMounts[]?|select(.mountPath|test("(\\.[^.]+)$")))|={mountPath: .mountPath, name: ((.name|split("-claim")|.[0]) + "-" + (.mountPath|split("/")|last|gsub("_";"-")|gsub("\\.";"-")|ascii_downcase)), subPath: (.mountPath|split("/")|last)})|(((.spec.template.spec.containers[].volumeMounts[]?|select(.mountPath|test("(\\.[^.]+)$")).name) ) as $toto|.spec.template.spec.volumes+=[{configMap: {defaultMode: 420, name: $toto}, name: $toto}])'
编辑:您可以编写一个稍微更具可读性的版本,而不是一长行代码,例如:
jq -r '(
(.spec.template.spec.containers[].volumeMounts[]?|
select(.mountPath|test("(\\.[^.]+)$")))|=
{mountPath: .mountPath, name: ((.name|split("-claim")|.[0]) + "-" + (.mountPath|split("/")|last|gsub("_";"-")|gsub("\\.";"-")|ascii_downcase)), subPath: (.mountPath|split("/")|last)}
)|
(
((.spec.template.spec.containers[].volumeMounts[]?|select(.mountPath|test("(\\.[^.]+)$")).name) ) as $toto|
.spec.template.spec.volumes+=[{configMap: {defaultMode: 420, name: $toto}, name: $toto}])' movies-wikibase-deployment.json
由于您想在两个不同的位置以两种不同的方式修改数组项,但所有这些都基于转换相同源的相同值,因此我建议设置一个查找表(例如使用
INDEX
),然后在这两种情况下查询它(而不是重复到相同的源并一遍又一遍地重复相同的转换):
.spec.template.spec |= (
INDEX(
.containers[].volumeMounts[] | {id: .name, subPath: (.mountPath / "/")[-1]}
| .name = (.id|.[:index("claim")]) + (.subPath|gsub("[_.]";"-")|ascii_downcase);
select(.subPath | test("[.][^.]+$")).id
) as $lookup
# With the sample input, $lookup would contain:
#
# {
# "movies-wikibase-claim1": {
# "id": "movies-wikibase-claim1",
# "subPath": "LocalSettings.override.php",
# "name": "movies-wikibase-localsettings-override-php"
# },
# "movies-wikibase-claim2": {
# "id": "movies-wikibase-claim2",
# "subPath": "wikibase_logo.png",
# "name": "movies-wikibase-wikibase-logo-png"
# }
# }
| .containers[].volumeMounts[] |= last(., {mountPath} + (
$lookup[.name] | values | {name, subPath}
))
| .volumes[] |= last(., (
$lookup[.name] | values | {configMap: {defaultMode: 420, name}, name}
))
)
{
"apiVersion": "apps/v1",
"kind": "Deployment",
"spec": {
"template": {
"spec": {
"containers": [
{
"volumeMounts": [
{
"mountPath": "/var/www/html",
"name": "shared"
},
{
"mountPath": "/var/www/html/LocalSettings.d/LocalSettings.override.php",
"name": "movies-wikibase-localsettings-override-php",
"subPath": "LocalSettings.override.php"
},
{
"mountPath": "/var/www/html/img/wikibase_logo.png",
"name": "movies-wikibase-wikibase-logo-png",
"subPath": "wikibase_logo.png"
}
]
}
],
"volumes": [
{
"name": "shared",
"persistentVolumeClaim": {
"claimName": "shared"
}
},
{
"configMap": {
"defaultMode": 420,
"name": "movies-wikibase-localsettings-override-php"
},
"name": "movies-wikibase-localsettings-override-php"
},
{
"configMap": {
"defaultMode": 420,
"name": "movies-wikibase-wikibase-logo-png"
},
"name": "movies-wikibase-wikibase-logo-png"
}
]
}
}
}
}