Debug not working with_items in ansible play - ansible

Need some help in debug the specific value from register task.
- debug:
msg: "{{ item.stdout }}"
with_items: path_result.results
This is not working
{
"changed": false,
"path_result": {
"msg": "All items completed",
"changed": true,
"results": [
{
"_ansible_parsed": true,
"stderr_lines": [],
"_ansible_item_result": true,
"end": "2019-04-10 14:55:18.726270",
"_ansible_no_log": false,
"_ansible_delegated_vars": {
"ansible_delegated_host": "**.***.***.***",
"ansible_host": "**.***.***.***"
},
"cmd": "cat /tmp/abc.conf | grep apple",
"rc": 0,
"stdout": "fruit=apple",
"item": "**.***.***.***",
"delta": "0:00:00.021499",
"stderr": "",
"changed": true,
"invocation": {
"module_args": {
"creates": null,
"executable": null,
"_uses_shell": true,
"_raw_params": "cat /tmp/abc.conf | grep apple",
"removes": null,
"warn": true,
"chdir": null,
"stdin": null
}
},
"stdout_lines": [
"fruit=apple"
],
"start": "2019-04-10 14:55:18.704771",
"_ansible_ignore_errors": null,
"failed": false
}
]
},
"_ansible_verbose_always": true,
"_ansible_no_log": false
}
I would like to debug this particular output:
"stdout": "fruit=apple"

It looks like you have registered the result of a play with: register: path_result. That variable ALSO has path_result inside it. Here's what I think you have:
- command: cat /tmp/abc.conf | grep apple
register: path_result
- debug:
msg: "{{ item.stdout }}"
with_items: "{{ path_result.results }}"
Here's what I think you need:
- command: cat /tmp/abc.conf | grep apple
register: path_result
- debug:
msg: "{{ item.stdout }}"
with_items: "{{ path_result.path_result.results }}"
Notice the added .path_result part in with_items.

Related

Ansible set_fact output

