debug statement not working

I cant figure out why

use quotes inside the shell “rpm -q {{ item }}” also you can list for for rpms using the yum module.

When you do a loop on a task the registered variable structure changes. Try just debugging pkg to see the structure. You will effectively have pkg.results

Hi,

I cant figure out why

---
- hosts: misc
  become: false
  gather_facts: yes
  tasks:
    - name: get package version
      shell: rpm -q {{ item }}
      with_items:
        - "package1"
        - "package2"
        - "package3"
      register: pkg

    - debug:
        msg: "{{ pkg.stdout }}"

FAILED! => {"msg": "The task includes an option with an undefined
variable. The error was: 'dict object' has no attribute
'stdout'\n\nThe error appears to have been in '/opt/ansible/foo.yml':
line 14, 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\nexception type: <class
'ansible.errors.AnsibleUndefinedVariable'>\nexception: 'dict object'
has no attribute 'stdout'"}

note that you're using a loop for the "get package version" task. The
structure of pkg is different because of that; in particular, pkg has
no attribute stdout (as the error message tells you). You could output
the whole content of pkg with debug to see that.

Cheers,
Felix

So I update debug to:

register: pkg

  • debug:
    msg: “{{ pkg.results }}”

and stdout is printed:

ok: [hostname] => {
“msg”: [
{
“_ansible_ignore_errors”: null,
“_ansible_item_result”: true,
“_ansible_no_log”: false,
“_ansible_parsed”: true,
“changed”: true,
“cmd”: “rpm -q TaniumClient”,
“delta”: “0:00:00.024756”,
“end”: “2019-03-25 13:10:34.751439”,
“failed”: false,
“invocation”: {
“module_args”: {
“_raw_params”: “rpm -q TaniumClient”,
“_uses_shell”: true,
“chdir”: null,
“creates”: null,
“executable”: null,
“removes”: null,
“stdin”: null,
“warn”: true
}
},
“item”: “TaniumClient”,
“rc”: 0,
“start”: “2019-03-25 13:10:34.726683”,
“stderr”: “”,
“stderr_lines”: ,
“stdout”: “TaniumClient-6.0.314.1442-1.rhe7.x86_64”,
“stdout_lines”: [
“TaniumClient-6.0.314.1442-1.rhe7.x86_64”
]
},

but

  • debug:
    msg: “{{ pkg.results.stdout }}”

fails. Seems like I should be able to print that.

I found this link which works:

https://ansiblemaster.wordpress.com/2017/02/24/debug-properly-data-registered-with-a-loop/

I just dont understand why it works:

- debug:
  msg: "{{ echo.results|map(attribute='stdout_lines')|list }}"

Hi Jerry,

ok: [hostname] => {
    "msg": [

^ the [ tells you this is an array. This happens because you call
register on a task with a loop. For each item of the loop, a new dict
gets added to this array.

        {
            "_ansible_ignore_errors": null,
            "_ansible_item_result": true,
            "_ansible_no_log": false,
            "_ansible_parsed": true,
            "changed": true,
            "cmd": "rpm -q TaniumClient",
            "delta": "0:00:00.024756",
            "end": "2019-03-25 13:10:34.751439",
            "failed": false,
            "invocation": {
                "module_args": {
                    "_raw_params": "rpm -q TaniumClient",
                    "_uses_shell": true,
                    "chdir": null,
                    "creates": null,
                    "executable": null,
                    "removes": null,
                    "stdin": null,
                    "warn": true
                }
            },
            "item": "TaniumClient",
            "rc": 0,
            "start": "2019-03-25 13:10:34.726683",
            "stderr": "",
            "stderr_lines": ,
            "stdout": "TaniumClient-6.0.314.1442-1.rhe7.x86_64",
            "stdout_lines": [
                "TaniumClient-6.0.314.1442-1.rhe7.x86_64"
            ]
        },

but

    - debug:
        msg: "{{ pkg.results.stdout }}"

fails. Seems like I should be able to print that.

You could print {{ pkg.results.0.stdout }} for the first element of the
loop, or {{ pkg.results.1.stdout }} for the second element of the loop.

I just dont understand why it works:

- debug:
  msg: "{{ echo.results|map(attribute='stdout_lines')|list
}}"

What this does is, take the array of dictionaries, and look in each
dictionary for the key stdout_lines. Then take the value of that key and
make a list out of it.

HTH
Sebastian