Ansible 中的多行 var 声明
Multiline var declaration in Ansible
我有一个很长的 json_query
看起来像这样:
resources[?involvedObject.apiVersion == `v1` && involvedObject.kind == `Pod` && involvedObject.name==`my-name`].{ firstTimestamp: firstTimestamp, lastTimestamp: lastTimestamp, count: count, reason: reason, message: message }
我在set_fact
中使用它:
- name: Getting events
set_fact:
pod_events: " {{ events | json_query(events_query) }} "
var:
events_query: "resources[?involvedObject.apiVersion == `v1` && involvedObject.kind == `Pod` && involvedObject.name==`my-name`].{ firstTimestamp: firstTimestamp, lastTimestamp: lastTimestamp, count: count, reason: reason, message: message }"
虽然这行得通,但为了便于阅读,我想用一些换行符来中断查询。我尝试了 >
以及 >-
和 |replace('\n','')
。无论我做什么,查询中的换行符始终存在,导致 json_query
.
损坏
一定有破解的方法吧?
经过一些尝试和错误,我重现了一个与你的类似的错误,我猜:
FAILED! => {"msg": "JMESPathError in json_query filter plugin:\nBad jmespath expression: Unknown token ?:\nresources[ ?\n involvedObject.apiVersion == `v1` && \n involvedObject.kind == `Pod` && \n involvedObject.name==`my-name`\n].{ \n firstTimestamp: firstTimestamp, \n lastTimestamp: lastTimestamp, \n count: count, \n reason: reason, \n message: message \n}\n ^"}
我回到关于 filter expressions 的 JMESPath 文档,意识到表达式由 [?
和 ]
分隔,这很重要,因为它意味着问号 ?
和开始的方括号 [
不能用新行分隔,甚至不能用 space 分隔,否则会遇到上面的错误。
一旦你想到了这一点,你就可以按照你的意愿来做你的多行。
这是一个工作手册的例子:
- hosts: all
gather_facts: no
vars:
events:
resources:
- firstTimestamp: '2020-10-27 10:00:00'
lastTimestamp: '2020-10-27 12:00:00'
count: 1
reason: some reason
message: some message
involvedObject:
apiVersion: v1
kind: Pod
name: my-name
tasks:
- set_fact:
pod_events: "{{ events | json_query(events_query) }}"
vars:
events_query: >-
resources[?
involvedObject.apiVersion == `v1` &&
involvedObject.kind == `Pod` &&
involvedObject.name==`my-name`
].{
firstTimestamp: firstTimestamp,
lastTimestamp: lastTimestamp,
count: count,
reason: reason,
message: message
}
- debug:
var: pod_events
产生回顾
PLAY [all] *******************************************************************************************************
TASK [set_fact] **************************************************************************************************
ok: [localhost]
TASK [debug] *****************************************************************************************************
ok: [localhost] => {
"pod_events": [
{
"count": 1,
"firstTimestamp": "2020-10-27 10:00:00",
"lastTimestamp": "2020-10-27 12:00:00",
"message": "some message",
"reason": "some reason"
}
]
}
PLAY RECAP *******************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
我有一个很长的 json_query
看起来像这样:
resources[?involvedObject.apiVersion == `v1` && involvedObject.kind == `Pod` && involvedObject.name==`my-name`].{ firstTimestamp: firstTimestamp, lastTimestamp: lastTimestamp, count: count, reason: reason, message: message }
我在set_fact
中使用它:
- name: Getting events
set_fact:
pod_events: " {{ events | json_query(events_query) }} "
var:
events_query: "resources[?involvedObject.apiVersion == `v1` && involvedObject.kind == `Pod` && involvedObject.name==`my-name`].{ firstTimestamp: firstTimestamp, lastTimestamp: lastTimestamp, count: count, reason: reason, message: message }"
虽然这行得通,但为了便于阅读,我想用一些换行符来中断查询。我尝试了 >
以及 >-
和 |replace('\n','')
。无论我做什么,查询中的换行符始终存在,导致 json_query
.
一定有破解的方法吧?
经过一些尝试和错误,我重现了一个与你的类似的错误,我猜:
FAILED! => {"msg": "JMESPathError in json_query filter plugin:\nBad jmespath expression: Unknown token ?:\nresources[ ?\n involvedObject.apiVersion == `v1` && \n involvedObject.kind == `Pod` && \n involvedObject.name==`my-name`\n].{ \n firstTimestamp: firstTimestamp, \n lastTimestamp: lastTimestamp, \n count: count, \n reason: reason, \n message: message \n}\n ^"}
我回到关于 filter expressions 的 JMESPath 文档,意识到表达式由 [?
和 ]
分隔,这很重要,因为它意味着问号 ?
和开始的方括号 [
不能用新行分隔,甚至不能用 space 分隔,否则会遇到上面的错误。
一旦你想到了这一点,你就可以按照你的意愿来做你的多行。
这是一个工作手册的例子:
- hosts: all
gather_facts: no
vars:
events:
resources:
- firstTimestamp: '2020-10-27 10:00:00'
lastTimestamp: '2020-10-27 12:00:00'
count: 1
reason: some reason
message: some message
involvedObject:
apiVersion: v1
kind: Pod
name: my-name
tasks:
- set_fact:
pod_events: "{{ events | json_query(events_query) }}"
vars:
events_query: >-
resources[?
involvedObject.apiVersion == `v1` &&
involvedObject.kind == `Pod` &&
involvedObject.name==`my-name`
].{
firstTimestamp: firstTimestamp,
lastTimestamp: lastTimestamp,
count: count,
reason: reason,
message: message
}
- debug:
var: pod_events
产生回顾
PLAY [all] *******************************************************************************************************
TASK [set_fact] **************************************************************************************************
ok: [localhost]
TASK [debug] *****************************************************************************************************
ok: [localhost] => {
"pod_events": [
{
"count": 1,
"firstTimestamp": "2020-10-27 10:00:00",
"lastTimestamp": "2020-10-27 12:00:00",
"message": "some message",
"reason": "some reason"
}
]
}
PLAY RECAP *******************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0