設備管理模塊在任何一個自動化框架中都是必備的欺殿,原生的Nornir采用YAML文件存儲設備信息烟号,YAML文件是序列化的數(shù)據(jù)結(jié)構(gòu)蒋困,編寫非常繁瑣卷中,因為是樹形結(jié)構(gòu)矛双,如果有幾十臺甚至上百臺設備,yaml文件就會變得十分臃腫蟆豫,難以閱讀议忽。為了簡化和降低設備信息維護的難度,本文對Nornir的設備管理插件進行了重新設計十减,從表格中把資產(chǎn)載入inventory,每條記錄就是一臺設備栈幸,不僅容易維護,還可以遷移進數(shù)據(jù)庫帮辟,有了很大的靈活性和可移植性速址。
??首先來講一下思路,其實思路很簡單由驹,這實際上就是一個簡單的逆向工程加上官方手冊的簡單指導芍锚。我們先熟悉一下SimpleInventory類的代碼,然后找到重點荔棉,切入要點闹炉,邊寫,邊測润樱,邊改渣触。
我們觀察源碼發(fā)現(xiàn),這個類有兩個方法:
1壹若、第一個是初始化init方法嗅钻,是指定了三種yaml文件的路徑,然后加載成為一個path對象店展;
2养篓、第二個是load方法,返回一個Inventory對象赂蕴,這個對象由三個重要的參數(shù)構(gòu)建柳弄,分別是hosts,groups和defaults概说。groups和defaults個人感覺用處不是很大碧注,網(wǎng)上的很多案例把一些路由域、位置糖赔、廠商等信息放入groups中萍丐,按group批量定制一些參數(shù)、創(chuàng)建一些配置放典,在這里我把這些參數(shù)都整合進了hosts中逝变。
??通過以上分析基茵,我們主要從init和load方法入手:
1、利用init方法將設備字段進行整形壳影,初始化一個參數(shù)devices拱层,這個參數(shù)是一個字典列表,最終構(gòu)建了一個self.devices,用于load方法,其中connection_options包含了一個global_delay_factor延遲因子和secret密碼态贤,時間因子主要用于調(diào)整超時時間的場景舱呻,在實際場景中,有些網(wǎng)絡設備距離比較遠悠汽,有的網(wǎng)絡設備性能比較差箱吕,就會引起通信耗時較長,執(zhí)行命令耗時較長的情況柿冲,導致netmiko超時茬高,這個時候我們就可以調(diào)整延遲因子,延長超時時間假抄,secret密碼主要是用于cisco設備的特權密碼怎栽,直接上源碼:
def __init__(
self,
devices: List[dict],
) -> None:
"""
根據(jù)devices的字典列表加載所有的網(wǎng)絡設備
:param devices:
網(wǎng)絡設備信息字典列表數(shù)據(jù)結(jié)構(gòu)如下:
[{'hostsname':'192.168.1.1','username':'admin','password':'admin','port':22,'platform':'cisco_ios',
'device_type':'router'}]
"""
host_info = ['hostname', 'username', 'password', 'port', 'platform', 'ip']
reshape_devices = []
for device in devices:
reshape_device = {
'data': {},
}
for k, v in device.items():
if k in host_info:
reshape_device[k] = v
else:
reshape_device['data'][k] = v
reshape_device['connection_options'] = {
'netmiko': {'extras': {'global_delay_factor': device.get('global_delay_factor'),
'secret': device.get('secret')}}}
reshape_devices.append(reshape_device)
self.devices = reshape_devices
經(jīng)過初始化后的設備信息長這個樣子:
host_info = {
'hostname': '192.168.1.1',
'username': 'admin',
'password': 'admin',
# 其他字段省略
'connection_options': {
'netmiko': {
'extras': {
'global_delay_factor': 1,
'secret': 'admin'
}
}
}
}
2、從上面的分析看宿饱,在load方法中熏瞄,groups和defaults參數(shù)用處不大,因此可以刪除相關代碼谬以,化繁為簡强饮,重點關注hosts參數(shù),原生的代碼將yaml文件轉(zhuǎn)換成字典为黎,定制代碼直接使用初始化后的字典邮丰;
3、注冊我們定制的插件
完成inventory的插件定制后铭乾,還需要把插件注冊到nornir才可以使用
小結(jié)
這篇文章主要介紹了nornir表格資產(chǎn)插件的定制過程剪廉,該插件輔助《IP地址資源管理系統(tǒng)》(另一篇文章有介紹)使用,與數(shù)據(jù)庫對接炕檩。為了方便使用和學習斗蒋,我另外寫了一個demo,使用excel表格管理設備笛质,定制了一個抓取設備ARP表的任務吹泡,格式化寫入excel表格,源碼地址:https://gitee.com/mobiledj/net-dev-ops.git,運行源碼需要安裝以下庫:
pip install nornir
pip install netmiko
pip install nornir_netmiko
pip install nonir_utils
pip install pandas