美文网首页
交换机ZTP启动

交换机ZTP启动

作者: Bless_H | 来源:发表于2021-09-26 15:23 被阅读0次

        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

    相关文章

      网友评论

          本文标题:交换机ZTP启动

          本文链接:https://www.haomeiwen.com/subject/awaxnltx.html