This page was the starting point of me figuring out how to print the 
'results[*].stdout_lines' of a registered return value. So, I thought I 
ought to share what I found to work, as it's quite short and re-usable with 
any return value that produces a list. It also provides flexibility to add 
more fields to the output.

If 'stdout_lines' is the only variable in the select, the resulting array 
will be all 1 liners, rather than grouped by result. 'item' within each 
result in the list displays the item name provided when the list was 
produced.

    - name: Show 'item' & 'stdout_lines' per result
      debug: var=item
      loop: "{{ result | json_query('results[*].{item: item, stdout_lines: 
stdout_lines}') }}"

    - name: Only show 'stdout_lines' per result
      debug: var=item.stdout_lines
      loop: "{{ result | json_query('results[*].{item: item, stdout_lines: 
stdout_lines}') }}"

    - name: Use shell to print 'stdout_lines' per result
      shell: "echo {{ item.stdout_lines }}"
      loop: "{{ result | json_query('results[*].{item: item, stdout_lines: 
stdout_lines}') }}"

    - name: Use shell to print flattened 'stdout_lines'
      shell: "echo {{ item }}"
      loop: "{{ result | json_query('results[*].{stdout_lines: 
stdout_lines}') }}"

Hopefully someone finds this useful.
On Thursday, May 30, 2019 at 8:19:35 AM UTC-5 Adam wrote:

