Ajout d'un script netbox et finalisation d'une v0.1 fonctionnel

This commit is contained in:
Dryusdan 2019-07-09 23:57:50 +02:00
parent 43b4cf998e
commit 299b1fc1f1
4 changed files with 255 additions and 98 deletions

142
bridge.py
View file

@ -3,13 +3,12 @@
# -*- coding: utf-8 -*-
# A bridge to set rudder node into netbox
#import pynetbox
import requests, os, random, sys, time, json, logging, argparse, re, shutil
from logging.handlers import RotatingFileHandler
from pprint import pprint
from utils.config import get_parameter, init_log
from utils.netbox import *
config_file = "config.txt"
secrets_filepath = get_parameter("secrets_filepath", config_file)
@ -18,112 +17,65 @@ netbox_url = get_parameter("netbox_url", config_file)
log_filepath = get_parameter("log_filepath", config_file)
log = init_log(log_filepath)
def get_nodes(config):
secrets = get_parameter("secrets_filepath", config)
rudder_token = get_parameter("rudder_token", secrets)
rudder_url = get_parameter("rudder_url", config)
rudder_token = get_parameter("rudder_token", secrets_filepath)
nodes = requests.get(rudder_url+'/rudder/api/latest/nodes', headers={'X-API-Token': rudder_token})
for node in nodes.json()['data']['nodes']:
if check_if_node_exist(node['hostname'], config) == 0:
pprint("Machine not exist: adding")
add_node(node['hostname'], 5, 1, node['ram'], 10, node['machine']['type'], config)
add_netbox_server(node['hostname'], 1, 1, node['ram'], 10, node['machine']['type'], config)
else:
pprint("It's ok, pass")
if node['machine']['type'] == "Virtual":
full_nodes_info = requests.get(rudder_url+'/rudder/api/latest/nodes/'+node['id']+'?include=full', headers={'X-API-Token': rudder_token})
for full_node_info in full_nodes_info.json()['data']['nodes']:
populate_vm(full_node_info, config)
elif node['machine']['type'] == "Physical":
pprint("populate IP")
def check_if_node_exist(node_name, config):
secrets = get_parameter("secrets_filepath", config)
netbox_token = get_parameter("netbox_token", secrets)
netbox_url = get_parameter("netbox_url", config)
node = requests.get(netbox_url+'/api/virtualization/virtual-machines/?name='+node_name, headers={"Authorization": "Token "+netbox_token})
if node.json()['count'] > 0:
return 1
else:
node_physical = requests.get(netbox_url+'/api/dcim/devices/?name='+node_name, headers={"Authorization": "Token "+netbox_token})
if node_physical.json()['count'] > 0:
return 1
else:
return 0
def add_node(name, cluster, vcpu, memory, disk, vm_type, config):
secrets = get_parameter("secrets_filepath", config)
netbox_token = get_parameter("netbox_token", secrets)
netbox_url = get_parameter("netbox_url", config)
if vm_type == "Virtual":
node = requests.post(netbox_url+'/api/virtualization/virtual-machines/', headers={"Authorization": "Token "+netbox_token}, json={
"name": name,
"status": 1,
"cluster": cluster,
"vcpus": vcpu,
"memory": memory,
"disk": disk
})
elif vm_type == "Physical":
node = requests.post(netbox_url+'/api/dcim/devices/', headers={"Authorization": "Token "+netbox_token}, json={
"name": name,
"device_type": 2,
"device_role": 8,
"site": 5,
"status": 1
})
else:
pprint(vm_type)
if node.status_code == 201:
pprint("VM "+name+" added")
else:
pprint("Error durring action for vm "+name)
pprint(node.json())
if node['machine']['type'] == "Virtual":
populate_vm(full_node_info, config)
elif node['machine']['type'] == "Physical":
populate_device(full_node_info, config)
def populate_vm(nodeinfo, config):
secrets = get_parameter("secrets_filepath", config)
netbox_token = get_parameter("netbox_token", secrets)
netbox_url = get_parameter("netbox_url", config)
netbox_token = get_parameter("netbox_token", secrets_filepath)
vm_id = get_netbox_vm_id(nodeinfo['hostname'], config)
pprint(nodeinfo)
for network in nodeinfo["networkInterfaces"]:
pprint(network)
try:
node = requests.post(netbox_url+'/api/virtualization/interfaces/', headers={"Authorization": "Token "+netbox_token}, json={
"virtual_machine": vm_id,
"name": network['name'],
"enabled": 'true',
"mac_address": network['macAddress'],
"description": network['type'],
})
except:
node = requests.post(netbox_url+'/api/virtualization/interfaces/', headers={"Authorization": "Token "+netbox_token}, json={
"virtual_machine": vm_id,
"name": network['name'],
"enabled": 'true',
})
vm_netbox_interface_num = get_netbox_vm_interface_num(nodeinfo['hostname'], config)
vm_rudder_interface_num = len(nodeinfo["networkInterfaces"])
if vm_netbox_interface_num != vm_rudder_interface_num:
delete_all_netbox_vm_interface(nodeinfo['hostname'], config)
for network in nodeinfo["networkInterfaces"]:
add_netbox_vm_interface(network, vm_id, config)
elif vm_netbox_interface_num == vm_rudder_interface_num:
for network in nodeinfo["networkInterfaces"]:
patch_netbox_vm_interface(network, vm_id, config)
for interface in nodeinfo["networkInterfaces"]:
interface_id = get_netbox_vm_interface_id(vm_id, interface['name'], config)
for ip in interface['ipAddresses']:
add_netbox_ip(ip, interface_id, config)
def populate_device(nodeinfo, config):
netbox_token = get_parameter("netbox_token", secrets_filepath)
device_id = get_netbox_device_id(nodeinfo['hostname'], config)
device_netbox_interface_num = get_netbox_device_interface_num(nodeinfo['hostname'], config)
device_rudder_interface_num = len(nodeinfo["networkInterfaces"])
if device_netbox_interface_num != device_rudder_interface_num:
delete_all_netbox_device_interface(nodeinfo['hostname'], config)
for network in nodeinfo["networkInterfaces"]:
add_netbox_device_interface(network, device_id, config)
elif device_netbox_interface_num == device_rudder_interface_num:
for network in nodeinfo["networkInterfaces"]:
patch_netbox_device_interface(network, device_id, config)
for interface in nodeinfo["networkInterfaces"]:
interface_id = get_netbox_device_interface_id(device_id, interface['name'], config)
for ip in interface['ipAddresses']:
add_netbox_ip(ip, interface_id, config)
def get_netbox_vm_id(name, config):
secrets = get_parameter("secrets_filepath", config)
netbox_token = get_parameter("netbox_token", secrets)
netbox_url = get_parameter("netbox_url", config)
node = requests.get(netbox_url+'/api/virtualization/virtual-machines/?name='+name, headers={"Authorization": "Token "+netbox_token})
#return node.json()['results']['id']
for vm in node.json()['results']:
return vm['id']
def get_netbox_device_id():
pprint("device_id")
def get_netbox_network_interface(name, config):
pprint("get_netbox_network_interface")
def add_netbox_network_interface(vm_id, name, config):
pprint("add_netbox_network_interface")
"""
main function of program
"""
def main():
get_nodes(config_file)
"""
Start
"""
main()

