Skip to content

Instantly share code, notes, and snippets.

@zkiroel
Forked from awfki/pynetbox_examples.md
Created March 27, 2021 19:31
Show Gist options
  • Save zkiroel/749bf6715304143da15faabe1af5efb4 to your computer and use it in GitHub Desktop.
Save zkiroel/749bf6715304143da15faabe1af5efb4 to your computer and use it in GitHub Desktop.
pynetbox examples

pynetbox examples

Long time network engineer, did some perl a long time ago and am liking python pretty well but the pynetbox documentation is badly lacking IMO. If I were a python wizard I'm sure it would all be obvious but I'm not and it's really frustrating that more example weren't provided.

Many of the following examples were cadged from various places on the interwebs and HAVE NOT BEEN TESTED.

Prereqs

import pynetbox
NETBOX = 'https://netbox.fq.dn/'
nb = pynetbox.api(NETBOX, get_token('nb'))

get_token() is function that fetches the token from a hidden file in the home dir (~) that's named token_nb. I've added it here as a separate file.

getting things

get all the things

response = nb.dcim.devices.all()
response = nb.ipam.prefixes.all()
response = nb.ipam.ip_addresses.all()
response = nb.ipam.vlans.get(vlanid)
response = nb.dcim.devices.get(serial=tgt_sn)

get list of things that match your query

response_list = nb.dcim.devices.filter(query)
response_list = nb.ipam.prefixes.filter(query)
response_list = nb.ipam.vlans.filter(query)
response_list = nb.tenancy.tenants.filter(query)
response_list = nb.dcim.interfaces.filter(device='DEV_NAME')

deleting things

response = nb.ipam.ip_addresses.get(name=line)
response.delete

renaming things

response = nb.dcim.devices.get(name=old_name)
response.name = new_name
response.save()

adding interface connection

int_a = nb.dcim.interfaces.get(name='xe-4/0/16', device='BLAHSWITCH')
int_b = nb.dcim.interfaces.get(name='eth3', device='BLAHHOST')
nb.dcim.interface_connections.create(
     interface_a=int_a.id,
     interface_b=int_b.id
)

creating things

create a device

netbox.dcim.devices.create(
  name='test',
  device_role=1,
)

create an interface (verified!)

response = nb.dcim.interfaces.create(
    device=721,
    name="Eth1/3",
    form_factor=1200,
    enabled=True,
    )

response is...

{ 'id': 13131, 
  'device': {'id': 721, 'url': 'https://netbox/api/dcim/devices/721/', 
    'name': 'TEST01', 'display_name': 'TEST01'
  }, 
  'name': 'Eth1/3', 
  'form_factor': {'value': 1200, 'label': 'SFP+ (10GE)'}, 
  'enabled': True, 'lag': None, 'mtu': None, 'mac_address': None, 
  'mgmt_only': False, 'description': '', 'is_connected': False, 
  'interface_connection': None, 'circuit_termination': None, 
  'mode': None, 'untagged_vlan': None, 'tagged_vlans': [], 'tags': []
}
# works on *nix systems, Windows users are on their own.
# note: the token_nb file contains the token string and NOTHING else.
import os
def get_token(TARGET):
"""Read token from ~/.token_TARGET."""
"""You should chmod 600 ~/.token_* so that only the owner (and root) can read them."""
token_file = '{}/.token_{}'.format(os.environ['HOME'], TARGET)
try:
with open(token_file) as f:
token = f.read().splitlines()
except IOError as e:
print(("{} config file is missing or cannot be read.".format(TARGET)))
token = None
return str(token[0]).strip()
# -----------------------
# this is another version that includes the is_insecure() function to check that the file is chmod 600.
import os
import stat
def is_insecure(filepath):
"""Check if file is accessible by group or other."""
st = os.stat(filepath)
if st.st_mode & stat.S_IRGRP:
return True
if st.st_mode & stat.S_IWGRP:
return True
if st.st_mode & stat.S_IXGRP:
return True
if st.st_mode & stat.S_IROTH:
return True
if st.st_mode & stat.S_IWOTH:
return True
if st.st_mode & stat.S_IXOTH:
return True
return False
def get_token(TARGET):
"""Read token from ~/.token_TARGET."""
token_file = '{}/.token_{}'.format(os.environ['HOME'], TARGET)
if is_insecure(token_file):
print('Token file is insecure, please chmod 600 {}'.format(token_file))
print('EXITING')
sys.exit(1)
try:
with open(token_file) as f:
token = f.read().splitlines()
token = token[0].strip()
except IOError as e:
print("{} config file is missing or cannot be read.".format(TARGET))
token = None
return token
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment