HiveBrain v1.2.0
Get Started
← Back to all entries
snippetMinor

How to log outcome from multiple hosts in Ansible?

Submitted by: @import:stackexchange-devops··
0
Viewed 0 times
hostslogoutcomemultiplehowfromansible

Problem

I've a playbook that runs EOS commands against multiple devices. Currently the whole thing is done in bash, creates one massive text file log and an engineer compares each day's log to the previous one for irregularities.

I'm attempting to have one simple playbooks that runs the commands and logs to json from which it'll be easier to automate the comparison, but I've just realised only logs from one device are saved as opposed to the two I'm testing against.

---
- name: Checks
  hosts: myhosts
  connection: local

  tasks:
  - name: Run Commands
    eos_command:
     commands:
      - show ip pim neighbor | json
      - show ip bgp summary | json
    register: result

  - name: Save to file
    copy: 
     content: "{{ result.stdout_lines | to_nice_json }}"
    dest: "/home/homedirectory/results.json"


Would there be way to log both (and eventually all production) devices in the same file?

Solution

This question has two approaches, and both has answers on SO:

-
Convert all Ansible output to JSON with json stdout callback and parse it with your favourite tools. The eos_command output for each device will be under different host key in the resulting json.
See this and this.

-
Make run_once task to collect data from other hosts, like this:

- debug:
    msg: "{{ ansible_play_hosts | map('extract', hostvars, 'result') | map(attribute='stdout_lines') | list }}"
  run_once: yes


See this.

Code Snippets

- debug:
    msg: "{{ ansible_play_hosts | map('extract', hostvars, 'result') | map(attribute='stdout_lines') | list }}"
  run_once: yes

Context

StackExchange DevOps Q#2408, answer score: 8

Revisions (0)

No revisions yet.