Kevin
Kevin

Reputation: 143

Extract part of JSON in ansible playbook

I want to extract a part from a json extra vars input and use this as a variable in further commands.

The extra vars being parsed towards ansible is:

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

I want to extract the part -5484403941961857966_1631165040000V2 and store it into a variable.

- 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\"}"

Could the issue reside in the fact that the id is subsituded as "6551567569324750926_1631192580000V2" instead of 6551567569324750926_1631192580000V2?

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

Upvotes: 1

Views: 475

Answers (2)

seshadri_c
seshadri_c

Reputation: 7350

There is a urlsplit filter which can split a URL into known segments. We can use this to break down the URL and get the last fragment, i.e.

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

Gives...

problems/problemdetails;pid=-5484403941961857966_1631165040000V2

Now this gives us a more "manageable" string. We can do a regex_search (with groups) on this, to get the pid, like:

    - 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

Upvotes: 1

guido
guido

Reputation: 19224

Not super-reliable as we don't know how your url can change, but you could use some regex filter to extract the pid value:

- 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 }}"

Upvotes: 0

Related Questions