> After spending several hours trying different combinations of tasks, 
> filters, combinations of filters, etc, I decided I spent too much time 
> trying to do it all in memory.  Here was my final solution that works:
>
> - name: make sure temp file doesn't exist
>   file:
>     state: absent
>     path: "{{appdataRoot}}/directoriesToBuild.tmp"
>
> - name: get list of directories to build
>   shell: "egrep '^archive.directory|^outgoing.directory|^incoming.directory' 
> {{conf_dir}}/{{item.1.config}}|cut -d '=' -f2|sort|uniq  >> 
> {{appdataRoot}}/directoriesToBuild.tmp"
>
>   with_subelements:
>     - "{{loggers}}"
>     - configs
>
> - name: put list of directories into a variable
>   shell: "cat {{appdataRoot}}/directoriesToBuild.tmp"
>   register: directoriesToBuild
>
>
>
> - name: build found directories
>   file:
>     state: directory
>     path: "{{item}}"
>   with_items:
>
>     - "{{directoriesToBuild.stdout_lines}}"
>
>
> On Wednesday, May 29, 2019 at 9:27:43 PM UTC-4, Adam wrote:
>>
>> I was over zealous & too hopeful.. this doesn't actually work for me.  It 
>> looks like it treats the whole list of directories as one big directory. 
>>  I'm not entirely sure why yet. 
>>
>> On Wednesday, May 29, 2019 at 9:12:22 PM UTC-4, Adam wrote:
>>>
>>> Matt - 
>>>
>>> I don't know how you figured out how to do this (I would love to know), 
>>> but it should DEFINITELY be in the documentation.  It's not pretty, but it 
>>> works and it solved my issue.      It's definitely easier than breaking it 
>>> into multiple tasks or having to populate a list manually.
>>>
>>> - name: get list of directories
>>>   shell: "egrep 
>>> '^archive.directory|^outgoing.directory|^incoming.directory' 
>>> {{conf_dir}}/{{item.1.config}}|cut -d '=' -f2|sort|uniq"
>>>   with_subelements:
>>>     - "{{loggers}}"
>>>     - configs
>>>   register: directoriesToBuild
>>>
>>> - name: debug directory output
>>>   debug:
>>>     msg: "{{directoriesToBuild.results|map(attribute='stdout_lines')|list}}"
>>>
>>> - name: build found directories
>>>   file:
>>>     state: directory
>>>     path: "{{item}}"
>>>   with_items:
>>>     - "{{directoriesToBuild.results|map(attribute='stdout_lines')|list}}"
>>>
>>>
>>> -Adam
>>>
>>> On Tuesday, February 23, 2016 at 2:04:59 PM UTC-5, Matt Martz wrote:
>>>>
>>>> The "problem" is in how ansible registers results when using 
>>>> with_items.  It nests all of the results inside of a `results` key
>>>>
>>>> Your second task could have been written to use:
>>>>
>>>>     - name: use shell to print list of file paths
>>>>       shell: "echo {{ item }}"
>>>>       with_items: "{{ files.results|map(attribute='stdout_lines')|list 
>>>> }}"
>>>>
>>>> That would do it for you.  That pulls the `stdout_lines` attribute out 
>>>> into a list of `stdout_lines`, then with_items natively handles the 
>>>> flattening, allowing you to loop over each individual item in the `ls` 
>>>> output.
>>>>
>>>> There is some documentation about using register with a loop, which you 
>>>> can find at 
>>>> http://docs.ansible.com/ansible/playbooks_loops.html#using-register-with-a-loop
>>>>
>>>> On Tue, Feb 23, 2016 at 12:51 PM, Jason Gilfoil <[email protected]> 
>>>> wrote:
>>>>
>>>>> So after some testing and reading i'm gonna attempt to answer my own 
>>>>> question, and pose another one.
>>>>>
>>>>> The documentation I cited for iterating the results of a program 
>>>>> execution didn't involve the use of with_items in the original program 
>>>>> execution. Having multiple results in a register variable doesn't seem to 
>>>>> play nice with 'with_items'. 
>>>>>
>>>>> I decided to work around the issue by having multiple tasks to gather 
>>>>> the file names and iterate over each result in the replace module.
>>>>>
>>>>> As a corollary to that, when using with_items and setting a 
>>>>> failed_when condition, you can't seem to use the 'rc' property of the 
>>>>> register variable in a task because the rc code only exists if the task 
>>>>> fails. I'm thinking there must be a way to say fail_when: the register.rc 
>>>>> exists, but haven't figured that part out yet.
>>>>>
>>>>>
>>>>> On Monday, February 22, 2016 at 10:19:47 AM UTC-5, Jason Gilfoil wrote:
>>>>>>
>>>>>> Hello All,
>>>>>>
>>>>>> I'm ultimately attempting to pull a list of files with wildcarded 
>>>>>> paths and pass the results into the replace module so it can cycle 
>>>>>> through 
>>>>>> them all. However, starting with a more simple example, i'm having 
>>>>>> issues 
>>>>>> getting the list of files to print properly in even a simple test case.
>>>>>>
>>>>>>
>>>>>> Pastebin code:
>>>>>> http://pastebin.com/zFRzucat
>>>>>>
>>>>>> I'm looking for this:
>>>>>>
>>>>>> test.yml playbook
>>>>>>  
>>>>>> - hosts: all
>>>>>>   tasks:
>>>>>>     - name: gather list of files
>>>>>>       shell: ls {{ item }}
>>>>>>       register: files
>>>>>>       with_items:
>>>>>>         - /app/psoft/test/*/list.txt
>>>>>>         - /app/psoft/test/*/context.xml
>>>>>>  
>>>>>>     - name: use shell to print list of file paths
>>>>>>       shell: "echo {{ item }}"
>>>>>>       with_items: "{{files.stdout_lines}}"
>>>>>>
>>>>>>
>>>>>> to print
>>>>>>
>>>>>> /app/psoft/test/12.1.2.00/list.txt
>>>>>> /app/psoft/test/12.1.3.00/context.xml
>>>>>>
>>>>>> However currently the result is:
>>>>>>
>>>>>> TASK [gather list of files] 
>>>>>> ****************************************************
>>>>>> changed: [net12204] => (item=/app/psoft/test/*/list.txt)
>>>>>> changed: [net12204] => (item=/app/psoft/test/*/context.xml)
>>>>>>
>>>>>> TASK [use shell to print list of file paths] 
>>>>>> ***********************************
>>>>>> [DEPRECATION WARNING]: Skipping task due to undefined attribute, in 
>>>>>> the future this will be a fatal error.. This feature will
>>>>>> be removed in a future release. Deprecation warnings can be disabled 
>>>>>> by setting deprecation_warnings=False in ansible.cfg.
>>>>>>
>>>>>>
>>>>>> Am I misusing or not understanding 
>>>>>> http://docs.ansible.com/ansible/playbooks_loops.html#iterating-over-the-results-of-a-program-execution
>>>>>>  
>>>>>> properly?
>>>>>>
>>>>>>
>>>>>> Thanks!
>>>>>> Jason
>>>>>>
>>>>>> -- 
>>>>> You received this message because you are subscribed to the Google 
>>>>> Groups "Ansible Project" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>>> an email to [email protected].
>>>>> To post to this group, send email to [email protected].
>>>>> To view this discussion on the web visit 
>>>>> https://groups.google.com/d/msgid/ansible-project/82ae7301-06d6-42e9-a4f3-cf017f09ed22%40googlegroups.com
>>>>>  
>>>>> <https://groups.google.com/d/msgid/ansible-project/82ae7301-06d6-42e9-a4f3-cf017f09ed22%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>>
>>>>
>>>>
>>>> -- 
>>>> Matt Martz
>>>> @sivel
>>>> sivel.net
>>>>
>>>

-- 
You received this message because you are subscribed to the Google Groups 
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/35bbdc4b-447a-41f3-845a-1f9ffccd262an%40googlegroups.com.

Reply via email to