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