ZTP配置(Zero Touch Provisioning),为适应批量设备上线而产生的一种自动配置的技术,这次研究ZTP的目标是实现上线自动升级设备版本,根据设备SN自动获取配置。
H3C交换机ZTP启动
版本和补丁管理
这一部分比较复杂后续再研究
配置获取
第二部分比较简单先研究第二部分,根据设备SN获取对应的配置。下面是测试的环境:
测试环境.png
重要提示
1.首先是这个python的脚本是不能在本机运行的只能在H3C交换机上运行,并且在H3C交换机上不能编辑这个脚本,所以我们在开始调试时,要把H3C交换机的FTP打开,我们在写程序电脑上写完之后直接ftp推送到H3C交换机调试。
2.前期测试的时候直接运行脚本,我的思路是先把tftp获取这个脚本的过程跳过去,先调试脚本可以从文件服务器获取指定的文件,然后调试没有问题了,再调试tftp这块来自动获取python文件执行。
DHCP配置
DHCP配置.png除了普通的DHCP外加了两个配置一个是next-server,这个字段是标识tftpserver,一个是option 67,这个自动是标识要从tftp下载的文件。
TFTP配置
是参照着这个链接里配置的,把对应的文件放在tftpboot文件夹里就可以了。
tftp配置.png
获取配置文件的代码
大致思路就是获取设备sn,通过sn来下载指定的配置文件,然后设置启动配置文件,重启设备。排除掉设备版本管理,单纯获取配置文件加载配置文件还是比较容易的。
import re
import comware
import os
import time
username = 'test'
password = 'blessliu..'
hostname = '10.63.100.254'
protocol = 'ftp'
login_timeout = 10
vrf = ''
local_path = 'flash:/'
config_local_name = 'startup.cfg'
remote_config_name = ''
cfg_dir = ''
python_log_name = ""
def write2Log(info):
global python_log_name, local_path
if python_log_name == "":
try:
python_log_name = "%spython_%s" %(local_path, "ztp.log")
except Exception as inst:
print inst
fd = open(python_log_name, "a")
fd.write(info)
fd.flush()
fd.close()
#get device serial number and return the config
def getCfgFileName():
write2Log("[*]getiting device serial number...")
print "[*]getiting device serial number..."
run_comd = comware.CLI('dis dev man', False)
res = run_comd.get_output()
dev_sn = res[3].split(':')[1].strip()
remote_config_name = 'conf_' + dev_sn + '.cfg'
write2Log("[*]Starting Copy of %s.\n" % remote_config_name)
print "[*]remote config name: %s" % remote_config_name
return remote_config_name
#clear local file
def removeFile(filename):
try:
os.remove(filename)
except os.error:
pass
#Copy the configure file from ftp server
def doCopyFile(src,des,login_timeou = 10):
global username,password,hostname,protocol,vrf
write2Log("[*]Starting Copy of %s.\n" % src)
print "[*]Starting Copy of %s.\n" % src
try:
removeFile(des)
obj = comware.Transfer(protocol, hostname, src, des, vrf, login_timeout, username, password)
if obj.get_error() != None:
write2Log("[-]copy %s failed: %s \n" % (src, obj.get_error()))
print "[-]copy %s failed: %s \n" % (src, obj.get_error())
return False
except Exception as inst:
write2Log("[-] copy %s exception: %s\n" % (src, inst))
print "[-] copy %s exception: %s\n " % (src, inst)
return False
write2Log("[+]copy file %s to %s success\n" % (src, des))
print "[+]INFO: Completed Copy of %s\n" % src
return True
#set start up config
def startupCfg():
global local_path, config_local_name
result = None
dest = "%s%s" %(local_path, config_local_name)
write2Log("[*]startup saved-configuration %s begin\n" %dest)
print "[*]startup saved-configuration %s begin\n" %dest
comd = "startup saved-configuration %s main" % dest
print "[-----]" + comd
try:
result = comware.CLI(comd, False)
if result == None:
write2Log("[-]startupstartup saved-configuration %s failed.\n" % dest)
print "[-]startup saved-configuration %s failed.\n" % dest
return False
except Exception as inst:
write2Log("[-]startup %s exception: %s \n" % (dest, inst))
print "[-]startup %s exception: %s \n " % (dest, inst)
return False
write2Log("[+]startup saved-configuration %s success" % dest)
print "[+]: Completed Startup Saved-configuration.\n"
return True
remote_config_name = getCfgFileName()
removeFile(config_local_name)
doCopyFile(src=remote_config_name,des='flash:/startup.cfg')
startupCfg()
result = comware.CLI('reboot force', False)
time.sleep(0.5)
result = comware.CLI('Y', False)
这部分代码已经测试过了,目前没有什么问题,后面会增加堆叠以及版本控制的方面。
参考链接
1.H3C官方文档(太过简单了,离谱)
http://www.h3c.com/cn/d_201905/1182215_30005_0.htm
2.CSDN博客(完整的脚本,所有关于H3C_ZTP的都是这个版本)
https://blog.csdn.net/weixin_45537413/article/details/111350873
3.PXE环境搭建
https://docs.virtuozzo.com/virtuozzo_hybrid_server_7_installation_using_pxe_guide/preparing-for-pxe-installation/configuring-dhcp-server.html
网友评论