天天看点

使用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进行配置

参考资料来源:现任明教教主