天天看點

使用Python調用Netconf進行配置

NETCONF簡介:

概述:

NETCONF雖然已經是老技術了,但是一直沒有受到重用,直到最近幾年興起的自動化話運維,NETCONF才重新背推上台面。

網絡配置協定NETCONF(Network Configuration Protocol)提供一套管理網絡裝置的機制,使用者可以使用這套機制增加、修改、删除網絡裝置的配置,擷取網絡裝置的配置和狀态資訊。通過NETCONF協定,網絡裝置可以提供規範的應用程式程式設計接口API(Application Programming Interface),應用程式可以直接使用這些API,向網絡裝置發送和擷取配置。

由于是公有技術,NETCONF常常用于SDN的南向接口,面對不同廠商的裝置。但是公有技術一大缺點便是為了相容各個廠商的産品,會相對私有的REST API複雜一些。

NETCONF協定:

NETCONF(Network Configuration Protocol)是基于可擴充标記語言XML(Extensible Markup Language)的網絡配置和管理協定,使用簡單的基于RPC(Remote Procedure Call)機制實作用戶端和伺服器之間通信。用戶端可以是腳本或者網管上運作的一個應用程式。伺服器是一個典型的網絡裝置。

NETCONF提供了一種通過運作網絡管理軟體的中心計算機(即網絡管理工作站)來遠端管理和監控裝置的方法。其優點如下:

NETCONF協定以XML格式定義消息,運用RPC機制修改配置資訊,這樣既能友善管理配置資訊,又能滿足來自不同制造商裝置之間的互操作性:

  1. 可減少由于人工配置錯誤引起的網絡故障。
  2. 可提高使用配置工具更新系統軟體的效率。
  3. 擴充性好,不同制造商裝置可以定義自己的協定操作,以實作獨特的管理功能。
  4. NETCONF提供了認證、鑒權等安全機制,保證了消息傳遞的安全。

NETCONF與SNMP類比:

使用Python調用Netconf進行配置
  1. SNMP的MIB表,在NETCONF中類似為YANG模型(也是樹狀)。而SNMP中SMI,則對應着YANG。
  2. NETCONF是使用XML來傳輸配置資訊,并且相對于SNMP,其是基于SSH和TCP協定,而非UDP。

YANG是專門為NETCONF協定設計的資料模組化語言,用來為NETCONF協定設計可操作的配置資料、狀态資料模型、遠端調用(RPCs)模型和通知機制等。

YANG資料模型定位為一個面向機器的模型接口,明确定義資料結構及其限制,可以更靈活、更完整的進行資料描述。

NETCONF封包結構:

使用Python調用Netconf進行配置

Netconf實驗:

實驗環境:

一台CSR1000v和YANG SUITE。

YANG SUITE的搭建請參考:https://blog.csdn.net/tushanpeipei/article/details/116838928?spm=1001.2014.3001.5501

實驗目的:

完成CSR1000v的logging伺服器配置。

實驗步驟:

  1. 使用YANG SUITE測試,找到配置logging伺服器的yang檔案,并加載:
    使用Python調用Netconf進行配置
    logging伺服器配置的module是Cisco-IOS-XE-native,是以我們需要加載這個yang module;同時,由于是配置裝置,需要将NETCONF的操作修改為edit-config。
  2. 找到配置的具體節點:
    使用Python調用Netconf進行配置
  3. 生成XML資訊并測試能否進行配置:
    使用Python調用Netconf進行配置
    如果能夠再傳回的資訊裡找到OK/則說明配置成功。
    使用Python調用Netconf進行配置
  4. 下載下傳并儲存python中使用的xml模闆檔案:
    使用Python調用Netconf進行配置
    其payload中的資訊就是我們需要的xml模闆檔案:
    使用Python調用Netconf進行配置
  5. 将測試無誤後的xml模闆修改為jinja2模闆,将security_id和host_address設定為可替換的值,再使用python調用。

    config_syslog.xml如下:

<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native">
    <logging>
      <trap>
        <severity>{{ security_id }}</severity>
      </trap>
      <hostip>{{ host_address }}</hostip>
    </logging>
  </native>
</config>
           

注意點:在修改為模闆時,由于後續本python代碼會添加message資訊,是以這裡僅需要保留Content。并且需要在config标簽後添加:

xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0
           
  1. Python腳本如下:
from jinja2 import Template
from ncclient import manager
from ncclient.operations import RPCError
from pprint import pprint
import lxml.etree as ET
import xmltodict

# jinja2模闆的位置
tem_path = './jinja2/'

# 将具體資訊,擷取傳入模闆中,并傳回替換後的模闆
def netconf_config_syslog(security_id, host):
    with open(tem_path + 'config_syslog.xml') as f:
        netconf_template = Template(f.read())
    netconf_payload = netconf_template.render(security_id=security_id, host_address=host)
    return netconf_payload

# 建構發送的XML資料
def csr_netconf_config(ip, username, password, payload_xml, port='830'):
    # 使用NETCONF用戶端ncclient,連接配接網絡裝置
    with manager.connect(host=ip,
                         port=port,
                         username=username,
                         password=password,
                         timeout=90,
                         hostkey_verify=False,
                         device_params={'name': 'csr'}) as m:

        try:
            # 發送建構的XML資料,到網絡裝置,修改配置(edit_cofig)
            response = m.edit_config(target='running', config=payload_xml).xml
            # 從字元串資料轉換到XML
            data = ET.fromstring(response.encode())
        except RPCError as e:
            data = e._raw

        # 從XML資料,轉換到字元串,并傳回發送的XML資料
        return ET.tostring(data).decode()

# 定義配置logging伺服器的函數,通過調用 csr_netconf_config函數,擷取發送的XML資訊,并發送資訊到目的裝置,并列印傳回結果
def conf_log(device_ip, username, password, security_id, host):
    result_xml = csr_netconf_config(device_ip, username, password, netconf_config_syslog(security_id, host), port='830')
    xmldict = xmltodict.parse(result_xml)
    pprint(xmldict)


if __name__ == '__main__':
    conf_log('192.168.0.88', 'Prin', 'Cisc0123', '7', '192.168.0.100')
           
  1. 傳回結果:
    使用Python調用Netconf進行配置
    在CSR1000v上進行檢查:說明配置成功。
    使用Python調用Netconf進行配置

參考資料來源:現任明教教主