选择区域语言: EN CN HK

使用NETCONF配置设备操作指导书-6W103

手册下载

使用NETCONF配置设备操作指导书

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Copyright © 2018 新华三技术有限公司 版权所有,保留一切权利。

非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。

除新华三技术有限公司的商标外,本手册中出现的其它公司的商标、产品标识及商品名称,由各自权利人拥有。

本文档中的信息可能变动,恕不另行通知。


 

1 NETCONF简介·· 1

1.1 NETCONF协议结构·· 1

1.2 NETCONF报文格式·· 2

1.2.1 NETCONF· 2

1.2.2 NETCONF over SOAP· 4

2 NETCONF配置任务简介·· 7

3 选择NETCONF客户端并确定客户端与设备的连接方式·· 8

3.1 NETCONF配置方式简介·· 8

3.2 连接方式介绍·· 9

4 在设备上为NETCONF用户设置权限·· 10

4.1 确定NETCONF用户需要的权限·· 10

4.2 定义NETCONF用户角色规则·· 11

4.3 配置NETCONF用户属性·· 11

5 在设备上进行连接方式相关配置·· 12

5.1 选用NETCONF over SSH连接方式·· 12

5.1.1 配置SSH登录·· 12

5.1.2 配置NETCONF over SSH· 13

5.2 选用NETCONF over SOAP over HTTPNETCONF over SOAP over HTTPS连接方式·· 14

6 NETCONF客户端与设备建立连接·· 14

6.1 配置限制和指导·· 14

6.2 NETCONF方式·· 15

6.3 NETCONF over SOAP方式·· 15

7 构造NETCONF请求·· 16

7.1 NETCONF API文档介绍·· 16

7.1.1 文档组织·· 16

7.1.2 文档内容说明·· 17

7.2 使用NETCONF API文档构造NETCONF请求·· 18

7.3 构造NETCONF请求示例·· 19

7.4 Comware V7中支持的NETCONF操作类型·· 20

8 使用XML工具简单验证构造的XML正确性·· 29

9 正式下发配置指令·· 32

10 关闭NETCONF会话·· 32

11 NETCONF典型配置举例·· 32

11.1 通过NETCONF配置DHCP服务器和DHCP客户端·· 32

11.1.1 组网需求·· 32

11.1.2 Device A上配置NETCONF功能·· 33

11.1.3 通过NETCONF客户端配置DHCP服务器·· 33

11.1.4 Device B上通过CLI配置DHCP客户端功能·· 39

11.1.5 验证配置·· 39

11.2 基于ncclient工具的NETCONF over SSH配置举例·· 39

11.2.1 组网需求·· 39

11.2.2 组网图·· 40

11.2.3 配置步骤·· 40

 


NETCONF简介

NETCONFNetwork Configuration Protocol,网络配置协议)是一种基于XML的网络管理协议,它提供了一种可编程的、对网络设备进行配置和管理的方法。用户可以通过该协议设置参数、获取参数值、获取统计信息等。

NETCONF报文使用XML格式,具有强大的过滤能力,而且每一个数据项都有一个固定的元素名称和位置,这使得同一厂商的不同设备具有相同的访问方式和结果呈现方式,不同厂商之间的设备也可以经过映射XML得到相同的效果,这使得它在第三方软件的开发上非常便利,很容易开发出在混合不同厂商、不同设备的环境下的特殊定制的网管软件。在这样的网管软件的协助下,使用NETCONF功能会使网络设备的配置管理工作,变得更简单更高效。

1.1  NETCONF协议结构

NETCONF协议采用分层结构,分为内容层(Content)、操作层(Operations)、RPCRemote Procedure Call,远程调用)层和通信协议层(Transport Protocol)。

表1 XML分层与NETCONF分层模型对应关系

NETCONF分层

XML分层

说明

内容层

配置数据、状态数据、统计信息等

被管理对象的集合,可以是配置数据、状态数据、统计信息等

NETCONF协议具体可读写的数据请参见《NETCONF XML API 手册》

操作层

<get>,<get-config>,<edit-config>

RPC中应用的基本的原语操作集,这些操作组成NETCONF的基本能力

NETCONF全面地定义了对被管理设备的各种基础操作,如getget-configget-bulkedit-config操作等

设备支持的操作请参见“7.4  Comware V7中支持的NETCONF操作类型

RPC

<rpc>,<rpc-reply>

RPC模块的编码提供了简单的、传输协议无关的机制。通过使用<rpc><rpc-reply>元素分别对NETCONF请求和响应数据(即操作层和内容层的内容)进行封装

通信协议层

FIPS模式下:Console/Telnet/SSH/HTTP/HTTPS/TLS

FIPS模式下:

Console/SSH/HTTPS/TLS

NETCONF提供面向连接的、可靠的、顺序的数据链路。

FIPS模式下:

·     NETCONF支持TelnetSSHConsoleCLI登录方式/协议,即NETCONF over SSHNETCONF over TelnetNETCONF over Console

·     NETCONF支持HTTPHTTPS协议,即NETCONF over HTTPNETCONF over HTTPS

·     NETCONF支持封装成SOAPSimple Object Access Protocol,简单对象访问协议)报文后通过HTTPHTTPS协议传输,即NETCONF over SOAP over HTTPNETCONF over SOAP over HTTPS

FIPS模式下:

·     NETCONF支持SSHConsoleCLI方式/协议,即NETCONF over SSHNETCONF over Console

·     NETCONF支持HTTPS登录协议,即NETCONF over HTTPS

·     NETCONF支持封装成SOAP报文后通过HTTPS协议传输,即NETCONF over SOAP over HTTPS

 

1.2  NETCONF报文格式

通信协议层不进行SOAP封装时的报文格式我们称为NETCONF格式。通信协议层进行SOAP封装时的报文格式我们称为NETCONF over SOAP格式。

1.2.1  NETCONF

NETCONF命令必须符合XML语言的基本格式。NETCONF报文格式遵循RFC 4741/RFC 6241

1. 请求格式

请求分为协议定义、H3C自有两个部分,其格式如下:

·     协议定义部分:即RFC 4741/RFC 6241中规定的部分。其中:

¡     encoding表示使用的XML编码格式。Comware V7 NETCONF支持GB2312GB18030UTF-8UTF-16UTF-16BEUTF-16LEUTF-32UTF-32BEUTF-32LE编码格式。如果请求中没有携带声明部分(即<?xml version="1.0" encoding="utf-8"?>)指定XML编码格式,则默认使用UTF-8编码格式。

¡     message-id表示消息ID。客户端使用单调递增的整数来表示消息ID。服务器端在应答中会使用相同的消息ID以表示应答对应的请求。

¡     协议部分的命名空间必须为urn:ietf:params:xml:ns:netconf:base:1.0

<?xml version="1.0" encoding="utf-8"?>

<rpc message-id =”101” xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”>

  <operation>

</rpc>

·     H3C自有部分:对于get系列操作filter元素下的内容H3C自有部分对于edit-config系列操作,config元素下的内容H3C自有部分

¡     H3C自有部分需要使用H3C命名空间,H3C命名空间又分为baseconfigdataaction命名空间

Base命名空间:http://www.h3c.com/netconf/base:1.0

Config命名空间:http://www.h3c.com/netconf/config:1.0

Data命名空间:http://www.h3c.com/netconf/data:1.0

Action命名空间:http://www.h3c.com/netconf/action:1.0

具体使用哪个命名空间与操作类型和内容有关,可参见“7.4  Comware V7中支持的NETCONF操作类型”部分描述。

¡     H3C自有部分可以以top元素为起点,也可以以具体模块为起点。是否使用top元素由netconf capability specific-namespace命令进行配置。缺省使用top元素,命名空间位于top元素之后,各模块共用命名空间。配置netconf capability specific-namespace命令后不再需要使用top元素,命名空间位于模块名之后,各模块专用自己的命名空间。模块专用的命名空间定义方式为H3C命名空间-模块名,例如,接口管理模块的data命名空间为http://www.h3c.com/netconf/data:1.0-Ifmgr

¡     “模块信息”部分的内容由NETCONF API文档定义。

