在 ansible 剧本中提取 JSON 的一部分

Extract part of JSON in ansible playbook

我想从 json 额外的变量输入中提取一部分,并将其用作进一步命令中的变量。

被解析为 ansible 的额外变量是:

{
 "problemUrl": "https://xxxxx.xxxxxxxxx-xxxxx.xxxx/e/58b59a93-xxxx-xxxx-xxxx-91bb5ca1f41c/#problems/problemdetails;pid=-5484403941961857966_1631165040000V2",
}

我想提取 -5484403941961857966_1631165040000V2 部分并将其存储到变量中。

- name: get pid from URL
  set_fact:
    pidproblem: "{{ problemUrl | urlsplit('fragment') | regex_search('pid=(.+)', '\1') }}"
            
- name: show pid
  debug:
    var: pidproblem[0]
    
- name: update problem with output
  when: state == "OPEN"
  uri:
      url: https://xxxxx.xxxxxxxxx-xxxxx.xxxx/e/58b59a93-xxxx-xxxx-xxxx-91bb5ca1f41c/api/v2/problems/"{{ pidproblem[0] }}"/comments
      method: POST
      headers:
        Content-Type: application/json; charset=utf-8
        Authorization: Api-Token xxxxx
      body_format: json
      body: "{\"message\":\"TEST\",\"context\":\"TEST\"}"

问题是否出在 id 被替换为“6551567569324750926_1631192580000V2”而不是 6551567569324750926_1631192580000V2?

"url": "https://xxxxx.xxxxxxxxx-xxxxx.xxxx/e/58b59a93-xxxx-xxxx-xxxx-91bb5ca1f41c/api/v2/problems/\"6551567569324750926_1631192580000V2\"/comments"

不是超级可靠,因为我们不知道你的 url 会如何改变,但你可以使用一些正则表达式过滤器来提取 pid 值:

- hosts: localhost
  vars:
    problemUrl: '{ "problemUrl": "https://xxxxx.xxxxxxxxx-xxxxx.xxxx/e/58b59a93-xxxx-xxxx-xxxx-91bb5ca1f41c/#problems/problemdetails;pid=-5484403941961857966_1631165040000V2;other=false" }'
  tasks:
  - name: set_fact some paramater
    set_fact:
      pid: "{{ (problemUrl | from_json).problemUrl | regex_replace('.*pid=(?P<pid>[^;]*).*', '\g<pid>') }}"
  - name: "update"
    debug:
      msg: "{{ pid }}"

有一个urlsplit filter可以将URL分割成已知的片段。我们可以用它来分解 URL 并得到最后一个 fragment,即

"{{ problemUrl | urlsplit('fragment') }}"

给...

problems/problemdetails;pid=-5484403941961857966_1631165040000V2

现在这给了我们一个更“易于管理”的字符串。我们可以对此做一个 regex_search(带组),以获得 pid,例如:

    - name: get pid from URL
      set_fact:
        pid: "{{ problemUrl | urlsplit('fragment') | regex_search('pid=(-.+)', '\1') }}"

    - name: show pid
      debug:
        var: pid[0]

    - name: update problem with output
      uri:
        url: "https://xxxxx.xxxxxxxxx-xxxxx.xxxx/e/58b59a93-xxxx-xxxx-xxxx-91bb5ca1f41c/api/v2/problems/{{ pid[0] }}/comments"
        # other params