【发布时间】:2021-10-18 16:59:41
【问题描述】:
我正在尝试使用 jq 的 --arg 语法将变量从 shell 传递到 jq 过滤器。
如果我运行以下命令,jq 查询将按预期工作:
TS_SEC_START=1534574204 \
kubectl -n istio-system logs deployment/flagger --tail=50 | grep '^{' | \
jq --arg TS_SEC_START 1534574204 --arg SVC "${SERVICE_NAME}.${RELEASE_NAMESPACE}" \
-s 'map(select(.ts | (split(".")[0] + "Z") | fromdateiso8601 > ($TS_SEC_START | tonumber)) | select(.canary == "mysvc.prod"))'
-->
Found 3 pods, using pod/flagger-6dc6fd7d85-z294g
[
{
"level": "error",
"ts": "2021-08-16T02:41:34.128Z",
"caller": "controller/scheduler.go:163",
"msg": "Canary mysvc.prod not found",
"canary": "mysvc.prod",
"stacktrace": "github.com/fluxcd/flagger/pkg/controller.(*Controller).advanceCanary\n\t/workspace/pkg/controller/scheduler.go:163\ngithub.com/fluxcd/flagger/pkg/controller.CanaryJob.Start.func1\n\t/workspace/pkg/controller/job.go:39"
}
]
但是,当我尝试将 mysvc.prod 作为 arg 传递时,我收到 0 个响应。
TS_SEC_START=1534574204 SERVICE_NAME=mysvc RELEASE_NAMESPACE=prod \
kubectl -n istio-system logs deployment/flagger --tail=50 | grep '^{' | \
jq --arg TS_SEC_START 1534574204 --arg SVC "${SERVICE_NAME}.${RELEASE_NAMESPACE}" \
-s 'map(select(.ts | (split(".")[0] + "Z") | fromdateiso8601 > ($TS_SEC_START | tonumber)) | select(.canary == $SVC))'
我在这里尝试了一些不同的选项,例如.canary == "$SVC" 和 `.canary == "$SERVICE_NAME.$RELEASE_NAMESPACE" 但我无法让它工作。
我做错了什么?
-->
Found 3 pods, using pod/flagger-6dc6fd7d85-z294g
[]
【问题讨论】:
-
SERVICE_NAME和RELEASE_NAMESPACE究竟是如何设置的?SVC可能没有您认为的确切值。jq -n --arg SVC "a.b" '"a.b" == $f'输出true。 -
我添加了
sh标签,因为我相信这个问题不仅仅是jq问题,而是一个shell 脚本问题。