get-config的例子(使用共有命名空间

<?xml version="1.0" encoding="utf-8"?>

<rpc message-id=”101” xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”>

  <get-config>

    <source>

      <running/>

    </source>

    <filter type=”subtree”>

      <top xmlns=”http://www.h3c.com/netconf/config:1.0”>

        模块信息

      </top>

    </filter>

  </get-config>

</rpc>

edit-config的例子使用共有命名空间

<?xml version="1.0" encoding="utf-8"?>

<rpc message-id =”101” xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”>

  <edit-config>

    <target>

      <running/>

    </target>

    <config xmlns:xc=”urn:ietf:params:xml:ns:netconf:base:1.0”>

      <top xmlns=”http://www.h3c.com/netconf/config:1.0”>

        模块信息

      </top>

    </config>

  </edit-config>

</rpc>

2. 应答格式

统一为协议RFC 4741定义的<rpc-reply>,如:

<?xml version="1.0" encoding="utf-8"?>

<rpc-reply xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0” message-id=”101”>

  <ok/>

</rpc-reply>

3. NETCONF请求示例

如下为一个NETCONF报文示例,用于获取设备上所有接口的所有参数:

·     使用共有命名空间时:

<?xml version="1.0" encoding="utf-8"?>

<rpc message-id ="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

  <get-bulk>

    <filter type="subtree">

      <top xmlns="http://www.h3c.com/netconf/data:1.0">

        <Ifmgr>

          <Interfaces>

            <Interface/>

          </Interfaces>

        </Ifmgr>

      </top>

    </filter>

  </get-bulk>

</rpc>

·     使用专用命名空间时:

<?xml version="1.0" encoding="utf-8"?>

<rpc message-id ="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

  <get-bulk>

    <filter type="subtree">

        <Ifmgr xmlns="http://www.h3c.com/netconf/data:1.0-Ifmgr">

          <Interfaces>

             <Interface/>

          </Interfaces>

        </Ifmgr>

    </filter>

  </get-bulk>

</rpc>

1.2.2  NETCONF over SOAP

1. SOAP语法

一条SOAP消息包含以下元素:

·     Envelope元素:必选,用来将XML文档标识为一条SOAP消息。

·     Header元素:可选,包含头部信息。

·     Body元素:必选,包含所有的调用和响应信息。

·     Fault元素:可选,提供在处理此消息时发生错误的信息。

NETCONF over SOAP之后,NETCONF报文会放在SOAP报文的BODY元素里,这些报文除了需要遵循纯NETCONF报文的规则外,还需要遵循以下规则:

·     SOAP消息必须用XML来编码。

·     SOAP消息必须使用SOAP Envelope命名空间,包括http://schemas.xmlsoap.org/soap/envelope/http://www.w3.org/2003/05/soap-envelope两种。不同设备支持的命名空间不同,请以设备的实际情况为准。

·     SOAP消息不能包含DTDDocument Type Definition,文件类型定义)引用。

·     SOAP消息不能包含XML处理指令。

2. NETCONF over SOAP报文格式

Hello报文格式为:

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">

  <env:Header>

    <auth:Authentication env:mustUnderstand="1" xmlns:auth="http://www.h3c.com/netconf/base:1.0">

      <auth:UserName>test</auth:UserName>

      <auth:Password>test</auth:Password>

      <auth:Language>zh-cn</auth:Language>

    </auth:Authentication>

  </env:Header>

  <env:Body>

    <hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

      <capabilities>

        <capability>urn:ietf:params:netconf:base:1.0</capability>

      </capabilities>

    </hello>

  </env:Body>

</env:Envelope>

NETCONF over SOAP请求的格式为:

<env:Envelope xmlns:env=”http://schemas.xmlsoap.org/soap/envelope/”>

  <env:Header>

    <auth:Authentication env:mustUnderstand=”1” xmlns:auth=”http://www.h3c.com/netconf/base:1.0”>

      <auth:AuthInfo>10027c2abebdb482633f847102fbc890d22a</auth:AuthInfo>

      <auth:Language>en</auth:Language>

    </auth:Authentication>

  </env:Header>

  <env:Body>

    <rpc message-id=”101” xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”>

      <get-config>

        <source>

          <running/>

        </source>

         <filter type=”subtree”>

           <top xmlns=”http://www.h3c.com/netconf/config:1.0”>

             <Syslog/>

           </top>

        </filter>

      </get-config>

    </rpc>

  </env:Body>

</env:Envelope>

NETCONF over SOAP报文格式中:

·     Envelope元素:固定格式,在该元素中需要指定Envelope命名空间。

·     Header元素:携带认证、使用的语言等信息。

¡     认证信息:发送Hello建立连接时,NETCONF客户端在请求消息中携带auth:UserNameauth:Password,将认证用户名和密码发送给设备。如果认证成功,则设备在应答消息中返回登录成功的凭据(auth:AuthInfo)。后续基于该连接的NETCONF请求必须携带该凭据。

Authentication元素必须使用命名空间http://www.h3c.com/netconf/base:1.0,必须具有http://www.w3.org/2003/05/soap-envelope命名空间下的mustUnderstand属性,且属性值必须为1或者true

¡     使用的语言:在请求消息中通过auth:Language设置客户端期望的返回错误信息使用的语言。目前支持中文(zh-cn)和英文(en)两种语言。如果未指定,则表示使用英文。

并不是所有的请求消息都支持返回中文错误提示信息,应答消息中通过xml:lang="en"表明实际使用的语言。

auth:Language必须携带在auth:UserNameauth:Passwordauth:AuthInfo之后。

·     Body元素:携带的内容为NETCONF报文。

说明

NETCONF over SOAP报文格式与NETCONF报文格式类似。下文如无特殊情况,均以NETCONF报文为例,说明报文构造方法。将NETCONF报文封装到NETCONF over SOAP报文的Body元素中,即可构造出对应的NETCONF over SOAP报文。

 

3. SOAP请求示例

如下为一个NETCONF over SOAP报文示例,用于获取设备上所有接口的所有参数:

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">

  <env:Header>

    <auth:Authentication env:mustUnderstand="1" xmlns:auth="http://www.h3c.com/netconf/base:1.0">

      <auth:AuthInfo>800207F0120020C</auth:AuthInfo>

    </auth:Authentication>

  </env:Header>

  <env:Body>

    <rpc message-id ="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

      <get-bulk>

        <filter type="subtree">

          <top xmlns="http://www.h3c.com/netconf/data:1.0">

            <Ifmgr>

              <Interfaces>

                <Interface/>

              </Interfaces>

            </Ifmgr>

          </top>

        </filter>

      </get-bulk>

    </rpc>

  </env:Body>

</env:Envelope>

NETCONF配置任务简介

使用NETCONF客户端对接并配置设备的主要过程如1所示。

图1 使用NETCONF配置设备流程图

 

提示

除上述方法外,用户也可以在Python上安装ncclient库,利用已有或用户自行开发的Python IDEIntegrated Development Environment,集成开发环境),通过ncclient库将较为直观地Python脚本语言转化为Netconf报文,对Netconf客户端(设备)进行配置和管理,以简化网络配置脚本语言的编写。

 

选择NETCONF客户端并确定客户端与设备的连接方式

3.1  NETCONF配置方式简介

用户可通过以下方式来使用NETCONF配置和管理设备:

·     通过TelnetSSHConsole登录到设备并进入XML视图,将合法的NETCONF报文(1.2.1  NETCONF节所描述格式)直接拷贝、粘贴到命令行提示符处执行,即可实现对设备的配置和管理。

说明

XML视图下进行NETCONF配置时,NETCONF报文最后需要添加“]]>]]>”结束符,否则设备无法识别。

 

·     通过HTTPHTTPS登录到设备的Web页面,系统会自动将Web页面的配置转换成NETCONF指令下发给设备来实现对设备的配置和管理。该方式通过简洁易用的图像化Web页面上完成配置,配置结果也会以简洁清晰的方式呈现给用户,整个NETCONF的交互过程对用户透明。

·     使用配置工具与设备建立连接并向设备下发NETCONF指令来实现对设备的配置和管理。配置工具可以分为以下两类:

¡     SSH配置工具:该类配置工具与设备建立SSH连接后,可下发NETCONF格式(即1.2.1  NETCONF节所描述格式)报文配置和管理设备。

¡     SOAP配置工具:该类配置工具通过HTTP/HTTPS与设备建立连接,并将NETCONF指令用SOAP封装成通用格式的报文后发送给设备,因此需要使用1.2.2  NETCONF over SOAP节所描述格式使用该方式前设备上必须开启NETCONF over SOAP功能。

SOAP配置工具使用短连接,SSH配置工具使用长连接。因此,SSH配置工具具有较高的效率,但对设备和客户端的资源消耗较高。

综上,实际应用中使用NETCONF配置设备时主要采用配置工具的方式。客户可以开发和定制自己专用的配置工具软件,也可以使用第三方开发的配置工具。第三方的配置工具有:

·     SSH配置工具:NETCONF Browser

·     SOAP配置工具:SOAP UI等。

关于各配置工具的使用方法,请参见配置工具的配置指导。

3.2  连接方式介绍

H3C设备目前支持如下连接方式:

FIPS模式下:

·     NETCONF over SSH

·     NETCONF over Telnet

·     NETCONF over Console

·     NETCONF over HTTP

·     NETCONF over HTTPS

·     NETCONF over SOAP over HTTP

·     NETCONF over SOAP over HTTPS

FIPS模式下:

