我有這個腳本可以根據 Netbox 的輸入從 juniper-devices 執行配置備份。我想稍微擴展此腳本以從瞻博網路設備獲取韌體版本并使用自定義欄位更新我們的 netbox。
#!/usr/bin/python3
import sys,os,getopt
from getpass import getpass
from jnpr.junos import Device
import jnpr.junos.facts
from jnpr.junos.utils.config import Config
from jnpr.junos.exception import *
from lxml import etree
from pprint import pprint
import pynetbox
import datetime
nb = pynetbox.api(url='https://netbox-test/', token='<censored>')
save_path = '/config-backups/'
def printProgress(logtype,hostname,message):
print("%s:%s:%s"%(logtype,hostname,message))
def GetConfig(my_hostname, my_username, my_password):
try:
printProgress("INFO",my_hostname,"Connecting to device")
dev=Device(host=my_hostname,user=my_username,password=my_password)
dev.open(auto_probe=10)
dev.timeout=10
printProgress("INFO",my_hostname,"Retrieving config")
config = dev.rpc.get_config(options={'database':'committed','format':'set'})
junos_version = dev.facts['version']
configbackup = (etree.tostring(config, encoding='unicode', pretty_print=True))
completefilename = os.path.join(save_path, my_hostname ".set.config")
outfile=open(completefilename, "w")
outfile.write(configbackup)
dev.close()
outfile.close()
return True,junos_version
except Exception as err:
printProgress("ERROR",my_hostname,"Encountered exception while backing up config")
printProgress("ERROR",my_hostname,str(err))
return False
def main(argv):
junos_password = ''
try:
opts, args = getopt.getopt(argv,"?u:p:",["username=","password"])
except getopt.GetoptError:
print ('configbackup_junos.py -u <username> [-p <junos admin password>]')
sys.exit(2)
for opt, arg in opts:
if opt == '-?':
print ('configbackup_junos.py -u <username> [-p <junos admin password>]')
sys.exit()
elif opt in ("-u", "--username"):
junos_username = arg
elif opt in ("-p", "--password"):
junos_password = arg
print ('Will attempt to backup junos devices documented in Netbox using username:', junos_username)
if len(junos_password) > 0:
print ('Junos Password set on commandline\n')
else:
print ('password not entered, will ask for it')
junos_password=getpass(prompt="\nPassword: ")
nb_devicelist = nb.dcim.devices.all()
for nb_device in nb_devicelist:
platform = str(nb_device.platform)
pri_ip = str(nb_device.primary_ip)
asset = nb_device.asset_tag
devstatus = str(nb_device.status)
backup_enabled = nb_device.custom_fields['backup_enable']
if nb_device.virtual_chassis:
vchassismaster = str(nb_device.virtual_chassis.master)
else:
vchassismaster = 'no_chassis'
if backup_enabled == 'Yes' and platform == 'Junos' and devstatus == 'Active' and pri_ip != 'None' and asset:
if vchassismaster == (nb_device.name) or vchassismaster == 'no_chassis':
if GetConfig(asset,junos_username,junos_password):
print ("Config Successfully backed up from device.",nb_device)
nb_device.custom_fields['backup_status'] = "OK"
timenow = datetime.datetime.now()
timestamp = timenow.strftime("%Y-%m-d %X")
nb_device.custom_fields['backup_timestamp'] = timestamp
nb_device.save()
print (junos_version)
else:
printProgress ("ERROR",nb_device,"Config backup failed! ")
nb_device.custom_fields['backup_status'] = "FAILED"
nb_device.save()
print("")
if len(sys.argv) == 1:
sys.exit()
if __name__ == "__main__":
main(sys.argv[1:])
我的問題是如何獲取從函式 GetConfig 回傳的變數“junos_version”。如您所見,我已嘗試使用“return True,junos_version”,但是如何在函式的輸出中獲取它?(我已經閱讀了我能找到的所有關于此的文章并嘗試了一些建議,但沒有任何效果。我需要能夠將“junos_version”輸入到這個命令中,
nb_device.custom_fields['firmware_version'] = junos_version
我會在nb_device.save
我懷疑是我的邏輯感在這里失敗了,我只是見樹不見林。
uj5u.com熱心網友回復:
if GetConfig(asset,junos_username,junos_password):
你可以改變這一點:
with flag, junos_version=GetConfig(asset,junos_username,junos_password):
uj5u.com熱心網友回復:
如果從函式回傳多個值,請將它們視為元組。在您的情況下,您可以通過以下方式獲得第二個值:
cfg = GetConfig(...) // add your args
junos_version = cfg[1] // get the 2-nd returned value from a tuple.
uj5u.com熱心網友回復:
首先你得有穩定的回報。
def GetConfig(my_hostname, my_username, my_password):
try:
...
return True,junos_version
except Exception as err:
...
return False
在這里你可以有一個元組(布林值和版本)或一個布林值(真或假)作為回傳。
我將其更改為:
def GetConfig(my_hostname, my_username, my_password):
try:
...
return True,junos_version
except Exception as err:
...
return False, None
因為沒有junos_version例外。
現在您將使用它的代碼更改為:
def main(argv):
...
if GetConfig(asset,junos_username,junos_password):
...
到
def main(argv):
...
cfg, version = GetConfig(asset,junos_username,junos_password)
if cfg:
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/342965.html
上一篇:改進/修復質因數分解函式
