Ansible : query an output array

4,712 views
Skip to first unread message

Z-obaze

unread,
Mar 17, 2017, 9:01:11 AM3/17/17
to Ansible Project
Hi everyone,

I'm wondering if there is a simple way to display the value of on exact item for each row whatever the number of entries we have ?

I'll explain myself, I have an ouput which looks like this :

ok: [server1] => {
   
"requirements": {
       
"changed": false,
       
"msg": "All items completed",
       
"results": [
           
{
               
"_ansible_item_result": true,
               
"_ansible_no_log": false,
               
"_ansible_parsed": true,
               
"changed": false,
               
"invocation": {
                   
"module_args": {
                       
"conf_file": null,
                       
"disable_gpg_check": false,
                       
"disablerepo": null,
                       
"enablerepo": null,
                       
"exclude": null,
                       
"install_repoquery": true,
                       
"list": "first_package",
                       
"name": null,
                       
"state": "installed",
                       
"update_cache": false,
                       
"validate_certs": true
                   
},
                   
"module_name": "yum"
               
},
               
"item": "first_package",
               
"results": [
                    {

                       
"arch": "x86_64",
                       
"epoch": "0",
                       
"name": "name_of_the_package",
                       
"nevra": "0:first_package",
                       
"release": "release_of_the_package",
                       
"repo": "repo",
                       
"version": "version_of_the_package",
                       
"yumstate": "available"
                   
}

                ]

           
},
           
{
               
"_ansible_item_result": true,
               
"_ansible_no_log": false,
               
"_ansible_parsed": true,
               
"changed": false,
               
"invocation": {
                   
"module_args": {
                       
"conf_file": null,
                       
"disable_gpg_check": false,
                       
"disablerepo": null,
                       
"enablerepo": null,
                       
"exclude": null,
                       
"install_repoquery": true,
                       
"list": "second_package",
                       
"name": null,    
                       
"state": "installed",
                       
"update_cache": false,
                       
"validate_certs": true
                   
},
                   
"module_name": "yum"
               
},
               
"item": "second_package",
               
"results": [
                   
{
                       
"arch": "x86_64",
                       
"epoch": "0",
                       
"name": "name_of_the_package",
                       
"nevra": "0:second_package",
                       
"release": "release_of_the_package",
                       
"repo": "repo",
                       
"version": "version_of_the_package",
                       
"yumstate": "available"
                   
}
                 ]


And with that output, i'd like to display the value of "yumstate" entry for all of the items, here we have two items, but we could have 3, 4 or more.

Within my playbook i tried to do something like this, but of course it doesn't work :

        - name: debug
          debug:
             var: 'requirements.results[*].results[*].yumstate'

I also tried with a loop, but I haven't found anything.

So does anyone have a clue to do this?

Thanks for your help

Kai Stian Olstad

unread,
Mar 17, 2017, 12:51:25 PM3/17/17
to ansible...@googlegroups.com
On 17. mars 2017 11:27, Z-obaze wrote:
> And with that output, i'd like to display the value of "yumstate" entry for
> all of the items, here we have two items, but we could have 3, 4 or more.
>
> Within my playbook i tried to do something like this, but of course it
> doesn't work :
>
> - name: debug
> debug:
> var: 'requirements.results[*].results[*].yumstate'
>
> I also tried with a loop, but I haven't found anything.
>
> So does anyone have a clue to do this?

- debug: var=item.results.0.yumstate
with_items: "{{ requirements.results }}"

--
Kai Stian Olstad

Z-obaze

unread,
Mar 20, 2017, 1:35:17 PM3/20/17
to Ansible Project, ansible-pr...@olstad.com
Thanks a lot, it was just what I needed.

Z-obaze

unread,
Mar 28, 2017, 5:44:46 AM3/28/17
to Ansible Project
Hi,

I'm finally stuck with another case.

Sometimes I could get something like this :

                        "repo": "installed",
                        "version": "version_of_the_package",
                        "yumstate": "installed"

So here, I have two results for the same package.
With the tip you gave me, I can only look into the first one, I know I could add "item.results.1.yumstate" but I don't want to cause I could get more than 2 results.

I tried with the "with_subelements" but it split the array by the number of results I have and in that case I want to compare "item.results.0.yumstate" and "item.results.1.yumstate"? But as I said I could get more.

Thanks for your help

Kai Stian Olstad

unread,
Mar 29, 2017, 4:42:29 AM3/29/17
to ansible...@googlegroups.com
To do this you need a loop in a loop.

Put the inner most loop in a yaml file and use include with with_itmes
to loop the outer item and use loop_control to change the variable name.
https://docs.ansible.com/ansible/playbooks_loops.html#loop-control

--
Kai Stian Olstad

Z-obaze

unread,
Mar 29, 2017, 10:14:08 AM3/29/17
to Ansible Project, ansible-pr...@olstad.com
Thanks.

And is there a way to not use include and to keep the inner loop into the same playbook than the outer loop?
Cause I don't like the way it splits the playbook into two yaml files.

Kai Stian Olstad

unread,
Mar 29, 2017, 10:35:29 AM3/29/17
to ansible...@googlegroups.com
On 29. mars 2017 16:14, Z-obaze wrote:
> Thanks.
>
> And is there a way to not use include and to keep the inner loop into the
> same playbook than the outer loop?
> Cause I don't like the way it splits the playbook into two yaml files.

No, that is the only way to do it in Ansible.

If you are only using the data in a template then you can do loop in a
loop in Jinja2.

--
Kai Stian Olstad

Z-obaze

unread,
Mar 30, 2017, 5:14:54 AM3/30/17
to Ansible Project, ansible-pr...@olstad.com
OK thanks.

And do you know if there is a way with the yum module to not have those two entries when the latest package is installed ? I'd like to have only the one with "yumstate=installed" and not the one with available state.
Cause actually I just want to know if one package is installed or not, but I don't want to install it, just check, that's why I don't want to use the "state=installed" or even "present" cause it will install the package if it's not here.
I tried a lot of thing but so far didn't find what I wanted.
does it make sense?

Thanks
Reply all
Reply to author
Forward
0 new messages