Ansible : query an output array

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

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

Thanks a lot, it was just what I needed.

Hi,

I’m finally stuck with another case.

Sometimes I could get something 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”
}
{
“arch”: “x86_64”,
“epoch”: “0”,
“name”: “name_of_the_package”,
“nevra”: “0:first_package”,
“release”: “release_of_the_package”,
“repo”: “installed”,
“version”: “version_of_the_package”,
“yumstate”: “installed”
}
]
},
{
“_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”
}
]

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

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

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.

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