Right, but as you've discovered `copy` and `template` won't update part of a file. So your two choices are: (1) remove the various template/copy tasks from the various places in your playbook and replace them with a single task at the end that creates the single file, or (2) store the output of the various tasks to separate files and use `assemble` (or a shell script) at then end to put the disparate pieces into one file. If there are other options, they aren't obvious to me at the moment.
On Friday, March 17, 2023 at 9:43:30 AM UTC-4 Aharonu wrote: > Greetings for the day! > > Looks like ansible.builtin.assemble for two different files from directory > to another required file. > > Sorry to raise my query again but..wanted to be clear. > > My requirement is, *As i mentioned in previous mail*: playbook should be > having only one csv file but two different tasks using that.( not to store > 2 diff files and combine). It is to append one file from 2 tasks. > > *# cat /tmp/facts.csv* > somedata1 [coming from 'rescue' task > somedata2 [coming from 'rescue' task > somedata3 [ coming from 'always' task > somedata4 [coming from 'always' task > > Thank you, > > On Fri, 17 Mar 2023, 17:36 Todd Lewis, <[email protected]> wrote: > >> Consider >> https://docs.ansible.com/ansible/latest/collections/ansible/builtin/assemble_module.html >> >> It combines multiple files into one. >> >> On Friday, March 17, 2023 at 1:40:05 AM UTC-4 Aharonu wrote: >> >>> >>> I am digging into ansible.builtin.copy and ansible.builtin.template >>> *content *but not get options to append. >>> >>> Can we append two different tasks data into one csv file instead of >>> over write? >>> >>> One task i have under '*rescue*' section as example below: >>> >>> rescue: >>> >>> >>> - name: Create failed_list CSV >>> *ansible.builtin.copy:* >>> *content: |* >>> >>> failed >>> {% for host in hostvars | dict2items | map(attribute='value') | >>> map(attribute='failed_list', default=[]) | flatten %} >>> {{ host }} >>> {% endfor %} >>> dest: */tmp/facts.csv* >>> run_once: true >>> >>> /tmp/facts.csv gives >>> >>> # cat /tmp/facts.csvsomedata1 >>> somedata2 >>> >>> I have another task cvs data under '*always*' section: >>> >>> always: >>> - name: append volume info to CSV >>> *ansible.builtin.copy:* >>> *content: |* >>> failed >>> {% example rule %} >>> {{ host }} >>> {% endfor %} >>> dest: /tmp/facts.csv >>> run_once: true >>> Gives: >>> >>> # cat /tmp/facts.csvsomedata3 >>> >>> somedata4 >>> >>> It should append data instead of overwrite here. Is it possible? >>> We just need end of two files data into one: >>> >>> # cat /tmp/facts.csv >>> somedata1 >>> somedata2 >>> somedata3 >>> somedata4 >>> >>> >>> Thank you, >>> >>> On Thu, 16 Mar 2023, 00:13 Todd Lewis, <[email protected]> wrote: >>> >>>> Study and play around with these expressions until you understand what >>>> each piece does. >>>> set_fact sets a host-specific fact, which for convenience can be >>>> accessed like any other variable. >>>> Any host can see other hosts' facts/variables by looking in >>>> hostvars['somehost'].*varname*. >>>> The "CSV" is really just a list of failed hosts. With only one column, >>>> does CSV really mean anything? >>>> The final copy task should be a template task, but I left it in-line >>>> for clarity. >>>> >>>> - name: Update failed_list fact >>>> ansible.builtin.set_fact: >>>> failed_list: "{{ failed_list | default([]) + [ansible_host] }}" >>>> >>>> - name: Debug list >>>> ansible.builtin.debug: >>>> msg: >>>> - "by play_hosts: {{ ansible_play_hosts | map('extract', hostvars) | >>>> map(attribute='failed_list') | flatten }}" >>>> - "by all: {{ hostvars | dict2items | map(attribute='value') | >>>> map(attribute='failed_list', default=[]) | flatten }}" >>>> >>>> - name: Create failed_list CSV >>>> ansible.builtin.copy: >>>> content: | >>>> failed >>>> {% for host in hostvars | dict2items | map(attribute='value') | >>>> map(attribute='failed_list', default=[]) | flatten %} >>>> {{ host }} >>>> {% endfor %} >>>> dest: /tmp/failed_list.csv >>>> run_once: true >>>> >>>> Hope this helps. >>>> -- >>>> Todd >>>> >>>> On 3/15/23 1:44 PM, Aharonu wrote: >>>> >>>> Hello Everyone, >>>> >>>> Greetings! >>>> >>>> I am working to get failed hosts from 'rescue' section into a CSV file. >>>> >>>> When i run task for *'inventory_hostname*' from *'rescue'* section: >>>> >>>> rescue: >>>>> - name: inventory_host name list debug >>>>> debug: >>>>> msg: "{{ inventory_hostname }}" >>>>> Output: >>>>> TASK [inventory_host name list debug] >>>>> ******************************************************************************************************************************************************************************************************* >>>>> ok: [bogus1] => {} >>>>> >>>>> MSG: >>>>> >>>>> bogus1 >>>>> ok: [bogus2] => {} >>>>> >>>>> MSG: >>>>> >>>>> bogus2 >>>>> >>>>> *when i tried to append data to a list. * >>>> >>>>> - set_fact: >>>>> failed_list: "{{ failed_list + [ansible_host] }}" >>>>> - name: failed_list debug >>>>> debug: var=failed_list >>>>> >>>> >>>> Output: >>>> TASK [set_fact] >>>> ***************************************************************************************************************************************************************************************************************************** >>>> ok: [bogus1] >>>> ok: [bogus2] >>>> >>>> TASK [failed_list debug] >>>> ******************************************************************************************************************************************************************************************************************** >>>> ok: [bogus1] => { >>>> "failed_list": [ >>>> "bogus1" >>>> ] >>>> } >>>> ok: [bogus2] => { >>>> "failed_list": [ >>>> "bogus2" >>>> ] >>>> } >>>> >>>> >>>> Here bogus1, bogus2 host names are failed in 'resce' section. >>>> We have multiple hosts in our environment. While running playbook we >>>> have to capture failed hostname into a file as mentioned below: >>>> >>>> *failed_hosts.csv:* >>>> *number of failed hots: 2* >>>> *hostname:* >>>> *bogus1* >>>> *bogus2* >>>> >>>> >>>> Thank you for your help. >>>> -- >>>> 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/CANGEjuXCUuCkps8CU9oWnh3XHN7jo6OJnGJQOCQRvay9w1rg2w%40mail.gmail.com >>>> >>>> <https://groups.google.com/d/msgid/ansible-project/CANGEjuXCUuCkps8CU9oWnh3XHN7jo6OJnGJQOCQRvay9w1rg2w%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>>> >>>> -- >>>> Todd >>>> >>>> -- >>>> 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/9646aced-38a3-b18b-e71f-d7186a8b41fa%40gmail.com >>>> >>>> <https://groups.google.com/d/msgid/ansible-project/9646aced-38a3-b18b-e71f-d7186a8b41fa%40gmail.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>> -- >> 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/5f6783f9-7d45-41cf-8d7a-1b7a92303f53n%40googlegroups.com >> >> <https://groups.google.com/d/msgid/ansible-project/5f6783f9-7d45-41cf-8d7a-1b7a92303f53n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- 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/f70dd050-0d71-41fa-b836-d2df25e9555bn%40googlegroups.com.