·     NETCONF over SSH

·     NETCONF over Console

·     NETCONF over HTTPS

·     NETCONF over SOAP over HTTPS

不同配置方式使用的连接方式不同:

·     使用Telnet登录到设备并进入XML视图即建立NETCONF over Telnet连接。

·     使用Console登录到设备并进入XML视图即建立NETCONF over Console连接。建议尽量不使用NETCONF over Console方式,因Console口的速度限制,且XML视图下不输出提示、告警信息,比较容易出现错误。

·     使用HTTPHTTPS登录到设备的Web页面进行配置时,Web使用NETCONF over HTTPNETCONF over HTTPs连接方式与设备交互配置信息交互过程对用户透明,本文后续不再介绍。通过Web配置设备的支持情况与产品型号有关,请以设备的实际情况为准。

·     使用SSH配置工具或使用SSH登录到设备进入XML视图执行NETCONF配置时需要使用NETCONF over SSH连接方式。

·     使用SOAP配置工具下发NETCONF指令配置设备时,需要使用NETCONF over SOAP over HTTPNETCONF over SOAP over HTTPS方式。

说明

本文重点介绍通过NETCONF over SSHNETCONF over SOAP over HTTPNETCONF over SOAP over HTTPS配置工具与设备建立连接,其他连接方式不再介绍

 

在设备上为NETCONF用户设置权限

使用配置工具与设备建立NETCONF连接前,需要确保NETCONF用户具有对应的操作权限。

4.1  确定NETCONF用户需要的权限

Comware V7系统中,用户的权限通过它所属的角色的权限来控制,角色的权限主要包括规则和资源策略两个方面。

在规则方面,NETCONF用户角色需要如下权限:

·     执行NETCONF操作需要具有执行XML元素NETCONF RPC节点的权限,不同NETCONF操作需要的权限不同,具体请参见2

·     执行NETCONF操作内容的权限可以通过用户执行XML元素具体模块及其表Xpath权限控制,例如配置用户具有执行XML元素接口模块的权限,需要执行rule number permit read write execute xml-element ifmgr/命令。

在资源策略方面,可以根据实际需要配置用户角色操作接口、VLANVPN、安全域的权限。缺省情况下,用户具有操作所有资源的权限。

缺省用户角色network-adminmdc-admincontext-admin可操作对应设备/MDC/Context的所有功能和资源(除安全日志文件管理相关命令display security-logfile summaryinfo-center security-logfile directorysecurity-logfile save之外)的权限,如果用户所属角色是这几种,则不需要进行权限配置,只需要指定用户角色为network-adminmdc-admincontext-admin即可。

更多关于用户角色权限控制的内容,请参见“基础配置指导”中的“RBAC”。

表2 执行NETCONF操作需要配置的权限

执行的NETCONF操作

需要配置的权限节点

需要配置的权限

建立NETCONF会话

不涉及

执行xml命令的权限

从设备订阅事件

rpc/create-subscription

execute

给当前配置加锁

rpc/lock

execute

给当前配置解锁

rpc/unlock

execute

使用<get>获取信息

rpc/get

read

使用<get>获取系统支持的事件流

rpc/get/filter/netconf

read

使用<get>获取NETCON状态信息

rpc/get/filter/netconf-state

read

使用<get-bulk>获取信息

rpc/get-bulk

read

使用<get-config>获取配置信息

rpc/get-config

read

使用<get-bulk-config>获取配置信息

rpc/get-bulk-config

read

使用<get-schema>获取yang文件信息

rpc/get-schema

read

<edit-config>编辑指定模块数据

rpc/edit-config

write

执行一个<action>操作

rpc/action

execute

配置保存

rpc/save

write

配置回滚

rpc/rollback

write

配置加载

rpc/load

write

命令行操作

rpc/CLI

write

获取会话信息

rpc/get-sessions

read

关闭另一个会话

rpc/kill-session

execute

执行语法验证

rpc/validate

read

 

4.2  定义NETCONF用户角色规则

(1)     进入系统视图。

system-view

(2)     创建用户角色,并进入用户角色视图。

role name role-name

(3)     请根据需要配置用户操作权限的规则。

¡     配置用户具有执行XML元素NETCONF RPC节点的权限。

rule number  permit { execute | read | write } * xml-element rpc/

通过rule number permit { execute | read | write } * xml-element rpc/?可以查看具体操作的列表。不指定具体操作时,表示所有操作。

¡     配置用户执行XML元素具体模块的权限。

rule number { deny | permit } { execute | read | write } * xml-element [ module-xpath ]

通过rule number { deny | permit } { execute | read | write } * xml-element 可以查看具体模块列表,通过rule number { deny | permit } { execute | read | write } * xml-element module-name/可以查看模块中具体表的列表。不指定具体模块和表时表示所有模块/所有表。

4.3  配置NETCONF用户属性

1. 配置限制和指导

本文采用新建本地用户介绍配置过程。使用远端认证用户的配置方式请参见具体认证方式的配置指导,只要使通过认证的NETCONF用户满足以下两个条件:

·     使用NETCONF over SSH连接方式时,服务类型为SSH使用NETCONF over SOAP over HTTP连接方式时,服务类型为HTTP。使用NETCONF over SOAP over HTTPS连接方式时,服务类型为HTTPS

·     具有所需权限。

2. 配置步骤

(1)     进入系统视图。

system-view

(2)     添加设备管理类本地用户,并进入设备管理类本地用户视图。

local-user user-name class manage

(3)     设置本地用户的密码。

(非FIPS模式)

password [ { hash | simple } string ]

FIPS模式)

password

在非FIPS模式下,可以不为本地用户设置密码;在FIPS模式下,必须且只能通过交互式方式设置明文密码,否则用户的本地认证不能成功。

(4)     设置本地用户可以使用的服务类型。请根据连接方式选择其中一项进行配置

¡     使用NETCONF over SSH连接方式:

service-type ssh

¡     使用NETCONF over SOAP over HTTPNETCONF over SOAP over HTTPS连接方式:

(非FIPS模式)

service-type { http | https } *

FIPS模式)

service-type https

缺省情况下,本地用户不能使用任何服务类型。

(5)     设置本地用户的角色。

authorization-attribute user-role role-name

在设备上进行连接方式相关配置

5.1  选用NETCONF over SSH连接方式

5.1.1  配置SSH登录

以下配置步骤只介绍采用password方式认证SSH客户端的配置方法,publickey方式的配置方法及SSH的详细介绍,请参见“安全配置指导”中的“SSH”。

(1)     进入系统视图。

system-view

(2)     生成本地密钥对。

(非FIPS模式)

public-key local create { dsa | ecdsa [ secp192r1 | secp256r1 | secp384r1 | secp521r1 ] | rsa } [ name key-name ]

FIPS模式)

public-key local create { dsa | ecdsa [ secp256r1 | secp384r1 | secp521r1 ] | rsa } [ name key-name ]

(3)     (可选)创建SSH用户,并指定SSH用户的服务类型为NETCONF,认证方式为password

ssh user username service-type netconf authentication-type password

(4)     进入VTY用户线或VTY用户线类视图。

¡     进入VTY用户线视图。

line vty first-number [ last-number ]

¡     进入VTY用户线类视图。

line class vty

(5)     配置VTY用户线的认证方式为scheme方式。

(非FIPS模式)

authentication-mode scheme

缺省情况下,VTY用户线的认证方式为password方式。

FIPS模式)

authentication-mode scheme

缺省情况下,VTY用户线的认证方式为scheme方式。

5.1.2  配置NETCONF over SSH

(1)     进入系统视图。

system-view

(2)     开启NETCONF over SSH

netconf ssh server enable

缺省情况下,NETCONF over SSH处于关闭状态。

(3)     配置NETCONF over SSH的监听端口。

netconf ssh server port port-number

缺省情况下,NETCONF over SSH的监听端口为830

(4)     (可选)开启NETCONF日志功能。

netconf log source { all | { agent | soap | web } * } { protocol-operation { all | { action | config | get | set | session | syntax | others } * } | row-operation | verbose }

缺省情况下,NETCONF日志功能处于关闭状态。

(5)     通过SSH配置工具与设备建立NETCONF over SSH会话。关于SSH配置工具的使用方法,具体参见SSH配置工具的配置指导。

5.2  选用NETCONF over SOAP over HTTPNETCONF over SOAP over HTTPS连接方式

1. 功能简介

使用NETCONF over SOAP over HTTPNETCONF over SOAP over HTTPS连接方式时,配置工具将配置指令封装成SOAP报文后通过HTTPHTTPS协议传输到设备。

2. 配置限制和指导

本文仅介绍基本配置,有关SOAP报文的DSCP优先级、NETCONF客户端访问控制、NETCONF用户使用的认证域等相关内容请参见产品对应版本的NETCONF配置、NETCONF命令手册。

