variable sub dict output shows undefined

Hi,

I have a part of playbook task as below:

  • name: get url data
    uri:
    uri:
    method: GET
    user: username
    password: password
    register: dns_result
    no_log: true

  • set_fact:
    dns_content: “{{ dns_result.content.records}}”

Gives an error:

“msg” : The task includes an option with an undefined variable. The error was ansible.vars.unsafe_proxy.AnsibleUnsafeText object’ has no attribute ‘records’

however when I set_fact separately as below, it works :

  • name: get url data
    uri:
    uri:
    method: GET
    user: username
    password: password
    register: dns_result
    no_log: true

  • set_fact:
    dns_content: “{{ dns_result.content}}”

  • debug:
    msg: “{dns_contents.records}”

This works fine and returns results. Any advice what am i doing wrong here ?

Regards,
Punit

Hi,

I have a part of playbook task as below:

- name: get url data
  uri:
    uri: <path>
    method: GET
    user: username
    password: password
  register: dns_result
  no_log: true

- set_fact:
    dns_content: "{{ dns_result.content.records}}"

Gives an error:

"msg" : The task includes an option with an undefined variable. The error
was ansible.vars.unsafe_proxy.AnsibleUnsafeText object' has no attribute
'records'

That is because is doesn't exist, you need to check what is contains with

- debug: var=dns_result

however when I set_fact separately as below, it works :

- name: get url data
  uri:
    uri: <path>
    method: GET
    user: username
    password: password
  register: dns_result
  no_log: true

- set_fact:
    dns_content: "{{ dns_result.content}}"

- debug:
    msg: "{dns_contents.records}"

You only have one curly brackets so this is not treated as a variable but as a string.
And if you add the missing curly brackets it will fail since you are using dns_contents and not dns_content.

Hi Kai,

It seems while copying i missed {{ but actually code does have this. So repasting code :

  • name: get url data
    uri:
    uri:
    method: GET
    user: username
    password: password
    register: dns_result
    no_log: true

  • set_fact:
    dns_content: “{{ dns_result.content}}”

  • debug:
    msg: “{{dns_content.records}}”

gives result:

ok: [10.4.12.5] =>
“msg”: [
{
“_links”: {
“self”: {
“href”: “/api/name-services/dns/1e3w4r1q”
}
},
“servers”: [
10.2.12.3"
],
},
{
“_links”: {
“self”: {
“href”: “/api/name-services/dns/1f7j9f0a”
}
},
“servers”: [
10.2.122.4"
],
},

The data in dns_result is :

ok: [10.4.12.5] =>
“msg”: [
{
“_links”: {
“self”: {
“href”: “/api/name-services/dns?fields=*”
}
},

“num_records”: 2,
records”: [
{
“_links”: {
“self”: {
“href”: “/api/name-services/dns/1e3w4r1q”
}
},
“servers”: [
10.2.12.3"
],
},
{
---- more data -----
}

So why i cant access data like :

  • set_fact:
    dns_content: “{{ dns_result.content.records}}”

Hi Kai,

It seems while copying i missed {{ but actually code does have this. So
repasting code :

- name: get url data
  uri:
    uri: <path>
    method: GET
    user: username
    password: password
  register: dns_result
  no_log: true

- set_fact:
    dns_content: "{{ dns_result.content}}"

This doesn't add up, you say dns_result contain content, but you listing below show that dns_result doesn't contain content.

- debug:
     msg: "{{dns_content.records}}"

gives result:

ok: [10.4.12.5] =>
   "msg": [
       {
         "_links": {
            "self": {
                "href": "/api/name-services/dns/1e3w4r1q"
             }
           },
         "servers": [
              10.2.12.3"
           ],
       },
       {
          "_links": {
            "self": {
                "href": "/api/name-services/dns/1f7j9f0a"
             }
           },
         "servers": [
              10.2.122.4"
           ],
       },

The data in dns_result is :

ok: [10.4.12.5] =>
   "msg": [
       {
         "_links": {
            "self": {
                "href": "/api/name-services/dns?fields=*"
             }
           },
         "num_records": 2,
         "*records*": [
           {
             "_links": {
            "self": {
                "href": "/api/name-services/dns/1e3w4r1q"
             }
           },
         "servers": [
              10.2.12.3"
           ],
       },
       {
      ---- more data -----
       }

According to this output dns_result is a list and there isn't a content, to get the records that would be {{ dns_result.0.records }}.