Based on the business need, you can use a configuration or script file to initiate the ZTP process.
Attention
|
When you use a USB flash drive as a source for ZTP, you cannot use the script file for provisioning. The script file is not
supported in the USB fetcher. Fetcher defines which port the ZTP process should use to get the provisioning details as defined
in the ztp.ini file.
|
The configuration file content starts with !! IOS XR and the script file content starts with #! /bin/bash, #! /bin/sh or #!/usr/bin/python.
Once you create the configuration file, apply it to the device using the ztp_helper function xrapply.
Note
|
We recommend that you don’t execute the APIs on a router that is already provisioned. ZTP Utility APIs are designed to be
executed from the ZTP script when you boot the router for the first time. The APIs perform additional operations to run the
requested actions during the boot process and bring changes in the existing configuration before executing any action.
ZTP utility APIs have prerequisites which are executed in the ZTP workflow before running the ZTP utility APIs. These prerequisites
help with running specific actions during the boot process and in making necessary configuration changes.
We recommend that you don’t use ZTP utilities outside the scope of ZTP script. The APIs in this script use username as ztp or ztp-user in every action. The ZTP utility executed outside the scope of the ZTP script may fail as it’s not executed from the ZTP
workflow. This may modify the configurations on the device and affect other related operations. If the ZTP utility is executed
outside the scope ZTP script, the logs display that the script is executed using username ztp or ztp-user , misleading that the script is executed from the workflow.
|
The following is the sample configuration file:
!! IOS XR
username root
group root-lr
password 0 lablab
!
hostname ios
alias exec al show alarms brief system active
interface HundredGigE 0/0/0/24
ipv4 address 10.10.10.55 255.255.255.0
no shutdown
!
You can also use a script file to initiate the ZTP process. This script or binary is executed in the IOS XR bash shell and
can be used to interact with IOS XR CLI to configure, verify the configured state and even run EXEC commands based on the
workflow that you choose. Build your ZTP script with either shell and python. ZTP includes a set of CLI commands and a set
of shell utilities that can be used within the user script. ZTP includes a set of shell utilities that can be sourced within
the user script. The ztp_helper.sh
is a shell script that can be sourced by the user script. This script provides simple utilities to access XR functionalities.
For information on helper APIs, see the Github repository.
The following shows the sample script in python.
[apple2:~]$ python sample_ztp_script.py
###### Debugs enabled ######
###### Change context to user specified VRF ######
###### Using Child class method, setting the root user ######
2016-12-17 04:23:24,091 - DebugZTPLogger - DEBUG - Config File content to be applied !
username netops
group root-lr
group cisco-support
secret 5 $1$7kTu$zjrgqbgW08vEXsYzUycXw1
!
end
2016-12-17 04:23:28,546 - DebugZTPLogger - DEBUG - Received exec command request: "show
configuration commit changes last 1"
2016-12-17 04:23:28,546 - DebugZTPLogger - DEBUG - Response to any expected prompt ""
Building configuration...
2016-12-17 04:23:29,329 - DebugZTPLogger - DEBUG - Exec command output is ['!! IOS XR
Configuration version = 6.2.1.21I', 'username netops', 'group root-lr', 'group cisco-support',
'secret 5 $1$7kTu$zjrgqbgW08vEXsYzUycXw1', '!', 'end']
2016-12-17 04:23:29,330 - DebugZTPLogger - DEBUG - Config apply through file successful,
last change = ['!! IOS XR Configuration version = 6.2.1.21I', 'username netops', 'group
root-lr', 'group cisco-support', 'secret 5 $1$7kTu$zjrgqbgW08vEXsYzUycXw1', '!', 'end']
###### Debugs Disabled ######
###### Executing a show command ######
Building configuration...
{'output': ['!! IOS XR Configuration version = 6.2.1.21I',
'!! Last configuration change at Sat Dec 17 04:23:25 2016 by UNKNOWN',
'!',
'hostname customer2',
'username root',
'group root-lr',
'group cisco-support',
'secret 5 $1$7kTu$zjrgqbgW08vEXsYzUycXw1',
'!',
'username noc',
'group root-lr',
'group cisco-support',
'secret 5 $1$7kTu$zjrgqbgW08vEXsYzUycXw1',
'!',
'username netops',
'group root-lr',
'group cisco-support',
'secret 5 $1$7kTu$zjrgqbgW08vEXsYzUycXw1',
'!',
'username netops2',
'group root-lr',
'group cisco-support',
'secret 5 $1$7kTu$zjrgqbgW08vEXsYzUycXw1',
'!',
'username netops3',
'group root-lr',
'group cisco-support',
'secret 5 $1$7kTu$zjrgqbgW08vEXsYzUycXw1',
'!',
'cdp',
'service cli interactive disable',
'interface MgmtEth0/RP0/CPU0/0',
'ipv4 address 11.11.11.59 255.255.255.0',
'!',
'interface TenGigE0/0/0/0/24',
'shutdown',
'!',
'interface TenGigE0/0/0/0/25',
'shutdown',
'!',
'router static',
'address-family ipv4 unicast',
'0.0.0.0/0 11.11.11.2',
'!',
'!',
'end'],
'status': 'success'}
###### Apply valid configuration using a file ######
Building configuration...
{'status': 'success', 'output': ['!! IOS XR Configuration version = 6.2.1.21I', 'hostname
customer', 'cdp', 'end']}
###### Apply valid configuration using a string ######
Building configuration...
{'output': ['!! IOS XR Configuration version = 6.2.1.21I',
'hostname customer2',
'end'],
'status': 'success'}
###### Apply invalid configuration using a string ######
{'output': ['!! SYNTAX/AUTHORIZATION ERRORS: This configuration failed due to',
'!! one or more of the following reasons:',
'!! - the entered commands do not exist,',
'!! - the entered commands have errors in their syntax,',
'!! - the software packages containing the commands are not active,',
The XML-encoded YANG configuration that follows shows various network settings including:
-
Basic setup, including line configuration (TTY, VTY)
-
User setup such as System Utilities
-
Network configurations such as, domain service, Management IP address assignment, NETCONF, IP routing
-
Protocol configurations such as, SSH, LLDP, gRPC
-
Security (AAA)
-
Interface settings (Interface (IF) manager)
Router# python ztp_XML_test.py
# netconf_client_ztp_lib - version 1.2 #
2021-02-22 13:53:11,587 - DebugZTPLogger - DEBUG - netconf init attempt: 1
Building configuration...
2021-02-22 13:53:18,117 - DebugZTPLogger - DEBUG - Netconf yang agent is up
###################### Netconf response: Current running configuration #######################
<?xml version="1.0"?>
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<data>
<netconf xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-man-xml-ttyagent-cfg>
/* Enables NETCONF agent over TTY*/
<agent>
<tty>
<enable></enable>
</tty>
</agent>
</netconf>
<lldp xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-ethernet-lldp-cfg>
/*Enables and configures global LLDP subcommands*/
<enable>true</enable>
</lldp>
<ip-domain xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-ip-domain-cfg>
/*Configures domain service related commands*/
<vrfs>
<vrf>
<vrf-name>default</vrf-name>
<name>cisco.lab</name>
<servers>
<server>
<order>0</order>
<server-address>5.38.4.246</server-address>
</server>
</servers>
</vrf>
</vrfs>
</ip-domain>
<interface-configurations xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-ifmgr-cfg>
/*Configures Interfaces and controls their activation and deactivation*/
<interface-configuration>
<active>act</active>
<interface-name>HundredGigE0/0/0/14</interface-name>
<shutdown></shutdown>
</interface-configuration>
<interface-configuration>
<active>act</active>
<interface-name>MgmtEth0/RP0/CPU0/0</interface-name>
<ipv4-network xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-ipv4-io-cfg>
/*Configures IPv4 Interface input and output settings on the device*/
<addresses>
<primary>
<address>5.38.9.29</address>
<netmask>255.255.0.0</netmask>
</primary>
</addresses>
</ipv4-network>
</interface-configuration>
<interface-configuration>
<active>act</active>
<interface-name>FourHundredGigE0/0/0/0</interface-name>
<shutdown></shutdown>
</interface-configuration>
</interface-configurations>
<netconf-yang xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-man-netconf-cfg>
/*Configures Network Configuration Protocol (NETCONF) commands*/
<agent>
<ssh>
<enable></enable>
</ssh>
</agent>
</netconf-yang>
<tty xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-tty-server-cfg>
<tty-lines>
<tty-line>
<name>default</name>
<exec>
<timeout>
<minutes>0</minutes>
<seconds>0</seconds>
</timeout>
</exec>
<general>
<absolute-timeout>0</absolute-timeout>
</general>
</tty-line>
</tty-lines>
</tty>
<host-names xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-shellutil-cfg>
/*Configures various system utilities related to the shell environment
of the system such as Hostname, Time zone, Prompt, Environmental variable configurations.*/
<host-name>SF-1</host-name>
</host-names>
<grpc xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-man-ems-cfg>
<port>57400</port>
<no-tls></no-tls>
<enable></enable>
</grpc>
<aaa xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-aaa-lib-cfg>
/*Configures AAA (Authentication, Authorization, and Accounting) settings on the device*/
<usernames xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-aaa-locald-cfg>
<username>
<ordering-index>0</ordering-index>
<name>cafyauto</name>
<usergroup-under-usernames>
<usergroup-under-username>
<name>root-lr</name>
</usergroup-under-username>
<usergroup-under-username>
<name>cisco-support</name>
</usergroup-under-username>
</usergroup-under-usernames>
<secret>
<type>type10</type>
<secret10>$6$iY.Zo/7E7RIG5o/.$PH1YegMZiHsiRDTxKOjKQ0i8rd4n
s2vHMHEmQrsMQrrtNTlj/gcBEQRXj3WDR8bAv0rWzz3aGdElteshHYXXR1</secret10>
</secret>
</username>
</usernames>
<accountings>
<accounting>
<type>commands</type>
<listname>default</listname>
<type-xr>start-stop</type-xr>
<method1>local</method1>
</accounting>
</accountings>
</aaa>
<ssh xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-crypto-ssh-cfg>
/*Configures the Secure Shell (SSH) settings on a device such as Encryption, Authentication, Session Management*/
<server>
<timeout>120</timeout>
<rate-limit>600</rate-limit>
<session-limit>110</session-limit>
<v2></v2>
<vrf-table>
<vrf>
<vrf-name>default</vrf-name>
<enable></enable>
</vrf>
</vrf-table>
<netconf>830</netconf>
<netconf-vrf-table>
<vrf>
<vrf-name>default</vrf-name>
<enable></enable>
</vrf>
</netconf-vrf-table>
</server>
</ssh>
<router-static xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-ip-static-cfg>
/*Configures static IP routing on network devices*/
<default-vrf>
<address-family>
<vrfipv4>
<vrf-unicast>
<vrf-prefixes>
<vrf-prefix>
<prefix>0.0.0.0</prefix>
<prefix-length>0</prefix-length>
<vrf-route>
<vrf-next-hop-table>
<vrf-next-hop-next-hop-address>
<next-hop-address>5.38.0.1</next-hop-address>
</vrf-next-hop-next-hop-address>
</vrf-next-hop-table>
</vrf-route>
</vrf-prefix>
</vrf-prefixes>
</vrf-unicast>
</vrfipv4>
</address-family>
</default-vrf>
</router-static>
<vty xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-tty-vty-cfg>
/*Configures virtual terminal lines (VTY lines) to access a device through SSH or TTY protocols remotely.*/
<vty-pools>
<vty-pool>
<pool-name>cafyauto</pool-name>
<first-vty>5</first-vty>
<last-vty>99</last-vty>
<line-template>cafyauto</line-template>
</vty-pool>
</vty-pools>
</vty>
<netconf-yang xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-um-netconf-yang-cfg>
/*Configures the Network Configuration Protocol (NETCONF) settings and Yet Another Next Generation (YANG) data modelling.*/
<agent>
<ssh/>
</agent>
</netconf-yang>
<vty-pool xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-um-vty-pool-cfg>
/*Configures virtual terminal (VTY) lines on large number of network devices*/
<pools>
<pool>
<pool-name>cafyauto</pool-name>
<first-vty-number>5</first-vty-number>
<last-vty-number>99</last-vty-number>
<line-template>cafyauto</line-template>
</pool>
</pools>
</vty-pool>
<interfaces xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-um-interface-cfg>
/*Configures Interface settings such as interface, security, and performance on a device*/
<interface>
<interface-name>HundredGigE0/0/0/14</interface-name>
<shutdown/>
</interface>
<interface>
<interface-name>MgmtEth0/RP0/CPU0/0</interface-name>
<ipv4>
<addresses xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-um-if-ip-address-cfg>
/*Configures IP address settings on network interfaces of a device.*/
<address>
<address>5.38.9.29</address>
<netmask>255.255.0.0</netmask>
</address>
</addresses>
</ipv4>
</interface>
</interfaces>
<lldp xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-um-lldp-cfg/>
/*Configures the Link Layer Discovery Protocol (LLDP) settings on a network device.*/
<domain xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-um-domain-cfg>
/*Configures domain settings on the device*/
<name>cisco.lab</name>
<name-servers>
<name-server>
<order>0</order>
<address>5.38.4.246</address>
</name-server>
</name-servers>
</domain>
<xr-xml xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-um-xml-agent-cfg>
/*Configures XML agent settings such as Data formatting, Network Management, and Secure transport layers on the router.*/
<agent>
<ssl/>
<tty/>
<enable/>
</agent>
</xr-xml>
<netconf xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-um-xml-agent-cfg>
<agent>
<tty/>
</agent>
</netconf>
<router xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-um-router-static-cfg>
/*Configures the static routing settings on network devices*/
<static>
<address-family>
<ipv4>
<unicast>
<prefixes>
<prefix>
<prefix-address>0.0.0.0</prefix-address>
<prefix-length>0</prefix-length>
<nexthop-addresses>
<nexthop-address>
<address>5.38.0.1</address>
</nexthop-address>
</nexthop-addresses>
</prefix>
</prefixes>
</unicast>
</ipv4>
</address-family>
</static>
</router>
<ssh xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-um-ssh-cfg>
/*Configures the Secure Shell (SSH) settings such as secure remote access,
Encryption, and security on a network device.*/
<timeout>120</timeout>
<server>
<rate-limit>600</rate-limit>
<session-limit>110</session-limit>
<v2/>
<vrfs>
<vrf>
<vrf-name>default</vrf-name>
</vrf>
</vrfs>
<netconf>
<port>830</port>
<vrfs>
<vrf>
<vrf-name>default</vrf-name>
</vrf>
</vrfs>
</netconf>
</server>
</ssh>
<grpc xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-um-grpc-cfg>
/*Configures the gRPC (Google Remote Procedure Call) on a network device*/
<port>57400</port>
<no-tls></no-tls>
</grpc>
<hostname xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-um-hostname-cfg>
/*Configures the hostname on a network device*/
<system-network-name>SF-1</system-network-name>
</hostname>
<aaa xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-um-aaa-cfg>
<usernames xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-um-aaa-task-user-cfg>
/*Configures the AAA (Authentication, Authorization, and Accounting) parameters on a network device*/
<username>
<ordering-index>0</ordering-index>
<name>cafyauto</name>
<group>
<root-lr/>
<cisco-support/>
</group>
<secret>
<ten>$6$iY.Zo/7E7RIG5o/.$PH1YegMZiHsiRDTxKOjKQ0i8rd4ns2vHMHEmQrsMQrrtNTlj
/gcBEQRXj3WDR8bAv0rWzz3aGdElteshHYXXR1</ten>
</secret>
</username>
</usernames>
<accounting>
<commands>
<accounting-list>
<list-name>default</list-name>
<start-stop/>
<local/>
</accounting-list>
</commands>
</accounting>
</aaa>
<line xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-um-line-cfg>
<default>
<exec-timeout xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-um-line-exec-timeout-cfg>
/*Configures the exec timeout settings on network devices for the amount of time that the software waits for user to input after the last key has been pressed */
<timeout-in-minutes>0</timeout-in-minutes>
<timeout-in-seconds>0</timeout-in-seconds>
</exec-timeout>
<absolute-timeout xmlns=http://cisco.com/ns/yang/Cisco-IOS-XR-um-line-general-cfg>0</absolute-timeout>
/*Configures line settings on network devices*/
</default>
</line>
</data>
</rpc-reply>