3. 开启NETCONF over SOAP功能

(1)     进入系统视图。

system-view

(2)     开启NETCONF over SOAP功能。

(非FIPS模式)

netconf soap { http | https } enable

FIPS模式)

netconf soap https enable

缺省情况下,NETCONF over SOAP处于关闭状态。

(3)     (可选)开启NETCONF日志功能。

netconf log source { all | { agent | soap | web } * } { protocol-operation { all | { action | config | get | set | session | syntax | others } * } | row-operation | verbose }

缺省情况下,NETCONF日志功能处于关闭状态。

(4)     通过配置工具与设备建立NETCONF over SOAP会话。关于配置工具的使用方法,具体参见配置工具的配置指导。

NETCONF客户端与设备建立连接

6.1  配置限制和指导

建立NETCONF会话后,客户端需要先与设备进行能力集交互,完成能力集的交互后,设备才会处理客户端发送的其他请求。能力集的表示形式为URIUniform Resource Identifier,统一资源标识符),例如“urn:ietf:params:netconf:base:1.0”。客户端支持的能力集以客户端实际情况为准。客户端发送Hello报文时,请根据实际情况指定能力集。本文以客户端指定能力集urn:ietf:params:netconf:base:1.0为例进行举例。

多个用户同时配置设备时,可能会导致用户配置与配置结果不一致,因此,请避免多个用户同时配置设备。

设备同一时间内允许建立的最大会话数可以通过aaa session-limit命令配置,关于该命令的详细描述,请参见“安全配置指导”中的“AAA”。用户数超过上限后,新登录的用户将登录失败。

6.2  NETCONF方式

适用于NETCONF over SSH配置工具的方式。

1. 客户端向设备发送Hello

客户端收到设备发送的能力集协商报文后,需要给设备发送如下格式的报文,告知设备客户端支持哪些NETCONF能力集。

Hello协商报文格式如下:

<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

  <capabilities>

    <capability>urn:ietf:params:netconf:base:1.0</capability>

 </capabilities>

</hello>

说明

一个<capability></capability>选项对中只能填写一个能力集可以使用多个<capability></capability>选项对,配置多个能力集

 

2. 设备向客户端回复能力集

<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

  <capabilities>

    <capability>urn:ietf:params:netconf:base:1.0</capability>

    更多能力集显示略,以设备的实际回复为准

    <capability>http://www.h3c.com/netconf/action:1.0-Configuration?module=Configuration&amp;revision=2015-05-07</capability>

  </capabilities>

  <session-id>1</session-id>

</hello>

<capabilities></capabilities>之间的内容表示设备支持的能力集,以具体设备实际情况为准。

<session-id></session-id>之间的内容表示为本次会话分配的会话ID,用来唯一标识本次会话。

6.3  NETCONF over SOAP方式

适用于NETCONF over SOAP配置工具的方式。

1. 客户端向设备发送Hello

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">

  <env:Header>

    <auth:Authentication env:mustUnderstand="1" xmlns:auth="http://www.h3c.com/netconf/base:1.0">

      <auth:UserName>test</auth:UserName>

      <auth:Password>test</auth:Password>

      <auth:Language>zh-cn</auth:Language>

    </auth:Authentication>

  </env:Header>

  <env:Body>

    <hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

      <capabilities>

        <capability>urn:ietf:params:netconf:base:1.0</capability>

      </capabilities>

    </hello>

  </env:Body>

</env:Envelope>

说明

一个<capability></capability>选项对中只能填写一个能力集可以使用多个<capability></capability>选项对,配置多个能力集

 

2. 设备向客户端回复能力集

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">

   <env:Header>

      <auth:Authentication env:mustUnderstand="true" xmlns:auth="http://www.h3c.com/netconf/base:1.0">

         <auth:AuthInfo>100002fbf58da6797490a3ef11142d879212</auth:AuthInfo>

      </auth:Authentication>

   </env:Header>

   <env:Body>

      <hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

         <capabilities>

            <capability>urn:ietf:params:netconf:base:1.0</capability>

            更多能力集显示略,以设备的实际回复为准

            <capability>http://www.h3c.com/netconf/action:1.0-Configuration?module=Configuration&amp;revision=2015-05-07</capability>

         </capabilities>

         <session-id>2</session-id>

      </hello>

   </env:Body>

</env:Envelope>

<capabilities></capabilities>之间的内容表示设备支持的能力集,以具体设备实际情况为准。

<session-id></session-id>之间的内容表示为本次会话分配的会话ID,用来唯一标识本次会话。

构造NETCONF请求

7.1  NETCONF API文档介绍

7.1.1  文档组织

NETCONF API文档分属于三个命名空间:

·     data命名空间:提供系统的运行状态数据和配置数据,为只读,支持下发getget-bulk操作。

·     config命名空间提供系统的配置数据信息,可读写,支持下发get-configget-bulk-configedit-config操作。

·     action命名空间:通常提供系统非配置类的操作和运行状态数据(如pingreset操作),可读写,支持下发action操作。

每一个支持NETCONF的模块都包括一个或者多个NETCONF API文档,分别描述其在data命名空间、config命名空间和action命名空间支持的功能。文档命名遵循如下格式,其中XXX代表模块名:

·     data命名空间:Comware V7 XXX NETCONF XML API Data Reference.docx

·     config命名空间:Comware V7 XXX NETCONF XML API Configuration Reference.docx

·     action命名空间:Comware V7 XXX NETCONF XML API Action Reference.docx

7.1.2  文档内容说明

每一个NETCONF API文档对应一个功能模块,如ARPDHCP。每个模块由一个或者多个表组成。表以行和列的形式进行组织:

·     行:表示一个对象实例。

·     列:表示每个对象实例中包含的信息。

ARP表为例,一条ARP表项为一行,ARP表项中的IP地址、MAC地址、所属VLAN等为列。

NETCONF API文档中,每个表包含下面几个部分的信息:

·     表名称:提供了从模块开始的路径和最终的表名,如:ACL/Base

·     表的XML结构(XML structure):列举了本表从模块开始的XML表示方式,但不包括值信息,例如:

 

·     表描述(Table description):提供模块名称、表名称、表类型、行名称和约束信息。其中,表类型取值包括:

¡     Multi-instance table:多实例表格,表示该表可以包含多行。

¡     Single-instance table:单实例表格,表示该表能包括一行

·     列详细信息(Columns):提供列名称、列描述、列数据类型和约束条件等信息。列数据类型取值包括:

¡     Index:表示该列为表格的索引列。

¡     N/A:表示该列不作为索引列。

·     应答的XML结构(Responsed XML structure):列举了本表从模块开始应答消息的XML表示方式,但不包括值信息。客户端可以依据返回结果来判断操作执行的效果。action命名空间可以返回操作结果的表提供此信息。例如:

 

·     应答列详细信息(Responsed columns):用来描述应答XML结构中的各列。

提示

Comware V7 NETCONF API文档描述的是全集,需要结合设备的XSD文件来查看当前设备的支持情况。设备可能不支持某些功能、某些表格或某些列。

 

7.2  使用NETCONF API文档构造NETCONF请求

NETCONF请求构造方法为:

(1)     构造XML请求的协议定义部分,即top外层的部分。

get操作为例,top以外的部分为协议定义部分,可以直接从现有请求或者本文档拷贝。

<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

  <get>

    <filter>

      <top xmlns="http://www.h3c.com/netconf/data:1.0">

          指定模块,子模块,表名,列名

      </top>

    </filter>

  </get>

</rpc>

其他操作的协议定义部分格式,请参见“7.4  Comware V7中支持的NETCONF操作类型”。

(2)     构造top元素。

top元素的格式通常为:<top xmlns="http://www.h3c.com/netconf/data:1.0">。其中,http://www.h3c.com/netconf/data:1.0H3C自定义的命名空间,需要根据需要设置为dataconfigaction命名空间,即data:1.0也可根据需要设置为config:1.0action:1.0

(3)     构造模块操作部分。

拷贝NETCONF API文档中表格XML结构到“指定模块,子模块,表名,列名”部分,然后依据实际情况删除不需要的列或者为已知列赋值。

7.3  构造NETCONF请求示例

config命名空间中ARP模块的ArpConfig表用来配置ARP表项,其XML结构如2所示。该表中包括ARP表项的IP地址、MAC地址、所属VPN实例、所属VLAN、出接口、表项类型信息。

图2 ARP/ArpConfig表的XML结构

 

通过NETCONF创建公网中IP地址为1.1.1.1MAC地址为1-1-1、所属VLANVLAN 10、出接口索引为20的静态ARP表项时,需要采用edit-config:merge操作。该操作使用的XML请求为:

