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