I need the string or destination path as the output and use it in other task but the output displayed is dfifferent.
Here is the register output
ok: [localhost] => {
"msg": {
"changed": true,
"msg": "All items completed",
"results": [
{
"ansible_loop_var": "item",
"changed": true,
"checksum": "b045e5836bbd01d9c6dd2b7426afb5d1c8957b30",
"dest": "/home/ec2-user/bb/Data-1.1.tar.gz",
"failed": false,
"invocation": {
"module_args": {
"_original_basename": null,
"attributes": null,
"backup": false,
"checksum": null,
"content": null,
"delimiter": null,
"dest": "/home/ec2-user/bb/Data-1.1.tar.gz",
"directory_mode": null,
"follow": false,
"force": true,
"group": null,
"local_follow": null,
"mode": null,
"owner": null,
"regexp": null,
"remote_src": true,
"selevel": null,
"serole": null,
"setype": null,
"seuser": null,
"src": "/home/ec2-user/aa/Data-1.1.tar.gz",
"unsafe_writes": null,
"validate": null
}
},
"item": "/home/ec2-user/aa/Data-1.1.tar.gz",
"md5sum": "df9309334454cc3ceac9a6ac8fea8989",
"src": "/home/ec2-user/aa/Data-1.1.tar.gz"
I used the below the task to display the destination path
- set_fact:
filefact: "{{ output.results | map(attribute='item') | string }}"
- debug:
msg: "{{ filefact }}"
The output displayed is
ok: [localhost] => {
"msg": "<generator object do_map at 0x7f59539f01e0>"
i'd write :
- set_fact:
filefact: "{{ filefact | default([]) + [output.results.item] }}"
- debug:
msg: "{{ filefact }}"
the right syntax , following your output should be:
- set_fact:
filefact: "{{ filefact | default([]) + [output.results[0].item] }}"
or
- set_fact:
filefact: "{{ filefact | default([]) + [item.item] }}"
loop: "{{ output.results }}"

Ansible: loop our shell command(Linux user group search) result and display the groups

Ansible: loop our shell command(Linux user group search) result and display the groups
Task to check if group exist
- name: "Checking if group doesn't exist"
shell: "grep -i {{ item.group }} /etc/group"
register: presence
loop: "{{ UserAddList.add_users }}"
ignore_errors: true
no_log: true
Json input file:
UserAddList is a json file
{
"add_users": [
{
"name": "test1_123",
"group": "test1_123",
"additional_groups":
[
"test2",
"group1"
],
"password" : "test1_newcdsaf",
"sudo_entry": "ALL=(ALL) NOPASSWD: ALL",
"comment": "test1"
}
],
"delete_users": [
]
}
Task to display the groups doesn't exist
- name: The following groups does't' exist
debug:
msg:
"{{ item._ansible_item_label.group }}"
loop: "{{ presence.results }}"
output:
(item={
'_ansible_parsed': True,
'stderr_lines': [
],
u'changed': True,
u'stdout': u'',
'_ansible_item_result': True,
u'msg': u'non-zero return code',
u'delta': u'0:00:00.008175',
'stdout_lines': [
],
'_ansible_item_label': {
u'comment': u'test1',
u'password': u'test1_newcdsaf',
u'group': u'test1_123',
u'name': u'test1_123',
u'sudo_entry': u'ALL=(ALL) NOPASSWD: ALL',
u'additional_groups': [
u'test2',
u'group1'
]
},
u'end': u'2019-12-10 14:23:15.725676',
'_ansible_no_log': True,
'item': {
u'comment': u'test1',
u'password': u'test1_newcdsaf',
u'group': u'test1_123',
u'name': u'test1_123',
u'sudo_entry': u'ALL=(ALL) NOPASSWD: ALL',
u'additional_groups': [
u'test2',
u'group1'
]
},
u'cmd': u'grep -i test1_123 /etc/group',
u'failed': True,
u'stderr': u'',
u'rc': 1,
u'invocation': {
u'module_args': {
u'warn': True,
u'executable': None,
u'_uses_shell': True,
u'_raw_params': u'grep -i test1_123 /etc/group',
u'removes': None,
u'argv': None,
u'creates': None,
u'chdir': None,
u'stdin': None
}
},
u'start': u'2019-12-10 14:23:15.717501'
})=>{
"changed": false,
"item": {
"changed": true,
"cmd": "grep -i test1_123 /etc/group",
"delta": "0:00:00.008175",
"end": "2019-12-10 14:23:15.725676",
"failed": true,
"invocation": {
"module_args": {
"_raw_params": "grep -i test1_123 /etc/group",
"_uses_shell": true,
"argv": null,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"warn": true
}
},
"item": {
"additional_groups": [
"test2",
"group1"
],
"comment": "test1",
"group": "test1_123",
"name": "test1_123",
"password": "test1_newcdsaf",
"sudo_entry": "ALL=(ALL) NOPASSWD: ALL"
},
"msg": "non-zero return code",
"rc": 1,
"start": "2019-12-10 14:23:15.717501",
"stderr": "",
"stderr_lines": [
],
"stdout": "",
"stdout_lines": [
]
},
"msg": "test1_123"
}
I don't want to display the whole output, I just want to display the groups information.
The debug is printing all the input data as well.
Please any suggestions
The debug is printing all the input data as well.
It's actually not the debug: task that is printing your data, ansible is showing you what it is looping over. However, you are using loop: over the top-level presence.results list, and .results contains not only the output you care about, but also the invocation parameters, success or failure, and the actual returned data that you care about
There are two ways of fixing that problem: tell ansible that you only want it to show something smaller in the loop label, or change the loop: to actually only loop over the deleted users
In the first way, loop_control: will do that (it even cites your exact circumstance in the docs saying When looping over complex data structures, the console output of your task can be enormous. To limit the displayed output, use the label directive with loop_control):
- name: The following groups does't' exist
debug:
msg:
"{{ item._ansible_item_label.group }}"
loop: "{{ presence.results }}"
loop_control:
label: "{{ item.item.name }}"
In the second way, just select out the group you care about and msg: it:
- name: The following groups does't' exist
debug:
msg:
"{{ item }}"
loop: "{{ presence.results | map(attribute='item') | map(attribute='group') | list }}"

Ansible: Register and display results through iteration

My playbook is
---
- name: Running Checks on ACTIVATION VMs of ECM
hosts: activationvms
tasks:
- name: Checking File System status
shell: df -PTh
register: filesystem_check
- name: Display File System Statistics
debug:
msg: "{{ filesystem_check.stdout_lines }}"
- name: Check the status of list of services
shell: systemctl list-units|grep "{{ item }}"|awk '{ print $1,$2,$3,$4}'
with_items:
- zookeeper.service
- cassandra.service
register: service_status
- name: Display services status
debug:
msg: "{{ item.stdout }}"
with_items: "{{ service_status.results }}"
I want to shrink the results to only the msg line.
ok: [10.142.6.79] => (item={u'_ansible_parsed': True, u'changed': True, u'stdout': u'cassandra.service loaded active running', u'_ansible_no_log': False, u'stdout_lines': [u'cassandra.service loaded active running'], u'warnings': [], u'_ansible_item_result': True, u'start': u'2019-11-15 07:50:39.047456', u'delta': u'0:00:00.011821', u'cmd': u'systemctl list-units|grep "cassandra.service"|awk \'{ print $1,$2,$3,$4}\'', u'item': u'cassandra.service', u'rc': 0, u'invocation': {u'module_name': u'command', u'module_args': {u'warn': True, u'executable': None, u'_uses_shell': True, u'_raw_params': u'systemctl list-units|grep "cassandra.service"|awk \'{ print $1,$2,$3,$4}\'', u'removes': None, u'creates': None, u'chdir': None}}, u'end': u'2019-11-15 07:50:39.059277', u'stderr': u''}) => {
"item": {
"changed": true,
"cmd": "systemctl list-units|grep \"cassandra.service\"|awk '{ print $1,$2,$3,$4}'",
"delta": "0:00:00.011821",
"end": "2019-11-15 07:50:39.059277",
"invocation": {
"module_args": {
"_raw_params": "systemctl list-units|grep \"cassandra.service\"|awk '{ print $1,$2,$3,$4}'",
"_uses_shell": true,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"warn": true
},
"module_name": "command"
},
"item": "cassandra.service",
"rc": 0,
"start": "2019-11-15 07:50:39.047456",
"stderr": "",
"stdout": "cassandra.service loaded active running",
"stdout_lines": [
"cassandra.service loaded active running"
],
"warnings": []
},
"msg": "cassandra.service loaded active running"
}
ok: [10.142.6.72] => (item={u'_ansible_parsed': True, u'changed': True, u'stdout': u'cassandra.service loaded active running', u'_ansible_no_log': False, u'stdout_lines': [u'cassandra.service loaded active running'], u'warnings': [], u'_ansible_item_result': True, u'start': u'2019-11-15 07:50:39.429296', u'delta': u'0:00:00.011853', u'cmd': u'systemctl list-units|grep "cassandra.service"|awk \'{ print $1,$2,$3,$4}\'', u'item': u'cassandra.service', u'rc': 0, u'invocation': {u'module_name': u'command', u'module_args': {u'warn': True, u'executable': None, u'_uses_shell': True, u'_raw_params': u'systemctl list-units|grep "cassandra.service"|awk \'{ print $1,$2,$3,$4}\'', u'removes': None, u'creates': None, u'chdir': None}}, u'end': u'2019-11-15 07:50:39.441149', u'stderr': u''}) => {
"item": {
"changed": true,
"cmd": "systemctl list-units|grep \"cassandra.service\"|awk '{ print $1,$2,$3,$4}'",
"delta": "0:00:00.011853",
"end": "2019-11-15 07:50:39.441149",
"invocation": {
"module_args": {
"_raw_params": "systemctl list-units|grep \"cassandra.service\"|awk '{ print $1,$2,$3,$4}'",
"_uses_shell": true,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"warn": true
},
"module_name": "command"
},
"item": "cassandra.service",
"rc": 0,
"start": "2019-11-15 07:50:39.429296",
"stderr": "",
"stdout": "cassandra.service loaded active running",
"stdout_lines": [
"cassandra.service loaded active running"
],
"warnings": []
},
"msg": "cassandra.service loaded active running"
You need to use loop control tool. Rewrite your last play like this
- name: Display services status
debug:
msg: "{{ item.stdout }}"
with_items: "{{ service_status.results }}"
loop_control:
label: "{{ item.item }}"
That will limit that output to just the thing that was iterated into your prior command so you can tell which part of the loop you are currently in.

How do i access the results array to get a specific value in the objects returned

I am having trouble accessing some values in a results array returned by ansible, when I debug the variable I registered from command module.
I am running multiple commands using with_items and register the result in a "registeredVar". I tried to access the results like this registeredVar.results.stdout but I get "VARIABLE IS NOT DEFINED!" error.
I also tried to loop through the results array in the debug task, but i get a "object' has no attribute 'stdout'" error
Below are the tasks I am running
- name: check configuration
shell: "{{ item }}"
register: falcon_config
with_items:
- /opt/CrowdStrike/falconctl -g --aph
- /opt/CrowdStrike/falconctl -g --cid
- /opt/CrowdStrike/falconctl -g --app
Below is the debug task to output the variable
- debug:
var: falcon_config['results'].stdout
alternativley:
- debug:
var: '{{ item.stdout }}'
with_items: falcon_config['results']
This is the debug output of the results array when run falcon_config['results']
"falcon_config['results']": [
{
"_ansible_ignore_errors": null,
"_ansible_item_result": true,
"_ansible_no_log": false,
"_ansible_parsed": true,
"changed": true,
"cmd": "/opt/CrowdStrike/falconctl -g --aph",
"delta": "0:00:00.006724",
"end": "2019-07-29 10:36:05.481672",
"failed": false,
"invocation": {
"module_args": {
"_raw_params": "/opt/CrowdStrike/falconctl -g --aph",
"_uses_shell": true,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"warn": true
}
},
"item": "/opt/CrowdStrike/falconctl -g --aph",
"rc": 0,
"start": "2019-07-29 10:36:05.474948",
"stderr": "",
"stderr_lines": [],
"stdout": "aph=crowdstrike.domain.",
"stdout_lines": [
"aph=crowdstrike.intra.absaafrica."
]
},
{
"_ansible_ignore_errors": null,
"_ansible_item_result": true,
"_ansible_no_log": false,
"_ansible_parsed": true,
"changed": true,
"cmd": "/opt/CrowdStrike/falconctl -g --cid",
"delta": "0:00:00.006716",
"end": "2019-07-29 10:36:05.662173",
"failed": false,
"invocation": {
"module_args": {
"_raw_params": "/opt/CrowdStrike/falconctl -g --cid",
"_uses_shell": true,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"warn": true
}
},
"item": "/opt/CrowdStrike/falconctl -g --cid",
"rc": 0,
"start": "2019-07-29 10:36:05.655457",
"stderr": "",
"stderr_lines": [],
"stdout": "cid=\"185d26e78791sksdasd9d1033sa4\".",
"stdout_lines": [
"cid=\"185d26e78791sksdasd9d1033sa4\"."
]
},
{
"_ansible_ignore_errors": null,
"_ansible_item_result": true,
"_ansible_no_log": false,
"_ansible_parsed": true,
"changed": true,
"cmd": "/opt/CrowdStrike/falconctl -g --app",
"delta": "0:00:00.006617",
"end": "2019-07-29 10:36:05.840573",
"failed": false,
"invocation": {
"module_args": {
"_raw_params": "/opt/CrowdStrike/falconctl -g --app",
"_uses_shell": true,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"warn": true
}
},
"item": "/opt/CrowdStrike/falconctl -g --app",
"rc": 0,
"start": "2019-07-29 10:36:05.833956",
"stderr": "",
"stderr_lines": [],
"stdout": "app=8080.",
"stdout_lines": [
"app=8080."
]
}
]
}
I cant get the stdout value of each object.
You can use the json_query filter:
- debug:
var: falcon_config | json_query('results[*].stdout')
This will also work as input to a loop
The problem you have is that when you register the output of a module on a loop, you end up with a list. So, on the line var: falcon_config['results'].stdout it fails because falcon_config['results'] is a list and doesn't have a stdoud key. You have to access this result inside a loop.
Ths snippet you've included should work:
- debug:
var: '{{ item.stdout }}'
with_items: falcon_config['results']
I tested your code with the following playbook, and it does:
---
- hosts: local
connection: local
gather_facts: no
tasks:
- name: Run all shell commands
shell: '{{ item }}'
register: falcon_config
with_items:
- 'echo Hello World'
- 'echo Something'
- 'echo lorem ipsum'
- name: Debug the results
debug:
var: item["stdout"]
with_items: '{{ falcon_config["results"] }}'
I hope it helps

ansible V2 -> "skip_reason": "Conditional check failed" with_items

I am getting some errors while doing the following:
group_vars:
tomcat_servers:
- name: tomcat_1
shutdown_port: 8005
connector_port: 8080
ajp_port: 8009
- name: tomcat_2
shutdown_port: 8105
connector_port: 8180
ajp_port: 8109
main code:
- name: "Check if tomcat is already installed"
stat: path={{ tomcat_server_dir }}/{{ item.name }}/RELEASE-NOTES
register: status
with_items: "{{ tomcat_servers }}"
- debug: var=status
- name: "Copy tomcat into folder if it is not installed"
command: /bin/tar -zxvf /tmp/{{ tomcat_catalina_base }} -C {{ tomcat_server_dir }}/{{ item.name }} --strip 2
when: not status.results[0].stat.exists
with_items:
- "{{ tomcat_servers }}"
- "{{ status.results }}"
Debug result:
ok: [VM1] => {
"status": {
"changed": false,
"msg": "All items completed",
"results": [
{
"_ansible_item_result": true,
"_ansible_no_log": false,
"changed": false,
"invocation": {
"module_args": {
"checksum_algorithm": "sha1",
"follow": false,
"get_checksum": true,
"get_md5": true,
"mime": false,
"path": "/opt/tomcat_3/RELEASE-NOTES"
},
"module_name": "stat"
},
"item": {
"ajp_port": 8009,
"connector_port": 8080,
"name": "tomcat_1",
"shutdown_port": 8005
},
"stat": {
"exists": false
},
{
"_ansible_item_result": true,
"_ansible_no_log": false,
"changed": false,
"invocation": {
"module_args": {
"checksum_algorithm": "sha1",
"follow": false,
"get_checksum": true,
"get_md5": true,
"mime": false,
"path": "/opt/tomcat_3/RELEASE-NOTES"
},
"module_name": "stat"
},
"item": {
"ajp_port": 8109,
"connector_port": 8180,
"name": "tomcat_2",
"shutdown_port": 8105
},
"stat": {
"exists": false
}
}
]
}
}
Now unfortunally I seem to get the error
"skip_reason": "Conditional check failed", "skipped": true
I have been around the "have you googled it" many times but cannot seem to find the solution here. Google ansible check if file exists with_items and you will probably see the same results.
Any one got an idea how to get this working?
Correct second loop:
---
- hosts: localhost
vars:
results:
- item:
ajp_port: 8009
connector_port: 8080
name: tomcat_1
shutdown_port: 8005
stat:
exists: false
- item:
ajp_port: 8109
connector_port: 8180
name: tomcat_2
shutdown_port: 8105
stat:
exists: false
- item:
name: tomcat_exist
stat:
exists: true
tasks:
- debug:
msg: "name: {{ item.item.name }}, exists: {{ item.stat.exists }}"
when: not item.stat.exists
with_items: "{{ results }}"
So in your setup you need to loop over status.results and refer to item.item.name and item.stat.exists.

Resources