<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">

  <edit-config>

    <target>

      <running/>

    </target>

    <config>

      <top xmlns="http://www.h3c.com/netconf/config:1.0" xc:operation="merge">

        <ARP>

          <ArpConfig>

            <Config>

              <VrfIndex>0</VrfIndex>

              <Ipv4Address>1.1.1.1</Ipv4Address>

              <MacAddress>00-01-00-01-00-02</MacAddress>

              <VLANID>10</VLANID>

              <PortIndex>20</PortIndex>

              <ArpType>1</ArpType>

            </Config>

          </ArpConfig>

        </ARP>

      </top>

    </config>

  </edit-config>

</rpc>

7.4  Comware V7中支持的NETCONF操作类型

Comware V7平台对NETCONF标准协议做了一些修订,删除了不常用的操作,增加部分新的操作,如3所示。

表3 NETCONF协议支持的操作

操作

说明

XML格式样例

get

获取数据,包括运行状态数据和配置数据

获取Syslog模块的全部数据的XML请求如下:

<rpc message-id ="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:h3c="http://www.h3c.com/netconf/base:1.0">

  <get>

    <filter type="subtree">

      <top xmlns="http://www.h3c.com/netconf/data:1.0">

        <Syslog>

        </Syslog>

      </top>

    </filter>

  </get>

</rpc>

get-config

获取配置数据,和get不同,它只返回非缺省的配置数据。如果未配置数据,则返回一个空的<data>

获取接口表内所有配置的XML请求如下:

<rpc message-id ="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:h3c="http://www.h3c.com/netconf/base:1.0">

  <get-config>

    <source>

      <running/>

    </source>

    <filter type="subtree">

      <top xmlns="http://www.h3c.com/netconf/config:1.0">

        <Ifmgr>

           <Interfaces>

              <Interface/>

            </Interfaces>

        </Ifmgr>

      </top>

    </filter>

  </get-config>

</rpc>

get-bulk

从指定索引的下一条开始批量获取后续N条数据(索引行数据不返回),包括运行状态数据和配置数据。用户通过index属性指定索引,通过count属性指定N。如未指定索引,则以第一条为索引;如未指定N,或者数据表中符合条件的数据记录不足N条,则返回表中所有剩下的数据条目

get操作会返回所有符合条件的数据,这在某些情况下会导致效率问题。get-bulk允许用户从固定数据项开始,向后获取指定条目的数据记录

取全部接口的数据的xml请求如下:

<rpc message-id ="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:h3c ="http://www.h3c.com/netconf/base:1.0">

  <get-bulk>

    <filter type="subtree">

      <top xmlns="http://www.h3c.com/netconf/data:1.0">

        <Ifmgr>

          <Interfaces h3c:count="5">

            <Interface/>

          </Interfaces>

        </Ifmgr>

      </top>

    </filter>

  </get-bulk>

</rpc>

get-bulk-config

从指定索引的下一条批量获取配置数据。和get-config类似,只返回非默认配置;其他约束类似get-bulk

获取全部接口配置信息的xml请求如下:

<rpc message-id ="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

  <get-bulk-config>

    <source>

      <running/>

    </source>

    <filter type="subtree">

      <top xmlns="http://www.h3c.com/netconf/config:1.0">

        <Ifmgr>

        </Ifmgr>

      </top>

    </filter>

  </get-bulk-config>

</rpc>

edit-config增量下发

增量下发选项incremental放置在列上,对于类似vlan permitlist列表集合性质的列,可能支持增量下发,用户请求XML中有增量下发选项时,最终执行结果不影响本列原有的数据。

增量下发只支持edit-config,但不支持edit-config中的replace

不是所有模块都支持增量下发,具体请参见模块对应的NETCONF XML API,查找其是否支持增量下发

下发一个接口的VLAN配置,使用增量下发,262接口原有untagvlanlist1215,下发后为1101215XML请求如下:

<rpc message-id ="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:h3c="http://www.h3c.com/netconf/base:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">

  <edit-config>

    <target>

      <running/>

    </target> 

    <config>

      <top xmlns="http://www.h3c.com/netconf/config:1.0" xc:operation="merge">

        <VLAN>

          <HybridInterfaces>

            <Interface>

              <IfIndex>262</IfIndex>

              <UntaggedVlanList  h3c: incremental="true">1-10</UntaggedVlanList>

               </Interface>

          </HybridInterfaces>

        </VLAN>

      </top>

    </config>

  </edit-config>

</rpc>

edit-config: merge

在当前运行配置的基础上直接运行指定配置

merge操作必须指定具体的操作对象(行):

·     如果指定的对象存在,则直接配置该对象

·     如果指定的对象不存在,但允许创建,则先创建再配置该对象

·     如果指定的对象不存在且不允许创建,则返回merge失败

BufferSize设置为120xml请求如下:

<rpc message-id ="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"  xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">

  <edit-config>

    <target>

      <running/>

    </target>

    <config>

      <top xmlns="http://www.h3c.com/netconf/config:1.0" xc:operation="merge">

        <Syslog>

           <LogBuffer>

             <BufferSize>120</BufferSize>

          </LogBuffer>

        </Syslog>

      </top>

    </config>

  </edit-config>

</rpc>

edit-config: create

创建指定对象。create操作必须指定配置对象。create操作的XML数据格式和merge类似,只是operation属性需要指定为“create

·     如果当前配置表支持创建对象,且当前对象不存在,则先创建配置对象,再创建指定的配置

·     如果配置对象下对应的配置项已经存在,则返回data-exist错误

同上,把merge修改为create即可

edit-config: replace

·     如果指定的对象存在,则替换指定对象的配置为当前配置

·     如果指定的对象不存在,但允许创建,则先创建再配置该对象为当前配置

·     如果指定对象不存在且不允许创建,则不进行replace操作,返回invalid-value错误,提示用户配置对象不存在

同上,把merge修改为replace即可

edit-config: remove

删除指定配置

·     当指定的删除对象中只有表索引时,则删除此配置指定对象的所有配置,同时删除指定对象

·     当指定的删除对象中不仅仅有表索引还存在配置项时,则删除此对象下面的指定配置

·     如果系统中指定对象不存在,或者XML消息未指定对象,则直接返回成功

同上,把merge修改为remove即可

edit-config: delete

删除指定配置

·     当指定的删除对象中只有表索引时,则删除此配置指定对象的所有配置,同时删除指定对象

·     当指定的删除对象中不仅仅有表索引还存在配置项时,则删除此对象下面的指定配置

·     如果系统中指定对象不存在,则直接返回不存在的错误消息

同上,把merge修改为delete即可

edit-config 默认操作选项

edit-config操作用于修改当前系统配置。NETCONF定制了四种修改配置的方式:mergecreatedeletereplace。当XML消息中未指定修改配置方式的时候,则使用默认操作做为当前指令的操作方式,不会修改默认操作的缺省值

默认操作的缺省值是merge,在XML消息中可以通过<default-operation>节点来设置默认操作,取值为:

·     merge:当配置方式和默认操作方式均未指定时,使用该方式

·     replace:当配置方式未指定,默认操作指定为replace的时候,edit-config操作会默认为replace操作

·     none:当配置方式未指定,默认操作指定为none的时候,edit-config操作会默认为none操作。none操作主要用来检查,下发为none操作的配置仅仅做Schema校验,不进行真正的配置下发。语法检查通过,就返回ok成功,否则失败

下发一个空的操作,该操作仅仅验证格式,并不真正下发给系统,xml请求如下:

<rpc message-id ="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">

  <edit-config>

    <target>

      <running/>

    </target>

    <default-operation>none</default-operation>

    <config>

      <top xmlns="http://www.h3c.com/netconf/config:1.0">

        <Ifmgr>

          <Interfaces>

            <Interface>

              <IfIndex>262</IfIndex>

              <Description>222222</Description>

            </Interface>

          </Interfaces>

        </Ifmgr>

      </top>

    </config>

  </edit-config>

</rpc>

edit-config默认错误处理选项

edit-config将指定的配置设置到系统上,完成配置设置的操作。在执行edit-config的过程中,如果遇到一个实例配置出错,默认情况下会直接返回错误,但是为了使我们的应用更加灵活,edit-config为我们提供了错误选项,通过错误选项取值的不同,在发生错误的时候进行不同的处理操作

<error-option>节点用于设置一个实例配置出错后,后续实例配置的处理方式,缺省值为stop-on-error,全部取值为:

·     stop-on-error:停止处理,返回错误。此选项为默认选项

·     continue-on-error:继续处理,但是报告错误

·     rollback-on-error:停止并回滚配置

下发两个接口的配置,当下发第一个接口的配置发生错误时,继续进行下一个接口配置的下发,XML请求如下:

