Formatting the dict items with debug

117 views
Skip to first unread message

Veera

unread,
Oct 14, 2023, 4:01:28 AM10/14/23
to Ansible Project
Hi,

I have the below output  from my playbook using 
- debug:
        msg: "{{ result.stdout }}"

TASK [debug] **************************************************************************************************************************
ok: [localhost] => {
    "msg": {
        "access_token": "xxxxxxxxxx",
        "expires_in": 43200,
"token_type": "xxxxxx"
    }
}


 and  when I tried to filter the access token alone  , with map   by
"{{ result.stdout | map('extract', access_token) }}" ., it errors as below

The task includes an option with an undefined variable. The error was: 'access_token' is  undefined\n\n 

and  when I tried to filter the access token alone  , with map   by
 msg: "{{ result.stdout | map(attribute='access_token') }}" ., it errors as below

What I am missing here  to get the desired output  here?


Dick Visser

unread,
Oct 14, 2023, 8:31:54 AM10/14/23
to ansible...@googlegroups.com
What is your desired output then??

Sent from Gmail Mobile


--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/6a7a5ed1-6c6b-4660-8da9-1388898923fen%40googlegroups.com.

Veera

unread,
Oct 14, 2023, 8:43:41 AM10/14/23
to Ansible Project
I need only the output or the value of the below(trying to set_fact the access_token)
access_token": "xxxxxxxxxx"

Dick Visser

unread,
Oct 14, 2023, 8:59:30 AM10/14/23
to ansible...@googlegroups.com
Try piping it through from_json first

Sent from Gmail Mobile


Will McDonald

unread,
Oct 14, 2023, 9:01:49 AM10/14/23
to ansible...@googlegroups.com
Is there any reason you can't just use result.stdout.access_token?

$ cat debug-token.yml
- name: debug vars
  hosts: localhost
  gather_facts: no

  vars:
    result:
      stdout:
        access_token: xxxxxxxxxx
        expires_in: 4320
        token_type: yyyyyyyyyy

  tasks:
    - name: debug the result
      ansible.builtin.debug:
        var: result

    - name: extract the token
      ansible.builtin.debug:
        msg: "{{ result.stdout.access_token }}"


$ ansible-playbook debug-token.yml

PLAY [debug vars] **********************************************************************************************************

TASK [debug the result] ****************************************************************************************************
ok: [localhost] => {
    "result": {
        "stdout": {
            "access_token": "xxxxxxxxxx",
            "expires_in": 4320,
            "token_type": "yyyyyyyyyy"
        }
    }
}

TASK [extract the token] ***************************************************************************************************
ok: [localhost] => {
    "msg": "xxxxxxxxxx"
}


Message has been deleted

Veera

unread,
Oct 14, 2023, 10:10:00 AM10/14/23
to Ansible Project
Why this is marked as abuse? It has been marked as abuse.
Report not abuse

when I try with
 - debug:
       msg: "{{ result }}"


the output is 

TASK [debug] **************************************************************************************************************************
ok: [localhost] => {
    "msg": {
        "changed": true,
        "cmd": "curl -X POST 'https://xxxxxx.com/auth/login' -H 'Content-Type: application/json' -d @.mycred.json",
        -- trimmed lines ----
        "rc": 0,
       -- trimmed lines ----
        "stdout": "{\"access_token\":\"XXXXX\",\"token_type\":\"Bearer\",\"expires_in\":86400}",
        "stdout_lines": [
            "{\"access_token\":\"XXXXX\",\"token_type\":\"Bearer\",\"expires_in\":86400}"
        ]
    }
}


The output for the
  - debug:
      msg: "{{ result.stdout |from_json  }}"


is


TASK [debug] **************************************************************************************************************************
ok: [localhost] => {
    "msg": {
        "access_token": "XXXXXX",
        "expires_in": 86400,
        "token_type": "Bearer"
    }
}




when I use  the
 - debug:
     msg: "{{ result.stdout.access_token }}"


the error is

TASK [debug] **************************************************************************************************************************
fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'ansible.utils.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'access_token'\n\nThe error appears to be in '/home/user/check.yml': line 32, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n    - debug:\n      ^ here\n"}

Dick Visser

unread,
Oct 14, 2023, 11:06:11 AM10/14/23
to ansible...@googlegroups.com
Why this is marked as abuse? It has been marked as abuse.
Report not abuse
Yes, so you should combine them like:

  - debug:
      msg: "{{ (result.stdout|from_json).access_token }}"



Veera

unread,
Oct 14, 2023, 11:24:43 AM10/14/23
to Ansible Project
Why this is marked as abuse? It has been marked as abuse.
Report not abuse
It worked and its my miss again to combine it ..  :)

Vladimir Botka

unread,
Oct 14, 2023, 11:28:23 AM10/14/23
to Veera, ansible...@googlegroups.com
On Sat, 14 Oct 2023 01:01:28 -0700 (PDT)
Veera <svee...@gmail.com> wrote:

> - debug:
> msg: "{{ result.stdout }}"
>
> ok: [localhost] => {
> "msg": {
> "access_token": "xxxxxxxxxx",
> "expires_in": 43200,
> "token_type": "xxxxxx"
> }
> }

For example, given the file

shell> cat /tmp/test.json
{
"access_token": "xxxxxxxxxx",
"expires_in": 43200,
"token_type": "xxxxxx"
}

The value of *result.stdout* is *AnsibleUnsafeText*. What you see
depends on the callback. The below play

shell> cat pb.yml
- hosts: all
tasks:
- command: cat /tmp/test.json
register: result
- debug:
var: result.stdout

gives JSON with the default callback

shell> ANSIBLE_STDOUT_CALLBACK=default ansible-playbook pb.yml
...
ok: [localhost] => {
"result.stdout": {
"access_token": "xxxxxxxxxx",
"expires_in": 43200,
"token_type": "xxxxxx"
}
}

The same task gives YAML with the yaml callback

shell> ANSIBLE_STDOUT_CALLBACK=yaml ansible-playbook pb2.yml
...
ok: [localhost] =>
result.stdout:
access_token: xxxxxxxxxx
expires_in: 43200
token_type: xxxxxx

You can test the type of the attribute *stdout*

- debug:
var: result.stdout|type_debug

gives

result.stdout|type_debug: AnsibleUnsafeText


> filter the access token alone

Convert the text to dictionary and get the *access_token* as well.
It's up to you where you put the vars

vars:

test_data: "{{ result.stdout|from_json }}"
access_token: "{{ test_data.access_token }}"

Example of a complete playbook for testing

shell> cat pb.yml
- hosts: all

vars:

test_data: "{{ result.stdout|from_json }}"
access_token: "{{ test_data.access_token }}"

tasks:

- command: cat /tmp/test.json
register: result
- debug:
var: result.stdout
- debug:
var: result.stdout|type_debug
- debug:
var: test_data|type_debug
- debug:
var: test_data
- debug:
var: access_token


--
Vladimir Botka

Veera

unread,
Oct 14, 2023, 12:50:31 PM10/14/23
to Ansible Project
Thanks Vladimir .. rich info for me ..
Reply all
Reply to author
Forward
0 new messages