186 lines
6.2 KiB
Python
186 lines
6.2 KiB
Python
import logging
|
|
import sys
|
|
|
|
import jsonargparse
|
|
import pynetbox
|
|
import requests
|
|
import urllib3
|
|
|
|
|
|
def get_config():
|
|
p = jsonargparse.ArgumentParser(
|
|
default_config_files=[
|
|
"/etc/netbox_agent.yaml",
|
|
"~/.config/netbox_agent.yaml",
|
|
"~/.netbox_agent.yaml",
|
|
],
|
|
prog="netbox_agent",
|
|
description="Netbox agent to run on your infrastructure's servers",
|
|
env_prefix="NETBOX_AGENT_",
|
|
default_env=True,
|
|
)
|
|
p.add_argument("-c", "--config", action=jsonargparse.ActionConfigFile)
|
|
|
|
p.add_argument(
|
|
"-r", "--register", action="store_true", help="Register server to Netbox"
|
|
)
|
|
p.add_argument(
|
|
"-u", "--update-all", action="store_true", help="Update all infos in Netbox"
|
|
)
|
|
p.add_argument("-d", "--debug", action="store_true", help="Print debug infos")
|
|
p.add_argument("--update-network", action="store_true", help="Update network")
|
|
p.add_argument("--update-inventory", action="store_true", help="Update inventory")
|
|
p.add_argument("--update-location", action="store_true", help="Update location")
|
|
p.add_argument("--update-psu", action="store_true", help="Update PSU")
|
|
p.add_argument(
|
|
"--purge-old-devices",
|
|
action="store_true",
|
|
help="Purge existing (old ?) devices having same name but different serial",
|
|
)
|
|
p.add_argument(
|
|
"--expansion-as-device",
|
|
action="store_true",
|
|
help="Manage blade expansions as external devices",
|
|
)
|
|
|
|
p.add_argument("--log_level", default="debug")
|
|
p.add_argument("--netbox.ssl_ca_certs_file", help="SSL CA certificates file")
|
|
p.add_argument("--netbox.url", help="Netbox URL")
|
|
p.add_argument("--netbox.token", help="Netbox API Token")
|
|
p.add_argument(
|
|
"--netbox.ssl_verify",
|
|
default=True,
|
|
action="store_true",
|
|
help="Disable SSL verification",
|
|
)
|
|
p.add_argument(
|
|
"--virtual.enabled", action="store_true", help="Is a virtual machine or not"
|
|
)
|
|
p.add_argument("--virtual.cluster_name", help="Cluster name of VM")
|
|
p.add_argument(
|
|
"--hostname_cmd",
|
|
default=None,
|
|
help="Command to output hostname, used as Device's name in netbox",
|
|
)
|
|
p.add_argument(
|
|
"--device.platform",
|
|
default=None,
|
|
help="Override device platform. Here we use OS distribution.",
|
|
)
|
|
p.add_argument("--device.tags", default=r"", help="tags to use for a host")
|
|
p.add_argument(
|
|
"--preserve-tags",
|
|
action="store_true",
|
|
help="Append new unique tags, preserve those already present",
|
|
)
|
|
p.add_argument(
|
|
"--device.custom_fields",
|
|
default=r"",
|
|
help="custom_fields to use for a host, eg: field1=v1,field2=v2",
|
|
)
|
|
p.add_argument(
|
|
"--device.blade_role", default=r"Blade", help="role to use for a blade server"
|
|
)
|
|
p.add_argument(
|
|
"--device.chassis_role",
|
|
default=r"Server Chassis",
|
|
help="role to use for a chassis",
|
|
)
|
|
p.add_argument(
|
|
"--device.server_role", default=r"Server", help="role to use for a server"
|
|
)
|
|
p.add_argument("--tenant.driver", help="tenant driver, ie cmd, file")
|
|
p.add_argument("--tenant.driver_file", help="tenant driver custom driver file path")
|
|
p.add_argument("--tenant.regex", help="tenant regex to extract Netbox tenant slug")
|
|
p.add_argument(
|
|
"--datacenter_location.driver", help="Datacenter location driver, ie: cmd, file"
|
|
)
|
|
p.add_argument(
|
|
"--datacenter_location.driver_file",
|
|
help="Datacenter location custom driver file path",
|
|
)
|
|
p.add_argument(
|
|
"--datacenter_location.regex",
|
|
help="Datacenter location regex to extract Netbox DC slug",
|
|
)
|
|
p.add_argument("--rack_location.driver", help="Rack location driver, ie: cmd, file")
|
|
p.add_argument(
|
|
"--rack_location.driver_file", help="Rack location custom driver file path"
|
|
)
|
|
p.add_argument(
|
|
"--rack_location.regex", help="Rack location regex to extract Rack name"
|
|
)
|
|
p.add_argument("--slot_location.driver", help="Slot location driver, ie: cmd, file")
|
|
p.add_argument(
|
|
"--slot_location.driver_file", help="Slot location custom driver file path"
|
|
)
|
|
p.add_argument(
|
|
"--slot_location.regex", help="Slot location regex to extract slot name"
|
|
)
|
|
p.add_argument(
|
|
"--network.ignore_interfaces",
|
|
default=r"(dummy.*|docker.*)",
|
|
help="Regex to ignore interfaces",
|
|
)
|
|
p.add_argument(
|
|
"--network.ignore_ips",
|
|
default=r"^(127\.0\.0\..*|fe80.*|::1.*)",
|
|
help="Regex to ignore IPs",
|
|
)
|
|
p.add_argument(
|
|
"--network.ipmi", default=True, help="Enable gathering IPMI information"
|
|
)
|
|
p.add_argument(
|
|
"--network.lldp", help="Enable auto-cabling feature through LLDP infos"
|
|
)
|
|
p.add_argument(
|
|
"--inventory",
|
|
action="store_true",
|
|
help="Enable HW inventory (CPU, Memory, RAID Cards, Disks) feature",
|
|
)
|
|
p.add_argument(
|
|
"--process-virtual-drives",
|
|
action="store_true",
|
|
help="Process virtual drives information from RAID "
|
|
"controllers to fill disk custom_fields",
|
|
)
|
|
p.add_argument(
|
|
"--force-disk-refresh",
|
|
action="store_true",
|
|
help="Forces disks detection reprocessing",
|
|
)
|
|
p.add_argument(
|
|
"--dump-disks-map", help="File path to dump physical/virtual disks map"
|
|
)
|
|
|
|
options = p.parse_args()
|
|
return options
|
|
|
|
|
|
config = get_config()
|
|
|
|
|
|
def get_netbox_instance():
|
|
if config.netbox.url is None or config.netbox.token is None:
|
|
logging.error("Netbox URL and token are mandatory")
|
|
sys.exit(1)
|
|
|
|
nb = pynetbox.api(
|
|
url=get_config().netbox.url,
|
|
token=get_config().netbox.token,
|
|
)
|
|
ca_certs_file = config.netbox.ssl_ca_certs_file
|
|
if ca_certs_file is not None:
|
|
session = requests.Session()
|
|
session.verify = ca_certs_file
|
|
nb.http_session = session
|
|
elif config.netbox.ssl_verify is False:
|
|
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
|
session = requests.Session()
|
|
session.verify = False
|
|
nb.http_session = session
|
|
|
|
return nb
|
|
|
|
|
|
netbox_instance = get_netbox_instance()
|