<rpc message-id ="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">

  <edit-config>

    <target>

      <running/>

    </target>

    <error-option>continue-on-error</error-option>

    <config>

      <top xmlns="http://www.h3c.com/netconf/config:1.0" xc:operation="merge">

        <Ifmgr>

          <Interfaces>

            <Interface>

              <IfIndex>262</IfIndex>

              <Description>222</Description>

                <ConfigSpeed>1024</ConfigSpeed>

                <ConfigDuplex>1</ConfigDuplex>

            </Interface>

            <Interface>

              <IfIndex>263</IfIndex>

              <Description>333</Description>

                <ConfigSpeed>1024</ConfigSpeed>

                <ConfigDuplex>1</ConfigDuplex>

            </Interface>

          </Interfaces>

        </Ifmgr>

      </top>

    </config>

  </edit-config>

</rpc>

edit-config测试处理选项

在真正执行edit-config操作时,可指定一个测试选项,使用<test-option>节点来决定当前配置是否真正下发。该节点的缺省值为test-then-set,全部取值为:

·     test-then-set:如果没有错误则将配置设置到系统

·     set:将配置设置到系统

·     test-only:只测试,并不下发配置到系统。语法检查通过,就返回ok成功,否则失败

下发一个接口的配置,仅测试,XML请求如下:

<rpc message-id ="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">

  <edit-config>

    <target>

      <running/>

    </target> 

    <test-option>test-only</test-option>

    <config>

      <top xmlns="http://www.h3c.com/netconf/config:1.0" xc:operation="merge">

        <Ifmgr>

          <Interfaces>

            <Interface>

              <IfIndex>262</IfIndex>

              <Description>222</Description>

                <ConfigSpeed>2</ConfigSpeed>

                <ConfigDuplex>1</ConfigDuplex>

               </Interface>

          </Interfaces>

        </Ifmgr>

      </top>

    </config>

  </edit-config>

</rpc>

action

下发非配置数据的设置动作,比如,reset操作

清除全部接口的统计信息,XML请求如下:

<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

  <action>

    <top xmlns="http://www.h3c.com/netconf/action:1.0">

      <Ifmgr>

        <ClearAllIfStatistics>

          <Clear>

          </Clear>

        </ClearAllIfStatistics>

      </Ifmgr>

    </top>

  </action>

</rpc>

lock

锁保护的是配置数据,即edit-config中可以指定的那些模块的配置数据,其他操作不受锁的限制

NETCONF锁仅仅保护NETCONF 会话,不保护SNMP等其他请求下发的配置

禁止NETCONF会话修改设备的当前配置,XML请求如下:

<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

 <lock>

    <target>

        <running/>

    </target>

</lock>

</rpc>

unlock

取消锁保护

当会话结束时锁也会被自动释放

取消锁保护,允许NETCONF会话修改设备的当前配置:

<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

<unlock>

    <target>

        <running/>

    </target>

</unlock>

</rpc>

get-

sessions

