Collection of CheckMK checks (see https://checkmk.com/). All checks and plugins are provided as is. Absolutely no warranty. Send any comments to thl-cmk[at]outlook[dot]com

Skip to content
Snippets Groups Projects
README.md 12.8 KiB
Newer Older
thl-cmk's avatar
thl-cmk committed
[PACKAGE]: ../../raw/master/create_topology_data-0.0.6-20231017.mkp "create_topology_data-0.0.6-20231017.mkp"
thl-cmk's avatar
thl-cmk committed
# PoC for creating topology_data.json from inventory data
thl-cmk's avatar
thl-cmk committed

thl-cmk's avatar
thl-cmk committed
This script creates the topology data file needed for the [Checkmk Exchange Network visualization](https://forum.checkmk.com/u/schnetz) plugin by Andreas Boesl and [schnetz](https://exchange.checkmk.com/u/schnetz). For more information see [Checkmk forum Network Visualization](https://forum.checkmk.com/t/network-visualization/41680). 
thl-cmk's avatar
thl-cmk committed

thl-cmk's avatar
thl-cmk committed
The network topology data is read from the Checkmk HW/SW inventory. The necessary inventory data can be created with my CDP/LLDP inventory plugins.
thl-cmk's avatar
thl-cmk committed

thl-cmk's avatar
thl-cmk committed
CDP: [CDP inventory plugin](https://thl-cmk.hopto.org/gitlab/checkmk/vendor-independent/inventory/inv_cdp_cache/)\
CDP path-in-inventory: `"networking,cdp_cache"`\
CDP inventory-columns: `"device_id,local_port,device_port"`

thl-cmk's avatar
thl-cmk committed
LLDP: [LLDP inventory plugin](https://thl-cmk.hopto.org/gitlab/checkmk/vendor-independent/inventory/inv_lldp_cache/)\
thl-cmk's avatar
thl-cmk committed
LLDP path-in-inventory: `"networking,lldp_cache"`\
LLDP inventory-columns: `"system_name,local_port_num,port_id"`

thl-cmk's avatar
thl-cmk committed
Usage with CDP (this is the default):
thl-cmk's avatar
thl-cmk committed
```
thl-cmk's avatar
thl-cmk committed
~/local/lib/topology_data/create_topology_data.py -s Core01 -m
thl-cmk's avatar
thl-cmk committed
```

thl-cmk's avatar
thl-cmk committed
Usage with LLDP:
thl-cmk's avatar
thl-cmk committed
```
thl-cmk's avatar
thl-cmk committed
~/local/lib/topology_data/create_topology_data.py -s Core01 -m --lldp
thl-cmk's avatar
thl-cmk committed

thl-cmk's avatar
thl-cmk committed
```
thl-cmk's avatar
thl-cmk committed

---
### Download
* [Download latest mkp file][PACKAGE]
                        
---
### Installation

You can install the package by uploading it to your CheckMK site and as site user run 
```
mkp add PAKAGE_NAME.mkp
mkp enable PAKAGE_NAME VERSION
```

In the Enterprise/Free/Cloud edition of CheckMK you can use the GUI to install the package (_Setup_ -> _Extension Packages_ -> _Upload package_)

---
### Want to Contribute?

Nice ;-) Have a look at the [contribution guidelines](CONTRIBUTING.md "Contributing")

thl-cmk's avatar
thl-cmk committed
---
### Requirements

To use this tool:
- your Checkmk Site must be running at least CMK version 2.2.0p1
- the HW/SW inventory must be enabled
- you need to install/enable an inventory plugin to collect the connection data I.e. my [CDP cache](https://thl-cmk.hopto.org/gitlab/checkmk/vendor-independent/inventory/inv_cdp_cache/) plugin
- the [Network visualization](https://exchange.checkmk.com/p/network-visualization) must be installed

thl-cmk's avatar
thl-cmk committed
---
### Usage

thl-cmk's avatar
thl-cmk committed
<details><summary>Help output from create_topology_data.py -h</summary>

thl-cmk's avatar
thl-cmk committed
```
thl-cmk's avatar
thl-cmk committed
OMD[build]:~$ ~/local/bin/topology_data/create_topology_data.py -h
thl-cmk's avatar
thl-cmk committed
usage: create_topology_data.py [-h] [-m] [-o OUTPUT_DIRECTORY]
                               [-s SEED_DEVICES [SEED_DEVICES ...]] [-v]
                               [--data-source DATA_SOURCE] [--debug] [--dont-compare]
                               [--inventory-columns INVENTORY_COLUMNS] [--keep-domain]
                               [--keep-max KEEP_MAX] [--lldp] [--lowercase]
                               [--min-age MIN_AGE]
                               [--path-in-inventory PATH_IN_INVENTORY]
                               [--time-format TIME_FORMAT] [--uppercase]

This script creates the topology data file needed for the Checkmk "network_visualization"
plugin by Andreas Boesl and schnetz. For more information see
the announcement from schnetz: https://forum.checkmk.com/t/network-visualization/41680
and the plugin on the Exchange: https://exchange.checkmk.com/p/network-visualization .

The required inventory data can be created with my inventory plugins:
thl-cmk's avatar
thl-cmk committed
CDP: https://thl-cmk.hopto.org/gitlab/checkmk/vendor-independent/inventory/inv_cdp_cache
LLDP: https://thl-cmk.hopto.org/gitlab/checkmk/vendor-independent/inventory/inv_lldp_cache

thl-cmk's avatar
thl-cmk committed
Version: 0.0.5-202310117 | Written by: thl-cmk
for more information see: https://thl-cmk.hopto.org
thl-cmk's avatar
thl-cmk committed

options:
  -h, --help            show this help message and exit
thl-cmk's avatar
thl-cmk committed
  -m, --make-default    Set the created topology data as default
thl-cmk's avatar
thl-cmk committed
  -o OUTPUT_DIRECTORY, --output-directory OUTPUT_DIRECTORY
thl-cmk's avatar
thl-cmk committed
                        Directory name where to save the topology data.
                        I.e.: my_topology. Default is the actual date/time
                        in "--time-format" format.
thl-cmk's avatar
thl-cmk committed
                        NOTE: the directory is a sub directory under "~/var/topology_data/"
thl-cmk's avatar
thl-cmk committed
  -s SEED_DEVICES [SEED_DEVICES ...], --seed-devices SEED_DEVICES [SEED_DEVICES ...]
thl-cmk's avatar
thl-cmk committed
                        List of devices to start the topology discovery from.
                        I.e. Core01 Core02
thl-cmk's avatar
thl-cmk committed
  -v, --version         Print version of this script and exit
thl-cmk's avatar
thl-cmk committed
  --data-source DATA_SOURCE
thl-cmk's avatar
thl-cmk committed
                        The source from which the topology data originates.
                        I.e. inv_CDP for CDP data from the inventory.
                        NOTE: right now this only an unused label.
thl-cmk's avatar
thl-cmk committed
  --debug               Print debug information
thl-cmk's avatar
thl-cmk committed
  --dont-compare        Do not compare the actual topology data with the default topology
                        data. By default, the actual topology is compared with the default
                        topology. If the data matches, the actual topology is not saved.
                        So, if you run this tool in a cron job, a new topology will be
                        created only if there was a change, unless you use "--dont-compare".
thl-cmk's avatar
thl-cmk committed
  --inventory-columns INVENTORY_COLUMNS
thl-cmk's avatar
thl-cmk committed
                        Columns used from the inventory data.
                        I.e. "device_id,local_port,device_port"
                        NOTE: the columns must be in the order: neighbour, local_port,
                        neighbour_port
thl-cmk's avatar
thl-cmk committed
  --keep-domain         Do not remove the domain name from the neighbor name
thl-cmk's avatar
thl-cmk committed
  --keep-max KEEP_MAX   Number of topologies to keep. The oldest topologies above keep
                        max will be deleted. The minimum value for --keep-max is 1.
                        Note: The default topologies will be always kept.
  --lldp                Sets data source to inv_LLDP, inventory path 
                        to "networking,lldp_cache" and columns
                        to "system_name,local_port_num,port_id"
thl-cmk's avatar
thl-cmk committed
  --lowercase           Change neighbour names to all lower case
thl-cmk's avatar
thl-cmk committed
  --min-age MIN_AGE     The minimum number of days before a topology is deleted
                        by "--keep-max".
                        Note: Topologies that are not older than 1 days are always kept.
thl-cmk's avatar
thl-cmk committed
  --path-in-inventory PATH_IN_INVENTORY
thl-cmk's avatar
thl-cmk committed
                        Checkmk inventory path to the topology data.
                        I.e. "networking,cdp_cache"
thl-cmk's avatar
thl-cmk committed
  --time-format TIME_FORMAT
                        Format string to render the time. (default: %Y-%m-%dT%H:%M:%S.%m)
  --uppercase           Change neighbour names to all upper case
thl-cmk's avatar
thl-cmk committed

Usage:
for CDP (the default):
thl-cmk's avatar
thl-cmk committed
~/local/bin/network-topology/create_topology_data.py -s Core01 Core02 -m
thl-cmk's avatar
thl-cmk committed
for LLDP:
thl-cmk's avatar
thl-cmk committed
~/local/bin/network-topology/create_topology_data.py -s Core01 Core02 -m --lldp
thl-cmk's avatar
thl-cmk committed
OMD[build]:~$ 
thl-cmk's avatar
thl-cmk committed

thl-cmk's avatar
thl-cmk committed
```

thl-cmk's avatar
thl-cmk committed
</details>

thl-cmk's avatar
thl-cmk committed
---
### Limitations

- local/neighbour interface names have to match the service names in Checkmk

thl-cmk's avatar
thl-cmk committed
---
### FAQ

thl-cmk's avatar
thl-cmk committed
<details><summary>If i open the Network visualization, there is no default topology</summary>

\
To make the topology created by this tool the default use the option `-m` / `--make-default`

```
thl-cmk's avatar
thl-cmk committed
$ ~/local/bin/topology_data/create_topology_data.py -s Core01 -m
thl-cmk's avatar
thl-cmk committed
```

</details>

<details><summary>Can i automate the creation of the topology data</summary>

\
thl-cmk's avatar
thl-cmk committed
Yes. Add a cron job for the site user in `~/etc/cron.d`. I.e. to create a topology every hour create the file `create_topoloky_data` in `~/etc/cron.d`

```
0 * * * * $OMD_ROOT/local/bin/topology_data/create_topology_data.py -s C9540-7-1 -m --keep-max 10 --keep-max 10 --min-age 14
```

This will run the tool every hour and create a new topology if there was a changee. It keeps 10 topologies and deletes old topologies only if they are older than 14 days.

Don't forget to restart the crontab service after creating the cron job.

```
OMD[build]:~/etc/cron.d$ omd restart crontab 
Temporary filesystem already mounted
Removing Crontab...OK
Initializing Crontab...OK
OMD[build]:~/etc/cron.d$ 
thl-cmk's avatar
thl-cmk committed
```
thl-cmk's avatar
thl-cmk committed

With crontab -l you get the list of active cron jobs

```
OMD[build]:~/etc/cron.d$ crontab -l | grep -A 3 -B 1  create_topoloky_data 
# ------------------------------------------------------------
# /omd/sites/build/etc/cron.d/create_topoloky_data
0 * * * * $OMD_ROOT/local/bin/topology_data/create_topology_data.py -s Core01 -m --keep-max 10

# ------------------------------------------------------------
thl-cmk's avatar
thl-cmk committed
```
thl-cmk's avatar
thl-cmk committed

**Note**: By default it will only create a new topology if the new topology differs from the default topology. The name for the new topology is by default the creation date and time.
thl-cmk's avatar
thl-cmk committed

</details>

<details><summary>Can I limit the number of topology changes saved</summary>

\
Yes. If you use the option --keep-max <number of topologies to keep> the tool will delete all topologies over this number. I.e.

```
thl-cmk's avatar
thl-cmk committed
$ ~/local/bin/topology_data/create_topology_data.py -s Core01 --keep-max 10
thl-cmk's avatar
thl-cmk committed
```
will delete the oldest topologies until there only 10 topologies left.

**Note**: the default topology will never be deleted.
**Note**: the minimal `--keep-max` is _1_
</details>

<details><summary>I will not delete topologies from the last X days</summary>

No problem. Just use the option `--min-age` togeher with `--keep-max`. I.e. 
```
thl-cmk's avatar
thl-cmk committed
$ ~/local/bin/topology_data/create_topology_data.py -s Core01 --keep-max 10 --min-age 30
thl-cmk's avatar
thl-cmk committed
``` 
will only delete a topology if it older than 30 days.

**Note**: the minimum value for `--min-age` is _1_ day.
</details>

thl-cmk's avatar
thl-cmk committed
<details><summary>Can the topology data creation be customized</summary>

\
Yes. You can customize the topology data creation by modifying the  `~/local/bin/topology_data/create_topology_data.toml` file. Use `~/local/bin/topology_data/create_topology_data.toml_clean` as a template.

**Note**: This file uses [Tom's Obvious Minimal Language](https://toml.io/en/)

</details>

thl-cmk's avatar
thl-cmk committed
<details><summary>My Neighbor names from the inventory and checkmk host names do not match</summary>
thl-cmk's avatar
thl-cmk committed

\
thl-cmk's avatar
thl-cmk committed
If the neighbor names from the inventory and the checkmk host names do not match, the topology does not work. To fix this, add a mapping between the neighbor name and the checkmk host name to the **HOST_MAP** in the `create_topology_data.toml` file. I.e.
thl-cmk's avatar
thl-cmk committed

thl-cmk's avatar
thl-cmk committed
```
thl-cmk's avatar
thl-cmk committed
# map inventory neighbour name to Checkmk host name
[HOST_MAP]
inventory_neighbour1 = "cmk_host1"
inventory_neighbour2 = "cmk_host2"
inventory_neighbour3 = "cmk_host3"
thl-cmk's avatar
thl-cmk committed
```
thl-cmk's avatar
thl-cmk committed
**NOTE**: The script will automatically remove the domain name form the neighbour names. Use the option `--keep-domain` if you want to keep the domain name.
thl-cmk's avatar
thl-cmk committed

</details>

thl-cmk's avatar
thl-cmk committed
<details><summary>In my the inventory are invalid neighbor names</summary>
thl-cmk's avatar
thl-cmk committed

\
If you have invalid neighbor names in the inventory (i.e. "not advertised"), you can drop them by adding them to the **DROP_HOSTS** list in the `create_topology_data.toml` file. I.e..
thl-cmk's avatar
thl-cmk committed

```
thl-cmk's avatar
thl-cmk committed
# drop neighbours with invalid names
thl-cmk's avatar
thl-cmk committed
DROP_HOSTS = [
thl-cmk's avatar
thl-cmk committed
    "not advertised",
    "a nother invalid name",
]
```

</details>


<details><summary>Not all connections are included in the inventory</summary>

\
If your inventory data does not contain all the required topology information, you can add static connections in the `create_topology_data.toml` file. This may be the case if not all of your devices use CDP/LLDP. The connections defined in **STATIC_CONNECTIONS** are added to the topology from host to neighbor and vice versa. I.e..

```
# user defined static connections
# connections will be added from host to neighbour and in reverese
STATIC_CONNECTIONS = [
    ["host1", "local-port1", "neighbour-port1", "neighbour1", "label"],
    ["host1", "local-port2", "neighbour-port2", "neighbour2", "label"],
thl-cmk's avatar
thl-cmk committed
]
```

thl-cmk's avatar
thl-cmk committed
</details>

thl-cmk's avatar
thl-cmk committed
<details><summary>Can I use the tool with other inventory data plugins</summary>

\
thl-cmk's avatar
thl-cmk committed
Yes. If you don\`t use my plugins you can still use this tool to create your topology data, for this you need the path to your topology data in the inventory. For example for my CDP plugin this is _Networking_ -> _CDP Cache_ internally known as `networking` -> `cdp_cache`. The data must form a table in the inventory that contains at least the three columns for the neighbor name, neighbor port, and local port. For these columns you need the internal names. I.e. for my CDP plugin the columns _Neighbor device_, _Neighbor port_ and _Local port_ are known internally as `device_id`, `local_port` and `device_port`. With this information, you can run the tool like this
thl-cmk's avatar
thl-cmk committed

```
thl-cmk's avatar
thl-cmk committed
~/local/bin/network-topology/create_topology_data.py -s Core01 --path-in-inventory "networking,cdp_cache" --inventory-columns "device_id,local_port,device_port"
thl-cmk's avatar
thl-cmk committed
```

thl-cmk's avatar
thl-cmk committed
Wehre `--path-in-inventory` is the path to your inventory data and `--inventory-columns` are the columns used in the order _neighbor_, _local port_, _neighbor port_.
thl-cmk's avatar
thl-cmk committed

</details>

thl-cmk's avatar
thl-cmk committed
---
### Sample Output

Sample output

thl-cmk's avatar
thl-cmk committed
```
thl-cmk's avatar
thl-cmk committed
OMD[build]:~$ ~/local/bin/topology_data/create_topology_data.py -s Core01
thl-cmk's avatar
thl-cmk committed
Start time: 2023-10-16T21:44:53.10
Devices added: 66, source inv_CDP
time taken: 1.035935568/s
End time: 2023-10-16T21:44:54.10

thl-cmk's avatar
thl-cmk committed
```
thl-cmk's avatar
thl-cmk committed

thl-cmk's avatar
thl-cmk committed
Sample network topology
thl-cmk's avatar
thl-cmk committed

![sample output details](/img/sample-details.png?raw=true "sample output details")