Advanced

Configuration Management and prep for ZTR

Objective

I want to automatically push the startup-config from each node to the corresponding /nodes/ folder whenever changes are made on the node.

Solution

The ZTPServer accepts HTTP PUT requests at nodes/<node_id>/startup-config. Therefore, we can configure and event-handler on the node during provisioning which will perform this PUT anytime the startup-config is saved.

1. Create event-handler template

Choose the option that best fits your deployment. The variations are Serial Number or System Mac Address, and Default VRF or Non-Default VRF.

Copy and paste the option text into a new template in:

# Go to your data_root - by default it's /usr/share/ztpserver
admin@ztpserver:~# cd /usr/share/ztpserver

# Make sure you have a directory for templates
admin@ztpserver:~# mkdir -p files/templates

# Create a static config block
admin@ztpserver:~# vi files/templates/config-push.template

Note

Notice the $ztpserver, $port and $vrf_name variables. You can hardcode these in the template or abstract these to the definition or attributes file (as shown in the next recipe).

Option 1: Using SystemMac and Default VRF

event-handler configpush
 trigger on-startup-config
 action bash export SYSMAC=`FastCli -p 15 -c 'show ver | grep MAC | cut -d" " -f 5' | sed 's/[.]*//g'`; curl http://$ztpserver:$port/nodes/$SYSMAC/startup-config -H "content-type: text/plain" --data-binary @/mnt/flash/startup-config -X PUT

Option 2: Using SystemMac and Non-Default VRF

event-handler configpush
 trigger on-startup-config
 ! For non-default VRF, use:
 action bash export SYSMAC=`FastCli -p 15 -c 'show ver | grep MAC | cut -d" " -f 5' | sed 's/[.]*//g'`; sudo ip netns exec ns-$vrf_name curl http://$ztpserver:$port/nodes/$SYSMAC/startup-config -H "content-type: text/plain" --data-binary @/mnt/flash/startup-config -X PUT

Option 3: Using Serial Number and Default VRF

event-handler configpush
 trigger on-startup-config
 ! For serial number, default VRF:
 action bash export SERIAL=`FastCli -p 15 -c 'show ver' | grep Serial | tr -s ' ' | cut -d ' ' -f 3 | tr -d '\r'`; curl http://$ztpserver:$port/nodes/$SERIAL/startup-config -H "content-type: text/plain" --data-binary @/mnt/flash/startup-config -X PUT

Option 4: Using Serial Number and Non-Default VRF

event-handler configpush
 trigger on-startup-config
 ! For serial number, non-default VRF:
 action bash export SERIAL=`FastCli -p 15 -c 'show ver' | grep Serial | tr -s ' ' | cut -d ' ' -f 3 | tr -d '\r'`; sudo ip netns exec ns-$vrf_name curl http://$ztpserver:$port/nodes/$SERIAL/startup-config -H "content-type: text/plain" --data-binary @/mnt/flash/startup-config -X PUT

Zero-touch replatement (ZTR)

Objective

I replaced a switch with a new one and want it to provision with the same configuration and, optionally, EOS version as the node it replaced.

Solution

ZTPServer first looks for a pre-existing definition for a node in the <configdir>/nodes/<node-id> directory before trying to match through neighbordb, etc. Thus, you can make ZTPServer think it has already seen this node by renaming, linking or copying the old-node’s directory to the new-node’s unique-id before powering the switch on for the first time.

Moving (renaming) or linking are most commonly used, however, making a recursive copy will ensure that the last-known configuration of the previous node remains stored as a backup.

cd /usr/share/ztpserver/nodes
ln -s <old-node_id> <new-node_id>