View file

@ -20,16 +20,16 @@ def get_parameter( parameter, file_path ):
def init_log(log_filepath):
log = logging.getLogger()
log.setLevel(logging.DEBUG)
log.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s :: %(levelname)s :: %(message)s')
file_handler = RotatingFileHandler(log_filepath, 'a', 1000000, 1)
file_handler.setLevel(logging.DEBUG)
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(formatter)
log.addHandler(file_handler)
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.DEBUG)
stream_handler.setLevel(logging.INFO)
stream_handler.setFormatter(formatter)
log.addHandler(stream_handler)

205
utils/netbox.py Normal file
View file

@ -0,0 +1,205 @@
#!/usr/bin/env python3
# coding: utf-8
# -*- coding: utf-8 -*-
# A netbox set of request
import requests, os, random, sys, time, json, logging, argparse, re, shutil
from utils.config import get_parameter, init_log
from pprint import pprint
config_file = "config.txt"
secrets_filepath = get_parameter("secrets_filepath", config_file)
rudder_url = get_parameter("rudder_url", config_file)
netbox_url = get_parameter("netbox_url", config_file)
netbox_token = get_parameter("netbox_token", secrets_filepath)
log_filepath = get_parameter("log_filepath", config_file)
log = init_log(log_filepath)
def get_netbox_vm_id(name, config):
node = requests.get(netbox_url+'/api/virtualization/virtual-machines/?name='+name, headers={"Authorization": "Token "+netbox_token})
for vm in node.json()['results']:
return vm['id']
def get_netbox_vm_interface_num(name, config):
node = requests.get(netbox_url+'/api/virtualization/interfaces/?virtual_machine='+name, headers={"Authorization": "Token "+netbox_token})
return node.json()['count']
def get_netbox_vm_interface_id(vm_id, interface_name, config):
node = requests.get(netbox_url+'/api/virtualization/interfaces/?name='+interface_name+'&virtual_machine_id='+str(vm_id), headers={"Authorization": "Token "+netbox_token})
for interface in node.json()['results']:
return interface['id']
def get_netbox_device_interface_id(device_id, interface_name, config):
node = requests.get(netbox_url+'/api/dcim/interfaces/?name='+interface_name+'&device_id='+str(vm_id), headers={"Authorization": "Token "+netbox_token})
for interface in node.json()['results']:
return interface['id']
def get_netbox_device_id(name, config):
node = requests.get(netbox_url+'/api/dcim/devices/?name='+name, headers={"Authorization": "Token "+netbox_token})
for device in node.json()['results']:
return device['id']
def get_netbox_device_interface_num(name, config):
node = requests.get(netbox_url+'/api/dcim/interfaces/?device='+name, headers={"Authorization": "Token "+netbox_token})
return node.json()['count']
def get_netbox_device_interface_id(vm_id, interface_name, config):
secrets = get_parameter("secrets_filepath", config)
netbox_token = get_parameter("netbox_token", secrets)
netbox_url = get_parameter("netbox_url", config)
node = requests.get(netbox_url+'/api/dcim/interfaces/?name='+interface_name+'&device_id='+str(vm_id), headers={"Authorization": "Token "+netbox_token})
for interface in node.json()['results']:
return interface['id']
def get_ip_num_by_interface(ip, interface_id, config):
node = requests.get(netbox_url+'/api/ipam/ip-addresses/?address='+ip+'&interface_id='+str(interface_id), headers={"Authorization": "Token "+netbox_token})
return node.json()['count']
def check_if_node_exist(node_name, config):
node = requests.get(netbox_url+'/api/virtualization/virtual-machines/?name='+node_name, headers={"Authorization": "Token "+netbox_token})
if node.json()['count'] > 0:
return 1
else:
node_physical = requests.get(netbox_url+'/api/dcim/devices/?name='+node_name, headers={"Authorization": "Token "+netbox_token})
if node_physical.json()['count'] > 0:
return 1
else:
return 0
def add_netbox_server(name, cluster, vcpu, memory, disk, vm_type, config):
if vm_type == "Virtual":
node = requests.post(netbox_url+'/api/virtualization/virtual-machines/', headers={"Authorization": "Token "+netbox_token}, json={
"name": name,
"status": 1,
"cluster": cluster,
"vcpus": vcpu,
"memory": memory,
"disk": disk
})
elif vm_type == "Physical":
node = requests.post(netbox_url+'/api/dcim/devices/', headers={"Authorization": "Token "+netbox_token}, json={
"name": name,
"device_type": 1,
"device_role": 1,
"site": 1,
"status": 1
})
else:
log.debug("VM type : "+vm_type)
if node.status_code == 201:
log.info("VM "+name+" added")
else:
log.error("Error durring action for vm "+name)
def add_netbox_vm_interface(interface, vm_id, config):
try:
node = requests.post(netbox_url+'/api/virtualization/interfaces/', headers={"Authorization": "Token "+netbox_token}, json={
"virtual_machine": vm_id,
"name": interface['name'],
"enabled": 'true',
"mac_address": interface['macAddress'],
"description": interface['type']
})
except:
node = requests.post(netbox_url+'/api/virtualization/interfaces/', headers={"Authorization": "Token "+netbox_token}, json={
"virtual_machine": vm_id,
"name": interface['name'],
"enabled": 'true'
})
def add_netbox_device_interface(interface, device_id, config):
try:
if interface['speed'] == 1000:
interface_type = 1000
else:
interface_type = 0
except:
interface_type = 0
try:
node = requests.post(netbox_url+'/api/dcim/interfaces/', headers={"Authorization": "Token "+netbox_token}, json={
"device": device_id,
"name": interface['name'],
"enabled": 'true',
"mac_address": interface['macAddress'],
"description": interface['type']
})
except:
node = requests.post(netbox_url+'/api/dcim/interfaces/', headers={"Authorization": "Token "+netbox_token}, json={
"device": device_id,
"name": interface['name'],
"type": interface_type,
"enabled": "true"
})
def add_netbox_ip(ip, interface_id, config):
log.debug("IP : "+ip)
log.debug("Interface ID : "+str(interface_id))
if isinstance(interface_id,int):
if ip != '127.0.0.1':
if get_ip_num_by_interface(ip, interface_id, config) < 2:
node = requests.post(netbox_url+'/api/ipam/ip-addresses/', headers={"Authorization": "Token "+netbox_token}, json={
"address": ip,
"interface": interface_id
})
else:
node = requests.get(netbox_url+'/api/ipam/ip-addresses/?address='+ip+'&interface_id='+str(interface_id), headers={"Authorization": "Token "+netbox_token})
for ip in node.json()['results']:
requests.delete(netbox_url+'/api/ipam/ip-addresses/'+str(ip['id'])+'/', headers={"Authorization": "Token "+netbox_token})
node = requests.post(netbox_url+'/api/ipam/ip-addresses/', headers={"Authorization": "Token "+netbox_token}, json={
"address": ip,
"interface": interface_id
})
else:
node = requests.post(netbox_url+'/api/ipam/ip-addresses/', headers={"Authorization": "Token "+netbox_token}, json={
"address": ip+'/8',
"interface": interface_id,
"role" : 10
})
def patch_netbox_vm_interface(interface, vm_id, config):
interface_id = get_netbox_vm_interface_id(vm_id, interface['name'], config)
try:
node = requests.patch(netbox_url+'/api/virtualization/interfaces/'+str(interface_id)+'/', headers={"Authorization": "Token "+netbox_token}, json={
"virtual_machine": vm_id,
"name": interface['name'],
"enabled": 'true',
"mac_address": interface['macAddress'],
"description": interface['type']
})
except:
node = requests.patch(netbox_url+'/api/virtualization/interfaces/'+str(interface_id)+'/', headers={"Authorization": "Token "+netbox_token}, json={
"virtual_machine": vm_id,
"name": interface['name'],
"enabled": 'true'
})
def patch_netbox_device_interface(interface, device_id, config):
interface_id = get_netbox_vm_interface_id(device_id, interface['name'], config)
try:
node = requests.patch(netbox_url+'/api/dcim/interfaces/'+str(interface_id)+'/', headers={"Authorization": "Token "+netbox_token}, json={
"device_id": device_id,
"name": interface['name'],
"enabled": 'true',
"mac_address": interface['macAddress'],
"description": interface['type']
})
except:
node = requests.patch(netbox_url+'/api/dcim/interfaces/'+str(interface_id)+'/', headers={"Authorization": "Token "+netbox_token}, json={
"device_id": device_id,
"name": interface['name'],
"enabled": 'true'
})
def delete_all_netbox_vm_interface(name, config):
node = requests.get(netbox_url+'/api/virtualization/interfaces/?virtual_machine='+name, headers={"Authorization": "Token "+netbox_token})
for vm in node.json()['results']:
requests.delete(netbox_url+'/api/virtualization/interfaces/'+str(vm['id'])+'/', headers={"Authorization": "Token "+netbox_token})
def delete_all_netbox_device_interface(name, config):
node = requests.get(netbox_url+'/api/dcim/devices/?virtual_machine='+name, headers={"Authorization": "Token "+netbox_token})
for vm in node.json()['results']:
requests.delete(netbox_url+'/api/dcim/interface/'+str(vm['id'])+'/', headers={"Authorization": "Token "+netbox_token})

0
utils/rudder.py Normal file
View file