Device Inventory Search
In version 6.9.0
of the ipfabric
Python SDK a new ipf_device_search
CLI tool was added which searches the
Inventory > Devices
table. After installing the package it can be run from the command line.
Requirements
Required environment variables exported (IPF_URL
and IPF_TOKEN
or IPF_USERNAME & IPF_PASSWORD
) or a
.env
file located in the current working directory or your home directory.
Requires rich
to be installed (pip install rich
or pip install ipfabric[cli]
).
Documentation
# ipf_device_search -h
usage: ipf_device_search.cmd [-h] [-o OPERATOR] [-C] [-a ADD_COLUMNS] [-r REMOVE_COLUMNS] [-A] [-c] [-s SNAPSHOT] [-v] [-j] [-R] search [search ...]
Search the Inventory > Device table and return the results.
positional arguments:
search Search value: 'ipf_device_search rtr1'. Default uses 'hostname' for search. Example for different column: 'ipf_device_search vendor cisco'.
optional arguments:
-h, --help show this help message and exit
-o OPERATOR, --operator OPERATOR
Operator used in searching; default is 'like'.
-C, --csv Export to CSV format.
-a ADD_COLUMNS, --add-columns ADD_COLUMNS
Comma separated list of column names to add to output.
-r REMOVE_COLUMNS, --remove-columns REMOVE_COLUMNS
Comma separated list of column names to remove from output.
-A, --attribute Do a Device Attribute search (operator chosen is applied to both name and value): 'ipf_device_search -A attribute_name attribute_value'.
-b BOX_STYLE, --box-style BOX_STYLE
Table box style (see https://rich.readthedocs.io/en/stable/appendix/box.html#appendix-box for options).
-c, --count Print count of rows instead of the actual data.
-s SNAPSHOT, --snapshot SNAPSHOT
Snapshot to use which can be a UUID or one of ['last', 'prev', 'lastLocked']with or without `$` for *nix compatability.
-v, --verbose Verbose output will enable debugging and print all tables even if no data.
-j, --json Enable JSON output which will also print all tables even if no data.
-R, --rich-disable Disable rich formatting if installed. Useful for sending JSON output to jq.
[
"uptime (float)",
"model (str)",
"reload (str)",
"image (str)",
"domain (str)",
"platform (str)",
"slug (str)",
"hostname (str)",
"fqdn (str)",
"processor (str)",
"sn (str)",
"version (str)",
"vendor (str)",
"family (str)",
"stpDomain|stp_domain (str)",
"hostnameOriginal|hostname_original (str)",
"loginIp|login_ip (str)",
"snHw|sn_hw (str)",
"memoryTotalBytes|mem_total_bytes (float)",
"hostnameProcessed|hostname_processed (str)",
"siteName|site (str)",
"devType|dev_type (str)",
"tsDiscoveryEnd|ts_discovery_end (float)",
"configReg|config_reg (str)",
"rd|routing_domain (str)",
"memoryUsedBytes|mem_used_bytes (float)",
"memoryUtilization|mem_utilization (float)",
"secDiscoveryDuration|sec_discovery_duration (float)",
"loginType|login_type (str)",
"tsDiscoveryStart|ts_discovery_start (float)",
"loginPort|login_port (int)",
"objectId|object_id (str)",
"taskKey|task_key (str)"
]
{
"string": {
"=": "eq",
"!=": "neq",
"i=": "ieq",
"i!=": "nieq",
"~": "like",
"!": "notlike",
"=~": "reg",
"!=~": "nreg",
"i=~": "ireg",
"i!=~": "nireg"
},
"numeric": {
"=": "eq",
"!=": "neq",
">": "gt",
">=": "gte",
"<": "lt",
"<=": "lte"
}
}
For Windows you may be required to escape special characters (& \ < > ^ |
) using a caret ^
("^(10.0.0.1|192.168.0.1)$"
becomes "^^(10.0.0.1^|192.168.0.1)$"
).
Usage
# ipf_device_search l71exR2
Device Inventory
| hostname | siteName | vendor | family | platform | model | version | loginIp | snHw | devType |
|----------|----------|--------|--------|-------------|-------|----------|---------------|---------|---------|
| L71EXR2 | L71 | cisco | ios | i86bi_linux | | 15.5(2)T | 10.71.103.102 | a47ff66 | router |
Filter: {"hostname": ["like", "l71exR2"]}
https://demo1.us.ipfabric.io/inventory/devices?options=%7B%22filters%22%3A%7B%22hostname%22%3A%5B%22like%22%2C%22l71exR2%22%5D%7D%7D
# ipf_device_search -o eq site 35PRODUCTION
Device Inventory
| siteName | hostname | vendor | family | platform | model | version | loginIp | snHw | devType |
|--------------|----------|--------|--------|---------------|-------|-------------------------------------|---------------|---------|----------|
| 35PRODUCTION | L35EXR14 | cisco | ios | i86bi_linux | | 15.5(2)T | 10.35.255.114 | a23ff72 | router |
| 35PRODUCTION | L35AC172 | cisco | ios | i86bi_linuxl2 | | 15.2(20170809:194209) | 10.35.179.186 | a23ffba | switch |
| 35PRODUCTION | L35EXR13 | cisco | ios | i86bi_linux | | 15.5(2)T | 10.35.255.113 | a23ff71 | router |
| 35PRODUCTION | L35SD176 | cisco | ios | i86bi_linuxl2 | | 15.2(CML_NIGHTLY_20150703)FLO_DSGS7 | 10.35.255.168 | a23ffa8 | l3switch |
Filter: {"siteName": ["eq", "35PRODUCTION"]}
https://sa-integrations02a.ash-cloud.ipf.cx/inventory/devices?options=%7B%22filters%22%3A%7B%22siteName%22%3A%5B%22eq%22%2C%2235PRODUCTION%22%5D%7D%7D
# ipf_device_search -o "<" uptime "1 day, 3 hours, and 5 minutes"
Device Inventory
| uptime | hostname | siteName | vendor | family | platform | model | version | loginIp | snHw | devType |
|--------|----------|----------|--------|--------|-------------|-------|----------|-----------|---------|---------|
| 1980 | NL8-R1 | unknown | cisco | ios | i86bi_linux | | 15.5(2)T | 10.1.1.12 | a01010c | router |
Filter: {"uptime": ["lt", 97500]}
https://sa-integrations02a.ash-cloud.ipf.cx/inventory/devices?options=%7B%22filters%22%3A%7B%22uptime%22%3A%5B%22lt%22%2C97500%5D%7D%7D
Attribute Searching
Specified Operator is applied to both the Attribute Name and Value during searches.
# ipf_device_search -A -o ireg "mgmt_ip|test" "10.72.255.16|TEST|foobar" -r version,model,platform
Device Inventory
| attributes | hostname | siteName | vendor | family | loginIp | snHw | devType |
|-----------------------------------|-----------------------------|--------------|----------|-----------|---------------|------------------|---------|
| MGMT_IP=10.72.255.162 | L72AC11 | L72 | cisco | ios | 10.72.129.162 | a48ffa2 | switch |
| MGMT_IP=10.72.255.161 | L72AC24 | L72 | cisco | ios | 10.72.119.161 | a48ffa1 | switch |
| MGMT_IP=foobar,TEST=test_some_vrf | L35FW1 | 35HEADOFFICE | cisco | asa | 10.35.253.43 | 9AMSST2E75V | fw |
| MGMT_IP=10.72.255.163 | L72AC12 | L72 | cisco | ios | 10.72.129.163 | a48ffa3 | switch |
| TEST=TEST | L71FW5_hasAVeryLongHostname | L71 | fortinet | fortigate | 10.71.109.105 | FOSVM1QWZRUM4EB7 | fw |
Filtered URLs do not support Attributes so no link is provided.
Formatting
Modifying Columns
# ipf_device_search -o ireg version "6\.0\.\d*,BUILD" -a reload -r devType
Device Inventory
| version | hostname | siteName | vendor | family | platform | model | loginIp | snHw | reload |
|-----------------|-----------------------|----------|----------|-----------|--------------|-------|---------------|------------------|--------|
| 6.0.5,build0268 | L71FW9/root | L71 | fortinet | fortigate | fortigate-vm | | 10.71.111.110 | FOSVM1HHJXBISQD7 | None |
| 6.0.4,build0231 | L71FW13-HA1/root | L71 | fortinet | fortigate | fortigate-vm | | 10.71.106.115 | FOSVM1_ELPNYXP69 | None |
| 6.0.5,build0268 | L71FW9/ipf | L71 | fortinet | fortigate | fortigate-vm | | 10.71.255.110 | FOSVM1HHJXBISQD7 | None |
| 6.0.4,build0231 | L71FW13-HA1/mrjohnson | L71 | fortinet | fortigate | fortigate-vm | | 10.71.106.115 | FOSVM1_ELPNYXP69 | None |
Filter: {"version": ["ireg", "6\\.0\\.\\d*,BUILD"]}
https://sa-integrations02a.ash-cloud.ipf.cx/inventory/devices?options=%7B%22filters%22%3A%7B%22version%22%3A%5B%22ireg%22%2C%226%5C%5C.0%5C%5C.%5C%5Cd%2A%2CBUILD%22%5D%7D%7D
JSON Output
If using JSON output disable rich
with the -R|--rich-disable
flag prior to sending to jq
.
# ipf_device_search l71exR2 -j -R | jq .
[
{
"hostname": "L71EXR2",
"siteName": "L71",
"vendor": "cisco",
"family": "ios",
"platform": "i86bi_linux",
"model": "",
"version": "15.5(2)T",
"loginIp": "10.71.103.102",
"snHw": "a47ff66",
"devType": "router"
}
]
CSV Output
# ipf_device_search l71exR2 -C
"Hostname","Site","Vendor","Family","Platform","Model","Version","Login IP","Serial Number","Type"
"L71EXR2","L71","cisco","ios","i86bi_linux","","15.5(2)T","10.71.103.102","a47ff66","router"