The first experience of NETCONF configuration CISCO XE (csr1000v)
1. Useful links
Model Driven Network Automation with IOS-XE
Https://www.ciscolive.com/c/dam/r/ciscolive/emea/docs/2018/pdf/LTRCRT-2700.pdf
Configure NETCONF/YANG and Validate Example for Cisco IOS XE 16.x Platforms
Https://www.cisco.com/c/en/us/support/docs/storage-networking/management/200933-YANG-NETCONF-Configuration-Validation.html
Programmability Configuration Guide, Cisco IOS XE Everest 16.6.x
Https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/prog/configuration/166/b_166_programmability_cg/configuring_yang_datamodel.html
Yang-explorer
Https://github.com/CiscoDevNet/yang-explorer
YangModels
Https://github.com/YangModels
2. Install yang-explorer
Prepare:
MAC, Linux (windows is not supported)
Python 2.7
Pip Software Manager
Browser with flash plugin (recommended chrome)
/ / pip install-- upgrade pip
/ / yum install python-virtualenv
/ / yum install graphviz
A. Change the pip source
Mkdir / .pip
Vi / .pip/pip.conf
[global]
Index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
Trusted-host = mirrors.aliyun.com
Yum install python2-pip python-virtualenv graphviz-y
Dependent components:
Yum install libxml2-devel libxslt-devel python-devel zlib-devel gcc git-y
Git clone https://github.com/CiscoDevNet/yang-explorer.git
B, installation
Cd yang-explorer/
Bash setup.sh
Omit.
Successfully built ydk-models-cisco-ios-xr
Installing collected packages: ydk-models-cisco-ios-xr
Successfully installed ydk-models-cisco-ios-xr-6.2.1
Installing dependencies.. Done
Setting up initial database..
Warning: Setting up database as root, this is not recommended.
Alternatively you can re-run this script as non-root
To setup database without root privilege.
Do you want to continue as root? (nbat N) y / / initialize the database
Creating data directories..
Creating database..
Operations to perform:
Synchronize unmigrated apps: staticfiles, messages, explorer
Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
Creating tables...
Creating table explorer_collection
Creating table explorer_userprofile
Creating table explorer_deviceprofile
Running deferred SQL...
Installing custom SQL...
Running migrations:
Rendering model states... DONE
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying sessions.0001_initial... OK
Creating default users..
Copying default models..
Setup completed..
Use start.sh to start yang-explorer server
The installation is complete.
C. Modify the configuration file and run yang-exporer
[root@desk yang-explorer] # cd server/static/
[root@desk static] # vi YangExplorer.html
Var swfVersionStr = "16.0.0"
/ / To use express install, set to playerProductInstall.swf, otherwise the empty string.
Var xiSwfUrlStr = "expressInstall.swf"
Var flashvars = {}
Flashvars.host = & apos;192.168.0.87'; / / modify listening address and port
Flashvars.port = & apos;8088&apos
[root@desk static] # cd..
[root@desk server] # cd..
[root@desk yang-explorer] # vi start.sh
#! / usr/bin/env bash
HOST='192.168.0.87&apos
PORT='8088&apos
# set timeout value for ncclient
Export NCCLIENT_TIMEOUT=90
[root@desk yang-explorer] # ls
Default-models docs env.sh LICENSE README.md requirements.txt server setup.sh start.sh v YangExplorer
[root@desk yang-explorer] #. / start.sh
Activating virtualenv..
Starting YangExplorer server..
Use http://192.168.0.87:8088/static/YangExplorer.html
Performing system checks...
System check identified no issues (0 silenced).
July 17, 2019-15:22:46
Django version 1.8.3, using settings' server.settings&apos
Starting development server at http://192.168.0.87:8088/
Quit the server with CONTROL-C.
Open the browser:
Http://192.168.0.87:8088/static/YangExplorer.html
3. Import YangModels
Click Login
Username:guest
Password:guess
Subscript
4. Configure the XE router
XE3 (config) # netconf-yang / / main configuration
Cisco-IOS-XE-native- > native- > interface-- > GigabitEthernet name
Ip---- > address-choice
Check
XE3#sh ip inter b
Interface IP-Address OK? Method Status Protocol
GigabitEthernet1 192.168.0.29 YES DHCP up up
GigabitEthernet2 10.1.1.1 YES other administratively down down
GigabitEthernet3 unassigned YES unset administratively down down
XE3#sh ip inter b
Interface IP-Address OK? Method Status Protocol
GigabitEthernet1 192.168.0.29 YES DHCP up up
GigabitEthernet2 10.1.1.1 YES other up up
GigabitEthernet3 unassigned YES unset administratively down down
Generate a python file:
"
Netconf python example by yang-explorer (https://github.com/CiscoDevNet/yang-explorer)
Installing python dependencies:
> pip install lxml ncclient
Running script: (save as example.py)
> python example.py-a 192.168.0.29-u yoyoo-p yoyoo123-- port 830 / / method to execute python
"
Import lxml.etree as ET
From argparse import ArgumentParser
From ncclient import manager
From ncclient.operations import RPCError
Payload = ""
two
10.1.1.1
255.255.255.0
"
If _ _ name__ = & apos;__main__':
Parser = ArgumentParser (description='Usage:')
# script arguments
Parser.add_argument (& apos;-a', & apos;--host', type=str, required=True
Help= "Device IP address or Hostname")
Parser.add_argument (& apos;-u', & apos;--username', type=str, required=True
Help= "Device Username (netconf agent username)")
Parser.add_argument (& apos;-p', & apos;--password', type=str, required=True
Help= "Device Password (netconf agent password)")
Parser.add_argument (& apos;--port', type=int, default=830
Help= "Netconf agent port")
Args = parser.parse_args ()
# connect to netconf agent
With manager.connect (host=args.host
Port=args.port
Username=args.username
Password=args.password
Timeout=90
Hostkey_verify=False
Device_params= {& apos;name': & apos;csr'}) as m:
# execute netconf operation
Try:
Response = m.edit_config (target='running', config=payload) .xml
Data = ET.fromstring (response)
Except RPCError as e:
Data = e._raw
# beautify output
Print (ET.tostring (data, pretty_print=True))