1
votes

I want to run an Ansible playbook on multiple hosts and register outputs to a variable. Now using this variable, I want to copy output to single file. The issue is that in the end there is output of only one host in the file. How can I add output of all the hosts in a file one after the other. I don't want to use serial = 1 as it slows down execution considerably if we have multiple hosts.

-

     hosts: all
      remote_user: cisco
      connection: local
      gather_facts: no

      vars_files:
      - group_vars/passwords.yml

      tasks:
      - name: Show command collection
        ntc_show_command:
          connection: ssh
          template_dir: /ntc-ansible/ntc-templates/templates
          platform: cisco_ios
          host: "{{ inventory_hostname }}"
          username: "{{ ansible_ssh_user }}"
          password: "{{ ansible_ssh_pass }}"
          command: "{{commands}}"
        register: result

      - local_action:
          copy content="{{result.response}}" dest='/home/user/show_cmd_ouput.txt'
1

1 Answers

3
votes

result variable will be registered as a fact on each host the task ntc_show_command was run, thus you should access the value through hostvars dictionary.

- local_action:
    module: copy
    content: "{{ groups['all'] | map('extract', hostvars, 'result') | map(attribute='response') | list }}"
    dest: /home/user/show_cmd_ouput.txt
  run_once: true

You also need run_once because the action would still be run as many times as hosts in the group.