Ajout d'un script netbox et finalisation d'une v0.1 fonctionnel
This commit is contained in:
parent
43b4cf998e
commit
299b1fc1f1
142
bridge.py
142
bridge.py
|
@ -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()
|
||||
|
|
|
@ -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
205
utils/netbox.py
Normal 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
0
utils/rudder.py
Normal file
Loading…
Reference in a new issue