Observium reporting with Ansible

Observium has a nice GUI, and you can find lots of information but it does not have a reports feature so you can save it to a file. This is usually useful when some other team needs some info for auditing purposes for example.
Observium has an API so I was thinking to use it to get the info I want. I could do it in Python but I’ve chosen Ansible this time. And to make it really easy for others to run it I’ve used AWX.
Also, I wanted to be able to display the info on screen, save it to a local file but also post the info in a Gitlab repository. This way I could share easily the info with other teams.

Starting with all these in mind I’ve written a small script which I am sharing with you.

First I used Observium API to get the information for all devices that have an os type.

    - name: Get OS devices
      uri:
        url: "https://{{ansible_host}}/api/v0/devices/?os={{os}}"
        method: GET
        validate_certs: no
        return_content: yes
        user: "{{observium_user}}"
        password: "{{observium_password}}"
        force_basic_auth: yes
        body_format: json
      register: result

The os variable is defining what type of os I am searching for and it can be found in the vars file (folder group_vars):

#os: arista_eos
os: ios
#os: asa
#os: iosxe
#os: iosxr
#os: nxos
#os: cumulus-os
#os: fortigate

Next, I am building a list:

 - name: Add new JSON Objects to List
      set_fact:
         devices: "{{ devices +
                       [{ 'Hostname': item.value.hostname,
                          'Hardware': item.value.hardware,
                          'Vendor': item.value.vendor,
                          'Version': item.value.version,
                          'Features': item.value.features,
                          'Serial': item.value.serial  }] }}"

      loop: "{{ devices_list|dict2items }}"

Next, I am writing to a local file and display it on screen:

 - name: file
      lineinfile:
        dest: devices.txt
        line: "{{item.Hostname}},{{item.Vendor}},{{item.Hardware}},{{item.Version}},{{item.Features}},{{item.Serial}}"
      loop: "{{ devices }}"


    - name: display file
      command: cat devices.txt
      register: result

    - name: print file
      debug:
        msg: "{{result.stdout_lines}}"

And finally, I am posting the info to a Gitlab Repository:

  - name: post a file in gitlab
      uri:
        url: "https://git.website.com/api/v4/projects/11/repository/commits"
        method: POST
        validate_certs: no
        body_format: json
        status_code: 201
        headers:
          PRIVATE-TOKEN: "{{git_token}}"
        body: {
                "branch": "master",
                "commit_message": "ansible report on devices with {{os}} commit message",
                "actions": [
                 {
                   "action": "create",
                   "file_path": "devices_{{os}}_{{day}}_{{time}}.txt",
                   "content": "{{result.stdout_lines | to_nice_json}}"
                 }
               ]
        }

For example, the result for ios xe devices looks like this:

where each line represents: Device Name, Vendor, Hardware, Version, Features, Serial

This project/script is just an example. You can change the API request you make to Observium and build different reports.

Source project:
https://github.com/czirakim/Ansible.Observium.Reporting

Observium API:
https://docs.observium.org/api/

About the author

Mihai is a Senior Network Engineer with more than 15 years of experience