获取当前系统中所有NETCONF会话的信息(不能指定sessions-ID

获取当前系统中所有NETCONF会话的信息:

<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

<get-sessions/>

</rpc>

close-

session

关闭当前NETCONF会话,并释放锁和这个session用到的内部资源(如内存等),退出XML视图

关闭当前NETCONF会话,并释放锁和这个session用到的内部资源(如内存等),退出XML视图

<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

<close-session/>

</rpc>

kill-

session

关闭其他NETCONF会话,不支持关闭用户自己的NETCONF会话

关闭session-id1NETCONF会话:

<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

  <kill-session>

    <session-id>1</session-id>

  </kill-session>

</rpc>

CLI

执行命令行的命令。请求消息将命令行语句封装在<CLI>标签中,命令行输出信息被封装在<CLI>标签中返回

CLI支持ConfigurationExecution方式执行命令行:

·     Execution:在用户视图下执行命令行

·     Configuration:在系统视图下执行命令行。使用该方式时需要指定exec-use-channel的属性:

¡     false:不使用channel方式执行命令行

¡     true:使用临时channel执行命令行,执行完成后,自动关闭该channel

¡     persist:使用保留channel执行命令行。使用该方式时,则需要执行Open-channel操作打开当前对话的channel;使用完成后,执行Close-channel关闭Channel。如果未执行Open-channel操作,则系统将自动打开channel;如果未执行关闭保留channel操作,再次使用保留channel时,系统在上次最后执行的命令行所在视图再次执行命令行

·     对于其他视图下命令,则需要在Configuration下先指定进子视图的命令,再指定配置命令

一个NETCONF会话只能打开一个保留channel,可以打开多个临时channel

不支持执行交互式命令

使用channel方式执行命令行时,不支持执行quit命令退出用户视图

在系统视图下不使用channel方式执行telnet server enable命令:

<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

  <CLI>

     <Configuration exec-use-channel="false">telnet server enable</Configuration>

  </CLI>

</rpc>

save

保存系统运行配置。save操作可以使用子元素<file>来指定保存的配置文件名称。当save操作中不存在子元素<file>列时,则设备会自动将当前运行配置保存到主用下次启动配置文件中。OverWrite属性用来判断当指定的配置文件名存在时,当前配置是否覆盖原配置文件并保存成功。Binary-only属性用来只保存当前使用的二进制配置文件

将设备当前配置保存到文件test.cfg中:

<rpc message-id="100"

xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

  <save OverWrite="false" Binary-only="true">

    <file>test.cfg</file>

  </save>

</rpc>

load

配置加载。<load>操作执行后,指定文件中的配置会被合并到设备的当前配置中

将文件a1.cfg中的配置合并到设备的当前配置中:

<rpc message-id="100"

xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

  <load>

    <file>a1.cfg</file>

  </load>

</rpc>

rollback

配置回滚。<rollback>操作必须使用子元素<file>来指定需要回滚的配置文件名称<rollback>操作执行后,当前系统运行配置会被完全替换为指定文件中所描述的配置

将设备当前配置回退到文件1A.cfg中配置的状态:

<rpc message-id="100"

xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

  <rollback>

    <file>1A.cfg</file>

  </rollback>

</rpc>

 

使用XML工具简单验证构造的XML正确性

在下发请求前,建议先利用XSD使用工具验证下请求的XML设备是否支持,是否存在格式问题。本文使用Altova XMLSpy来验证XML是否正确,也可以使用其他支持XML验证的工具。

(1)     把设备XSD文件拷贝出来,放在一个目录中。XSD文件随软件版本发布。

(2)     新建XML文件,将待验证NETCONF报文粘贴到该XML文件里。

图3 新建XML文件

 

(3)     点击XML—〉Check Formedness菜单验证XML格式是否良好。如果有XML格式问题,请根据下发Messages处提示信息修改。

图4 验证XML格式是否良好

 

(4)     根据XSD文件验证报文是否合法。点击DTD/Schema —〉 Assign Schema菜单,选择main.xsd

图5 选择XSD文件

 

(5)     点击XML—〉Validate XML菜单验证XML是否合法。如果Messages处有错误提示,请根据提示进行修改。修改完成后再次验证,直到通过验证。

图6 验证XML是否合法(合法时)

 

图7 验证XML是否合法(不合法时)

 

正式下发配置指令

使用XSD验证XML报文正确后,即可正式通过配置工具下发配置指令。

10  关闭NETCONF会话

1. 客户端发送报文

<rpc message-id=”101” xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”>

   <close-session/>

</rpc>

2. 结果验证

设备向客户端应答如下报文,但此时由于关闭了会话,客户端可能收不到此报文。

<?xml version=”1.0” encoding=”UTF-8” ?>

<rpc-reply message-id=”101”

xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”>

   <ok/>

</rpc-reply>

11  NETCONF典型配置举例

11.1  通过NETCONF配置DHCP服务器和DHCP客户端

11.1.1  组网需求

在主机上安装NETCONF客户端软件,通过NETCONF配置Device A作为DHCP服务器、Device B作为DHCP客户端。DHCP服务器可以为DHCP客户端分配以下网络参数:

·     网段10.1.1.0/24内的IP地址。

·     IP地址租约为1天。

·     网关地址为10.1.1.1

·     DNS服务器地址为10.1.1.10

图8 通过NETCONF配置DHCP服务器组网图

 

11.1.2  Device A上配置NETCONF功能

(1)     开启NETCONF over SOAP功能

# 开启NETCONF over SOAP功能。

<DeviceA> system-view

[DeviceA] netconf soap http enable

(2)     配置用户admin可以通过NETCONF操作DHCP和接口管理Ifmgr模块

# 创建用户角色dhcp-ifmgr-vlan,指定该用户角色可以读、写、执行DHCPIfmgr模块的XML元素。

[DeviceA] role name dhcp-ifmgr-vlan

[DeviceA-role-dhcp-ifmgr-vlan] rule 1 permit command xml

[DeviceA-role-dhcp-ifmgr-vlan] rule 2 permit read write execute xml-element rpc/

[DeviceA-role-dhcp-ifmgr-vlan] rule 3 permit read write execute xml-element dhcp/

[DeviceA-role-dhcp-ifmgr-vlan] rule 4 permit read write execute xml-element ifmgr/

[DeviceA-role-dhcp-ifmgr-vlan] rule 5 permit read write execute xml-element vlan/

[DeviceA-role-dhcp-ifmgr-vlan] quit

# 创建设备管理类本地用户admin,设置其密码为admin、服务类型为HTTP

[DeviceA] local-user admin

[DeviceA-luser-manage-admin] password simple admin

[DeviceA-luser-manage-admin] service-type http

# 配置为用户admin授权的用户角色为dhcp-ifmgr-vlan

[DeviceA-luser-manage-admin] authorization-attribute user-role dhcp-ifmgr-vlan

11.1.3  通过NETCONF客户端配置DHCP服务器

(1)     配置NETCONF客户端软件,配置方法请参见客户端软件相关指导,具体配置过程略。

(2)     Device A发送Hello

# TestCase-DHCP中添加步骤HelloXML内容如下。其中,用户名为admin,密码为admin。所有步骤窗口中的URL地址均需要设置为:http://192.168.1.121/soap/netconf/

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">

   <env:Header>

      <auth:Authentication env:mustUnderstand="1" xmlns:auth="http://www.h3c.com/netconf/base:1.0">

         <auth:UserName>admin</auth:UserName>

         <auth:Password>admin</auth:Password>

         <auth:Language>en</auth:Language>

      </auth:Authentication>

   </env:Header>

   <env:Body>

      <hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

         <capabilities>

            <capability>urn:ietf:params:netconf:base:1.0</capability>

         </capabilities>

      </hello>

   </env:Body>

</env:Envelope>

# 接收到的应答消息中,auth:AuthInfo100001ac479ef0988d587b74e787a0917f69。后续的请求报文都需要携带该认证信息。

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">

   <env:Header>

      <auth:Authentication env:mustUnderstand="true" xmlns:auth="http://www.h3c.com/netconf/base:1.0">

         <auth:AuthInfo>100001ac479ef0988d587b74e787a0917f69</auth:AuthInfo>

      </auth:Authentication>

   </env:Header>

   <env:Body>

      <hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

         <capabilities>

            <capability>urn:ietf:params:netconf:base:1.0</capability>

            ...省略若干capability...

         </capabilities>

         <session-id>1</session-id>

      </hello>

   </env:Body>

</env:Envelope>

(3)     获取接口GigabitEthernet1/0/1GigabitEthernet1/0/2的接口索引值。

# 创建步骤GetIfINdex,向Device A发送请求获取接口索引值。

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">

   <env:Header>

         <auth:Authentication env:mustUnderstand="true" xmlns:auth="http://www.h3c.com/netconf/base:1.0">

         <auth:AuthInfo>100001ac479ef0988d587b74e787a0917f69</auth:AuthInfo>

      </auth:Authentication>

   </env:Header>

   <env:Body>

     <rpc message-id ="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

       <get>

         <filter type="subtree">

           <top xmlns="http://www.h3c.com/netconf/data:1.0">

             <Ifmgr>

               <Interfaces>

                 <Interface>

                   <IfIndex></IfIndex>

                   <Name>GigabitEthernet1/0/1</Name>

                 </Interface>

                 <Interface>

                   <IfIndex></IfIndex>

                   <Name>GigabitEthernet1/0/2</Name>

                 </Interface>

               </Interfaces>

             </Ifmgr>

             </top>

          </filter>

       </get>

     </rpc>

   </env:Body>

</env:Envelope>

# 接收到的应答消息,获知接口GigabitEthernet1/0/1GigabitEthernet1/0/2的索引值分别为12

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">

   <env:Header>

      <auth:Authentication env:mustUnderstand="true" xmlns:auth="http://www.h3c.com/netconf/base:1.0">

         <auth:AuthInfo>100001ac479ef0988d587b74e787a0917f69</auth:AuthInfo>

      </auth:Authentication>

   </env:Header>

   <env:Body>

      <rpc-reply message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">

         <data>

            <top xmlns="http://www.h3c.com/netconf/data:1.0">

               <Ifmgr>

                  <Interfaces>

                     <Interface>

                        <IfIndex>1</IfIndex>

                        <Name>GigabitEthernet1/0/1</Name>

                     </Interface>

                  </Interfaces>

               </Ifmgr>

            </top>

         </data>

      </rpc-reply>

   </env:Body>

</env:Envelope>

(4)     创建VLAN,将接口加入VLAN,创建VLAN接口,并配置VLAN接口的IP地址。

# 创建步骤CreateVLAN,在Device A上创建VLAN 1020,将接口GigabitEthernet1/0/1GigabitEthernet1/0/2分别加入VLAN 1020。创建VLAN接口1020,配置其IP地址分别为10.1.1.1/24192.168.1.1/24

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">

   <env:Header>

         <auth:Authentication env:mustUnderstand="true" xmlns:auth="http://www.h3c.com/netconf/base:1.0">

         <auth:AuthInfo>100001ac479ef0988d587b74e787a0917f69</auth:AuthInfo>

      </auth:Authentication>

   </env:Header>

   <env:Body>

<rpc message-id ="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"  xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">

  <edit-config>

    <target>

      <running/>

    </target>

    <config>

      <top xmlns="http://www.h3c.com/netconf/config:1.0" xc:operation="merge">

        <VLAN>

          <VLANs>

            <VLANID>

              <ID>10</ID>

              <AccessPortList>1</AccessPortList>

              <Ipv4>

                <Ipv4Address>10.1.1.1</Ipv4Address>

                <Ipv4Mask>255.255.255.0</Ipv4Mask>

              </Ipv4>

            </VLANID>

                <VLANID>

              <ID>20</ID>

              <AccessPortList>2</AccessPortList>

              <Ipv4>

                <Ipv4Address>192.168.2.1</Ipv4Address>

                <Ipv4Mask>255.255.255.0</Ipv4Mask>

              </Ipv4>

            </VLANID>

          </VLANs>

        </VLAN>

      </top>

    </config>

  </edit-config>

</rpc>

# 接收到应答消息,表明配置成功。

   </env:Body>

     </env:Envelope>

       <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">

        <env:Header>

           <auth:Authentication env:mustUnderstand="true" xmlns:auth="http://www.h3c.com/netconf/base:1.0">

              <auth:AuthInfo>100001ac479ef0988d587b74e787a0917f69</auth:AuthInfo>

           </auth:Authentication>

        </env:Header>

        <env:Body>

      <rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">

         <ok/>

      </rpc-reply>

   </env:Body>

</env:Envelope>

(5)     创建DHCP地址池

# 创建步骤CreatePool,在Device A上创建DHCP地址池pool1,该地址池分配10.1.1.0/24网段地址、IP地址租约为1天、网关地址为10.1.1.1DNS服务器地址为10.1.1.10

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">

  <env:Header>

    <auth:Authentication env:mustUnderstand="true" xmlns:auth="http://www.h3c.com/netconf/base:1.0">

      <auth:AuthInfo>100001ac479ef0988d587b74e787a0917f69</auth:AuthInfo>

      </auth:Authentication>

  </env:Header>

  <env:Body>

    <rpc message-id ="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"  xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">

      <edit-config>

        <target>

          <running/>

        </target>

        <config>

          <top xmlns="http://www.h3c.com/netconf/config:1.0" xc:operation="create">

            <DHCP>

              <DHCPServerIpPool>

                <IpPool>

                  <PoolIndex>1</PoolIndex>

                  <PoolName>pool1</PoolName>

                  <NetworkIpv4Address>10.1.1.0</NetworkIpv4Address>

                  <NetworkIpv4Mask>255.255.255.0</NetworkIpv4Mask>

                  <LeaseDay>1</LeaseDay>

                  <LeaseHour>0</LeaseHour>

                  <LeaseMinute>0</LeaseMinute>

                  <LeaseSecond>0</LeaseSecond>

                  <GatewayIpv4Address>10.1.1.1</GatewayIpv4Address>

                  <DNSIpv4Address>10.1.1.10</DNSIpv4Address>

                </IpPool>

              </DHCPServerIpPool>

            </DHCP>

          </top>

        </config>

      </edit-config>

    </rpc>

  </env:Body>

</env:Envelope>

# 接收到应答消息,表明配置成功。

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">

   <env:Header>

      <auth:Authentication env:mustUnderstand="true" xmlns:auth="http://www.h3c.com/netconf/base:1.0">

         <auth:AuthInfo>100001ac479ef0988d587b74e787a0917f69</auth:AuthInfo>

      </auth:Authentication>

   </env:Header>

   <env:Body>

      <rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">

         <ok/>

      </rpc-reply>

   </env:Body>

</env:Envelope>

(6)     开启DHCP服务。

# 创建步骤DHCP-Enable,开启DHCP服务。

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">

  <env:Header>

    <auth:Authentication env:mustUnderstand="true" xmlns:auth="http://www.h3c.com/netconf/base:1.0">

      <auth:AuthInfo>100001ac479ef0988d587b74e787a0917f69</auth:AuthInfo>

    </auth:Authentication>

  </env:Header>

  <env:Body>

    <rpc message-id ="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"  xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">

      <edit-config>

        <target>

          <running/>

        </target>

        <config>

          <top xmlns="http://www.h3c.com/netconf/config:1.0" xc:operation="create">

            <DHCP>

              <DHCPConfig>

                <DHCPEnable>1</DHCPEnable>

              </DHCPConfig>

            </DHCP>

          </top>

        </config>

      </edit-config>

    </rpc>

  </env:Body>

</env:Envelope>

# 接收到应答消息,表明配置成功。

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">

   <env:Header>

      <auth:Authentication env:mustUnderstand="true" xmlns:auth="http://www.h3c.com/netconf/base:1.0">

         <auth:AuthInfo>100001ac479ef0988d587b74e787a0917f69</auth:AuthInfo>

      </auth:Authentication>

   </env:Header>

   <env:Body>

      <rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">

         <ok/>

      </rpc-reply>

   </env:Body>

</env:Envelope>

11.1.4  Device B上通过CLI配置DHCP客户端功能

# 创建VLAN 10,将接口GigabitEthernet1/0/1加入VLAN 10

<DeviceB> system-view

[DeviceB] vlan 10

[DeviceB-vlan10] port GigabitEthernet 1/0/1

[DeviceB-vlan10] quit

# 创建VLAN接口10,配置该接口通过DHCP获取IP地址。

[DeviceB] interface vlan-interface 10

[DeviceB-Vlan-interface10] ip address dhcp-alloc

[DeviceB-Vlan-interface10] quit

11.1.5  验证配置

# Device B上查看接口IP地址,可以看到VLAN接口10获取到IP地址10.1.1.2

[DeviceB] display ip interface brief

*down: administratively down

 (s): spoofing  (l): loopback

Interface           Physical Protocol IP address      VPN instance Description

Vlan10              up       up       10.1.1.2        --           --

# Device B上查看DHCP客户端信息,可以看到VLAN接口10获取到的参数与DHCP服务器上的配置一致。

[DeviceB] display dhcp client verbose

Vlan-interface10 DHCP client information:

  Current state: BOUND

  Allocated IP: 10.1.1.2 255.255.255.0

  Allocated lease: 86400 seconds, T1: 38637 seconds, T2: 75600 seconds

  Lease from Jan  1 08:54:48 2013   to   Jan  2 08:54:48 2013

  DHCP server: 10.1.1.1

  Transaction ID: 0x81876da6

  Default router: 10.1.1.1

  DNS servers: 10.1.1.10

  Client ID type: ascii(type value=00)

  Client ID value: 00e0.fc00.511a-Vlan10

  Client ID (with type) hex: 0030-3065-302e-6663-

                             3030-2e35-3131-612d-

                             566c-616e-3130

  T1 will timeout in 0 days 10 hours 40 minutes 20 seconds   

11.2  基于ncclient工具的NETCONF over SSH配置举例

11.2.1  组网需求

在主机Host上安装开源工具ncclient,通过主机HostDevice设备建立NETCONF over SSH会话,实现如下需求:

·     查询Device设备的ARP表项和接口信息。

·     配置BGP

11.2.2  组网图

图9 通过NETCONF查询和配置Device设备组网图

 

11.2.3  配置步骤

(1)     配置主机HostDevice设备的IP地址,确保主机HostDevice互通(略)。

(2)     Device设备上开启NETCONF over SSH server功能。

# 生成RSA密钥对。

<Router> system-view

[Router] public-key local create rsa

The range of public key modulus is (512 ~ 4096).

If the key modulus is greater than 512, it will take a few minutes.

Press CTRL+C to abort.

Input the modulus length [default = 1024]:

Generating Keys...

.

Create the key pair successfully.

# 生成DSA密钥对。

[Router] public-key local create dsa

The range of public key modulus is (512 ~ 2048).

If the key modulus is greater than 512, it will take a few minutes.

Press CTRL+C to abort.

Input the modulus length [default = 1024]:

Generating Keys...

.

Create the key pair successfully.

# 生成ECDSA密钥对。

[Router] public-key local create ecdsa secp256r1

Generating Keys...

.

Create the key pair successfully.

# 开启NETCONF over SSH服务器功能

<Device> system-view

[Device] netconf ssh server enable

# 创建用户admin,并配置密码为admin和用户使用的服务类型为SSH

[Device] local-user admin class manage

[Device-luser-manage-admin] password simple admin

[Device-luser-manage-admin] service-type ssh

# 配置用户admin的授权角色为network-adminnetwork-operator

[Device-luser-manage-admin] authorization-attribute user-role network-admin

[Device-luser-manage-admin] authorization-attribute user-role network-operator

[Device-luser-manage-admin] quit

# 配置admin登录设备时,需要输入用户名和密码进行AAA认证。

[Device] line vty 0 63

[Device-line-vty0-63] authentication-mode scheme

[Device-line-vty0-63] user-role network-admin

[Device-line-vty0-63] user-role network-operator

(3)     在主机Host安装ncclient

ncclient安装有如下两种方法:

¡     使用pip工具安装。

在命令行执行pip install ncclient安装。

pip安装的好处在于,在联网的前提下,就可以把ncclient依赖的软件包都下载和安装完整,省去了排错的问题。

¡     使用源码安装

在官网下载软件包,地址https://pypi.org/project/ncclient/,解压文件,使用python setup.py install命令行安装。源码安装需要手工安装好多依赖包。

(4)     基于ncclient编写Device设备信息查询和功能配置的Python代码

# 创建query.py文件,编写查询Device设备的ARP表项和接口信息代码。

#! /usr/bin/env python2.7

import sys, os, warnings

warnings.simplefilter("ignore", DeprecationWarning)

from ncclient import manager

import time

def my_unknown_host_cb(host, figerprint):

    return True

 

def demo(host, port, user, pwd):

    with manager.connect_ssh(host=host,

        port=port,

        username=user,

        password=pwd,

        unknown_host_cb=my_unknown_host_cb,

       

        device_params = {'name':'h3c'}) as m:

        for c in m.server_capabilities:

            print (c)

 

        get_xml = """

    <top xmlns="http://www.h3c.com/netconf/data:1.0">

  <ARP>

  <ArpTable>

    <ArpEntry>

      <IfIndex></IfIndex>

      <Ipv4Address></Ipv4Address>

      <MacAddress></MacAddress>

      <VLANID></VLANID>

      <PortIndex></PortIndex>

      <VrfIndex></VrfIndex>

      <ArpType></ArpType>

    </ArpEntry>

  </ArpTable>

  </ARP>

  <Ifmgr>

  <Interfaces>

    <Interface>

      <IfIndex></IfIndex>

      <Name></Name>

    </Interface>

  </Interfaces>

  </Ifmgr>

  </top>

    """

        print (m.get(('subtree', get_xml)))

 

if __name__ == '__main__':

    demo("17.1.1.124", 830, "admin", "admin")

    print ("closed")

    time.sleep(1)

保存该文件后,在主机Host执行python query.py命令执行该文件,即可看到Device设备的ARP表项和接口信息。

# 创建deploy.py文件,编写Device设备使能BGP NSR功能的Python代码。

#! /usr/bin/env python2.7

import sys, os, warnings

warnings.simplefilter("ignore", DeprecationWarning)

from ncclient import manager

import time

def my_unknown_host_cb(host, figerprint):

    return True

def demo(host, port, user, pwd):

    xml = """

<config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">

<top xmlns="http://www.h3c.com/netconf/config:1.0">

    <BGP>

    <Instances>

    <Instance>

      <Name></Name>

      <ASNumber>111</ASNumber>

      <NSR>1</NSR>

    </Instance>

    </Instances>

    </BGP>

    </top>

    </config>"""

    with manager.connect_ssh(host=host,

    port=port,

    username=user,

    password=pwd,

    unknown_host_cb=my_unknown_host_cb,

    device_params = {'name':'h3c'}) as m:

        for c in m.server_capabilities:

            print (c)

        print (xml)

        print (m.edit_config(target='running', config=xml))

 

if __name__ == '__main__':

    demo("17.1.1.124", 830, "admin", "admin")

保存该文件后,在主机Host上执行python deploy.py命令执行该文件,会收到Device设备返回的信息,如果“rpc-reply”元素内显示信息为“ok”,即表示执行成功。然后在Device设备上使用display current-configuration configuration bgp命令查看BGP AS111的配置信息。