08-自動配置
本章節下載: 08-自動配置 (603.08 KB)
自動配置功能是指設備在啟動時自動獲取並執行配置文件。網絡管理員隻需將配置文件保存在指定的存儲介質上,啟動設備,即可實現自動配置,從而簡化了網絡配置,大大降低了網絡管理員的工作量,便於實現對設備的集中管理。
自動配置的實現方式如表1-1所示:
配置方式 |
配置文件保存位置 |
應用場景 |
服務器自動配置 |
文件服務器 |
網絡規模較大,設備位置相對分散 |
U盤自動配置 |
U盤 |
· 小規模網絡:設備位置相對集中且缺少多餘設備作為文件服務器 · 大規模網絡:僅有少量設備的配置需要更新 |
設備上如果可以同時實現服務器自動配置和U盤自動配置時,則優先使用U盤自動配置。短信自動配置成本相對較高,可靠性相對較差(受3G/4G信號影響較大),如果可以選擇其他類型的自動配置方式,不建議使用短信自動配置。
設備空配置啟動時,首先自動檢查存儲介質的根目錄下是否存在autocfg.py、autocfg.tcl 或autocfg.cfg配置文件。如果存在,則直接執行此文件;如果不存在,則通過自動從文件服務器上獲取並執行配置腳本文件或配置文件,實現自動配置功能。autocfg.py、autocfg.tcl和autocfg.cfg配置文件同時隻能在設備上存在一個。
服務器自動配置是指在一個網絡中存在文件服務器、DHCP服務器和DNS服務器的情況下,新加入或無配置文件的設備上電啟動時,設備會自動運行DHCP Client服務,通過DHCP Server獲取配置文件所在的URL地址或TFTP Server IP、TFTP Server name以及配置文件的文件名。最後從對應文件服務器(HTTP、TFTP、SFTP或FTP)下載配置文件進行配置加載並啟動的過程。
服務器自動配置支持在IPv4和IPv6網絡中實現,兩種網絡配置思路相同,本節僅以IPv4網絡配置為例。
服務器自動配置的典型組網環境如圖1-1所示。設備需要在DHCP服務器、文件服務器(TFTP服務器、HTTP服務器、SFTP服務器或FTP服務器)和DNS服務器的配合下,實現服務器自動配置功能。
· DHCP服務器:DHCP服務器為執行服務器自動配置的設備分配IP地址,並向設備通告獲取自動配置文件或配置腳本的途徑。
· 文件服務器:文件服務器用於保存自動配置的配置文件或腳本。
· DNS服務器:DNS服務器為設備獲取到配置文件名稱或獲取文件服務器的IP地址。
主機名文件中保存有主機IP地址與主機名的映射關係,請按照以下方式來準備主機名文件:
(1) 創建主機名文件,文件名必須設置為“network.cfg”。
(2) 按照以下格式手工在文件中添加主機IP地址與主機名的映射關係,保證一行一條映射。
ip host host-name ip-address
例如,主機名文件中可以包括以下內容,則IP地址為101.101.101.101的設備使用的配置文件名為host1.cfg:
ip host host1 101.101.101.101
ip host host2 101.101.101.102
ip host client1 101.101.101.103
ip host client2 101.101.101.104
主機名必須與主機的配置文件名保持一致。
設備在進行自動配置時,係統按照如下規則選取符合條件的接口:
(1) 若有處於鏈路狀態UP的管理以太網接口,則優先選取管理以太網接口。
(2) 若沒有處於鏈路狀態UP的管理以太網接口,有處於鏈路狀態UP的二層以太網接口,則選取默認VLAN對應的VLAN接口。
(3) 若沒有處於鏈路狀態UP的二層以太網接口,則在30秒後開始下次服務器自動配置接口選擇過程。
建議管理員將設備的管理以太網接口連入網絡中,這樣可以加快服務器自動配置的速度。
設備通過服務器自動配置的流程如下:
(1) 設備按順序選擇獲取配置文件的接口,並向DHCP服務器發送IP地址請求報文。選擇獲取配置文件的接口的順序參見“選擇獲取配置文件的接口”。
(2) DHCP服務器收到IP地址請求報文後,會向設備發送一個回應報文。如果設備在超時時間內未收到回應報文,則會按順序選擇下一個接口發送IP地址請求報文。
(3) 設備解析回應報文:
¡ 獲取回應報文中攜帶的IP地址,將此IP地址作為接口的IP地址用於和DHCP服務器連接。如果接口上已有IP地址,則會修改此IP地址,等自動配置完成後,再回退成原IP地址。
¡ 獲取報文中攜帶的協議信息(HTTP、TFTP、SFTP或FTP)、配置文件名信息、文件服務器地址。
(4) 如果沒有獲取到配置文件名或配置文件名不符合規範,則會使用文件服務器中的network.cfg,如果不存在network.cfg,則會文件服務器中的使用device.cfg。如果device.cfg也不存在,則獲取配置文件失敗,重新選擇接口,執行步驟(1)。
(5) 域名解析,如果回應報文中攜帶的文件服務器地址是域名而不是IP地址,則會通過DNS服務器將文件服務器的域名解析為IP地址。
(6) 設備根據解析到的協議、文件服務器地址、配置文件名從文件服務器下載配置文件或腳本。
(7) 下載成功後,下發配置或者執行腳本。
(8) 設備下發配置或者執行腳本完成後,則會自動刪除該配置文件或腳本。
¡ 準備配置文件
¡ 準備配置腳本
(2) 配置文件服務器
(3) 配置DHCP服務器
(4) (可選)配置DNS服務器
(5) (可選)配置網關
(6) 完成自動配置
(7) (可選)終止自動配置
配置文件包括特定配置文件、部分或全部公用配置文件以及缺省配置文件(device.cfg)三種類型,如表1-2所示。
配置文件類型 |
適用的設備 |
文件名要求 |
支持的文件服務器 |
特定配置文件 |
具有特定配置需求的設備 |
配置文件名.cfg 為了方便辨識文件名,盡量不要使用包含空格的配置文件名。 |
· HTTP服務器 · TFTP服務器 · SFTP服務器 · FTP服務器 |
部分或全部共用配置文件 |
配置需求全部或者部分相同的設備 |
配置文件名.cfg 為了方便辨識文件名,盡量不要使用包含空格的配置文件名 |
· HTTP服務器 · TFTP服務器 · SFTP服務器 · FTP服務器 |
缺省配置文件 |
所有設備 包含一般設備啟動的公用配置信息 |
device.cfg |
TFTP服務器 |
管理員可以根據網絡中不同設備的需求和文件服務器類型選擇配置:
(1) 在文件服務器上為每個具有特定配置需求的設備準備特定配置文件。
(2) 在文件服務器上以.cfg為後綴名為部分或全部具有相同配置的設備保存一個配置文件。
(3) 在TFTP服務器上保存名為device.cfg的缺省配置文件為既沒有特定配置文件也沒有部分或全部共用配置文件的設備提供缺省配置。
如果DHCP服務器未下發配置文件名,管理員還可以在文件服務器上創建主機名文件提供主機名和設備IP地址的對應關係,以保證執行自動配置的設備獲取到對應的配置文件。
配置腳本可以實現自動更新版本、下發配置等功能。
目前設備支持的配置腳本包括Python腳本和Tcl腳本。Python腳本使用的文件後綴固定為.py,Tcl腳本使用的文件後綴固定為.tcl。關於Python腳本的詳細介紹,請參見“基礎配置指導”中的“Python”。關於Tcl腳本的詳細介紹,請參見“基礎配置指導”中的“Tcl”。
使用Tcl腳本配置文件對設備進行自動配置時,若配置文件中的命令行錯誤(例如:命令行拚寫錯誤、視圖錯誤、設備不支持所配置的命令等),那麼設備在執行到錯誤命令行時將直接中斷自動配置操作。
使用Python腳本配置文件對設備進行自動配置時,若配置文件中的命令行錯誤(例如:命令行拚寫錯誤、視圖錯誤、設備不支持所配置的命令等),則本次自動配置將失敗,進行下一輪自動配置。
使用Python腳本配置文件對設備進行自動配置時,設備處於啟動階段(非穩定運行狀態),所以,Python腳本中請不要使用display system stable state命令顯示結果為Stable來作為執行動作的判斷條件。
使用配置腳本與使用配置文件有如下區別:
· 在文件服務器上隻支持配置特定配置腳本和部分或全部共用配置腳本兩種形式,不支持缺省配置腳本。
· 在文件服務器上不支持使用主機名文件提供主機名和IP地址的對應關係。
有關“特定配置”、“部分或全部共用配置”、“缺省配置”以及“主機名和IP地址的對應關係”請參見“1.2.7 準備配置文件”。
管理員可以根據網絡中不同設備的需求和文件服務器類型選擇配置:
(1) 在文件服務器上為每個具有特定配置需求的設備準備特定配置腳本。
(2) 在文件服務器上以.tcl或.py為後綴名為部分或全部具有相同配置的設備保存一個配置文件。
設備可以通過HTTP、TFTP、SFTP或FTP獲取配置文件,管理員需要根據選用的方式在文件服務器上配置相應的HTTP服務、TFTP服務、SFTP服務或FTP服務。
DHCP服務器為執行服務器自動配置的設備分配IP地址,並向設備通告獲取自動配置文件或配置腳本的途徑。
DHCP服務器可以根據管理員需要的配置文件類型,進行相應的配置(下發配置腳本和下發配置文件實現一致,下麵以下發配置文件為例):
· 如果管理員為每台設備分配特定配置文件,則需要在DHCP服務器上配置靜態綁定關係,為每台設備分配特定的IP地址和配置文件名。由於一個地址池下隻能配置一條配置文件名的命令,所以DHCP服務器上每一個地址池視圖隻能配置一個靜態綁定關係。
· 如果管理員為局域網內的部分設備分配相同的配置文件,可以在DHCP服務器上為使用部分共用配置文件的設備配置靜態綁定關係,並指定文件服務器和部分共用配置文件名。這時,這部分靜態綁定關係需要在同一個DHCP地址池中配置。也可以使用動態分配IP地址的方式,管理員需要劃分合適的動態地址段,為這部分設備分配IP地址,並指定文件服務器和部分共用配置文件名。
· 如果管理員為局域網內的所有設備分配相同的配置文件,則需要在DHCP服務器上配置動態分配IP地址的方式。為設備動態分配IP地址的同時,分配全部共用配置文件名。如果采用這種方式,全部共用配置文件中隻能包含這些設備共有的配置,每個設備特有的配置還需要其他方式完成(如管理員使用Telnet登錄到設備上手工配置)。
以上三種分配方式可以同時在一台DHCP服務器上配置。
配置DHCP客戶端使用的遠程啟動配置文件時:
· 對於TFTP服務器需要指定啟動文件名,如果啟動文件名中有特殊字符時,需要依據RFC規範進行轉譯後才能使用。
· 對於HTTP服務器需要指定HTTP形式的URL,形式為http://HTTP服務器IP地址:端口號/路徑/文件名。如果URL中的路徑或文件名中有特殊字符時,需要依據RFC規範進行轉譯後才能使用。如果不指定端口號,則表示使用默認端口號。
· 對於FTP服務器需要指定FTP形式的URL,形式為ftp://用戶名:密碼@FTP服務器IP地址:端口號/路徑/文件名。如果URL中的用戶名、密碼、路徑或文件名中有特殊字符時,需要依據RFC規範進行轉譯後才能使用。如果不指定端口號,則表示使用默認端口號,如果不指定路徑,則表示使用服務器的根目錄。
· 對於SFTP服務器需要指定SFTP形式的URL,形式為sftp://用戶名:密碼@SFTP服務器IP地址:端口號/路徑/文件名。如果URL中的用戶名、密碼、路徑或文件名中有特殊字符時,需要依據RFC規範進行轉譯後才能使用。如果不指定端口號,則表示使用默認端口號,如果不指定路徑,則表示使用服務器的根目錄。
(1) 進入係統視圖。
system-view
(2) 開啟DHCP服務。
dhcp enable
缺省情況下,DHCP服務處於關閉狀態。
(3) 創建DHCP地址池,並進入DHCP地址池視圖。
dhcp server ip-pool pool-name
(4) 為客戶端分配IP地址。請至少選擇其中一項進行配置。
¡ 配置DHCP地址池動態分配的主網段。
network network-address [ mask-length | mask mask ]
缺省情況下,未配置動態分配的主網段。
¡ 配置靜態地址綁定。
static-bind ip-address ip-address [ mask-length | mask mask ] { client-identifier client-identifier | hardware-address hardware-address [ ethernet | token-ring ] }
缺省情況下,未配置靜態地址綁定。
多次執行本命令,可以配置多個靜態地址綁定。同一地址隻能綁定給一個客戶端。若需修改綁定必須先解除綁定。
(5) 配置DHCP客戶端使用的遠程啟動配置文件的HTTP形式URL。
bootfile-name url
缺省情況下,未配置DHCP客戶端使用的遠程啟動配置文件的HTTP形式URL。
(1) 進入係統視圖。
system-view
(2) 開啟DHCP服務。
dhcp enable
缺省情況下,DHCP服務處於關閉狀態。
(3) 創建DHCP地址池,並進入DHCP地址池視圖。
dhcp server ip-pool pool-name
(4) 為客戶端分配IP地址。請至少選擇其中一項進行配置。
¡ 配置DHCP地址池動態分配的主網段。
network network-address [ mask-length | mask mask ]
缺省情況下,未配置動態分配的主網段。
¡ 配置靜態地址綁定。
static-bind ip-address ip-address [ mask-length | mask mask ] { client-identifier client-identifier | hardware-address hardware-address [ ethernet | token-ring ] }
缺省情況下,未配置靜態地址綁定。
多次執行本命令,可以配置多個靜態地址綁定。同一地址隻能綁定給一個客戶端。若需修改綁定必須先解除綁定。
(5) 指定TFTP服務器。請選擇其中一項進行配置。
¡ 配置DHCP客戶端使用的TFTP服務器地址。
tftp-server ip-address ip-address
缺省情況下,未配置DHCP客戶端使用的TFTP服務器地址。
¡ 配置DHCP客戶端使用的TFTP服務器名。
tftp-server domain-name domain-name
缺省情況下,未配置DHCP客戶端使用的TFTP服務器名。
使用此方式指定TFTP服務器需要在網絡中架設DNS服務器。
(6) 配置DHCP客戶端使用的啟動配置文件名。
bootfile-name bootfile-name
缺省情況下,未配置DHCP客戶端使用的啟動配置文件名。
(1) 進入係統視圖。
system-view
(2) 開啟DHCP服務。
dhcp enable
缺省情況下,DHCP服務處於關閉狀態。
(3) 創建DHCP地址池,並進入DHCP地址池視圖。
dhcp server ip-pool pool-name
(4) 為客戶端分配IP地址。請至少選擇其中一項進行配置。
¡ 配置DHCP地址池動態分配的主網段。
network network-address [ mask-length | mask mask ]
缺省情況下,未配置動態分配的主網段。
¡ 配置靜態地址綁定。
static-bind ip-address ip-address [ mask-length | mask mask ] { client-identifier client-identifier | hardware-address hardware-address [ ethernet | token-ring ] }
缺省情況下,未配置靜態地址綁定。
多次執行本命令,可以配置多個靜態地址綁定。同一地址隻能綁定給一個客戶端。若需修改綁定必須先解除綁定。
(5) 配置DHCP客戶端使用的遠程啟動配置文件的SFTP形式URL。
bootfile-name url
缺省情況下,未配置DHCP客戶端使用的遠程啟動配置文件的SFTP形式URL。
(1) 進入係統視圖。
system-view
(2) 開啟DHCP服務。
dhcp enable
缺省情況下,DHCP服務處於關閉狀態。
(3) 創建DHCP地址池,並進入DHCP地址池視圖。
dhcp server ip-pool pool-name
(4) 為客戶端分配IP地址。請至少選擇其中一項進行配置。
¡ 配置DHCP地址池動態分配的主網段。
network network-address [ mask-length | mask mask ]
缺省情況下,未配置動態分配的主網段。
¡ 配置靜態地址綁定。
static-bind ip-address ip-address [ mask-length | mask mask ] { client-identifier client-identifier | hardware-address hardware-address [ ethernet | token-ring ] }
缺省情況下,未配置靜態地址綁定。
多次執行本命令,可以配置多個靜態地址綁定。同一地址隻能綁定給一個客戶端。若需修改綁定必須先解除綁定。
(5) 配置DHCP客戶端使用的遠程啟動配置文件的FTP形式URL。
bootfile-name url
缺省情況下,未配置DHCP客戶端使用的遠程啟動配置文件的FTP形式URL。
在使用服務器自動配置功能時,在如下兩種情況時,管理員需要配置DNS服務器:
· 為設備獲取到配置文件名稱。當TFTP服務器上不存在主機名文件時,執行服務器自動配置的設備可以通過DNS服務器將設備自己的IP地址解析為主機名,並使用該主機名從TFTP服務器獲取到同名的配置文件;
· 獲取文件服務器的IP地址。如果設備從DHCP應答報文中獲取到文件服務器的域名,設備還可以通過DNS服務器將文件服務器的域名解析為文件服務器的IP地址。
關於DNS服務器的詳細介紹,請參見“三層技術-IP業務配置指導”中的“域名解析”。
如果DHCP服務器、文件服務器和DNS服務器與執行服務器自動配置的設備不在同一網段,則需要部署網關設備,使得各個服務器和設備之間路由可達,並在網關上配置DHCP中繼功能。
如果DHCP應答報文中不包括TFTP服務器IP地址和域名信息,或TFTP服務器IP地址和域名信息不合法,設備將以廣播方式向TFTP服務器發送請求消息。由於廣播報文隻能在本網段內傳播,如果設備與TFTP服務器不在同一個網段,則需要在網關設備上配置UDP Helper功能,將廣播報文轉換成單播報文,轉發給指定的TFTP服務器。有關UDP Helper功能的詳細介紹,請參見“三層技術-IP業務配置指導”中的“UDP-helper”。
(1) 上電啟動需要進行自動配置的設備。
(2) 設備進入服務器自動配置,獲取並執行配置文件成功,則整個服務器自動配置過程結束。
(3) 在完成自動配置的設備上保存配置。
save
建議在配置文件執行完成後保存配置。本命令的詳細介紹請參見“基礎配置命令參考”中的“配置文件管理”。
如果獲取不到自動配置文件,則本次自動配置嚐試失敗,設備將繼續嚐試自動配置。用戶可以等待嚐試次數達到上限,設備自動結束自動配置,或根據提示信息,使用<Ctrl+C>或<Ctrl+D>快捷鍵手工終止自動配置。自動配置失敗並結束後,設備將以空配置啟動。
設備空配置啟動進入自動配置流程後,首先嚐試通過從U盤進行自動配置。U盤自動配置支持如下兩種方式:
· 使用索引文件指定的配置文件進行自動配置。
· 直接使用配置文件進行自動配置。
設備將優先使用索引文件指定的配置文件進行自動配置,若無索引文件,則再使用配置文件進行自動配置。
管理員將索引文件和配置文件保存在U盤上,設備在啟動時可以自動從U盤上的索引文件獲取並執行配置文件,實現自動配置功能。
通過索引文件進行自動配置的流程如下:
(1) 設備檢測到U盤在位。
(2) 設備檢測U盤中是否存在“smart_config.ini”索引文件。
¡ 如果存在“smart_config.ini”索引文件,則進入步驟(3)。
¡ 如果不存在“smart_config.ini”索引文件,則僅使用配置文件進行自動配置。
(3) 設備檢測“smart_config.ini”索引文件格式的合法性。
¡ 如果合法,則進入步驟(4)。
¡ 如果不合法,則U盤自動配置失敗,流程結束,在U盤中生成錯誤報告。
(4) 設備將“smart_config.ini”索引文件中指定的數據變更時間標誌與設備中記錄的上次U盤自動配置的時間標誌進行比較。
¡ 如果不相同,則進入步驟(5)。
¡ 如果相同,則U盤自動配置失敗,流程結束,在U盤中生成錯誤報告。
(5) 設備按照“smart_config.ini”索引文件中的描述信息從U盤中獲取配置文件,並將其保存至默認的存儲介質中。
¡ 如果獲取配置文件成功,則進入步驟(6)。
¡ 如果獲取配置文件失敗,則U盤自動配置失敗,流程結束,在U盤中生成錯誤報告。
(6) 設備根據獲取的配置文件或者指定的激活方式,判斷是否需要重啟激活。
¡ 如果不需要重啟,則在線激活相應文件,進入步驟(7)。
¡ 如果需要重啟,設備會將相應的文件設置為下次啟動文件,自動重啟成功後,進入步驟(7)。
(7) U盤自動配置成功。自動配置成功後,會將U盤中配置文件的配置覆蓋設備當前的配置,並將該配置設置為設備下次啟動時的配置。流程結束,將U盤從設備中拔出。
U盤自動配置之前,需要先製作索引文件並將索引文件保存至U盤根目錄下。把需要加載的配置文件保存至索引文件指定的U盤目錄下。
使用索引文件進行自動配置時,索引文件的名稱必須為“smart_config.ini”。
用戶可以在PC上編輯U盤自動配置索引文件,具體步驟如下:
(1) 新建一個空的文本文檔。
(2) 按照U盤自動配置索引文件模板編輯文件內容。
(3) 將此文本文檔另存為“smart_config.ini”。
(4) 將索引文件smart_config.ini拷貝至U盤,此文件必須保存至U盤根目錄下。
索引文件中各字段的含義如表1-3所示。
字段 |
描述 |
|
BEGIN LSW |
必選字段。起始標誌,此字段不能修改 |
|
GLOBAL CONFIG |
必選字段。全局配置起始標誌,此字段不能修改 |
|
TIMESN |
必選字段。數據變更時間標誌,字符串格式,長度範圍為1~16,不能包含空格。建議格式:年月日.時分秒。 例如,2011年06月28日08時09分10秒,可設置為TIMESN=20110628.080910。 每個TIMESN對應某台升級的設備。在U盤自動配置過程中,設備會在重啟前記錄此TIMESN(升級後不需要重啟的則在升級完成後記錄),下次升級不可使用此TIMESN。如果由於某些原因造成在設備重啟後升級失敗,則需要將TIMESN重新修改後再進行U盤自動配置 |
|
AUTODELFILE |
可選字段。表示是否允許升級後自動刪除原有係統軟件 · AUTODELFILE=YES:刪除 · AUTODELFILE=NO:不刪除 缺省情況下,AUTODELFILE為NO。如果該字段不存在、為空或是不合法值,均表示為缺省情況 有兩種AUTODELFILE字段:全局字段和單台設備字段。 位於[GLOBAL CONFIG]字段內的是全局字段,位於[DEVICE DESCRIPTION]內的是單台設備字段。 如果單台設備設置了此字段的值為YES或NO,則以單台設備設置的生效。如果單台設備沒有設置此字段或者此字段為空,則以全局設置的生效 |
|
AUTOOVERWRITEFILE |
可選字段。表示從U盤拷貝配置文件到設備上時,如果設備上有同名配置文件,是否允許覆蓋設備上的同名配置文件 · AUTOOVERWRITEFILE =YES:覆蓋 · AUTOOVERWRITEFILE =NO:不覆蓋 缺省情況下,AUTOOVERWRITEFILE為YES。如果該字段不存在、為空或是不合法值,均表示為缺省情況 |
|
ACTIVEMODE |
可選字段。表示文件拷貝完成後的文件激活方式。 · DEFAULT:按照各個文件的默認方式激活。其中,係統軟件默認激活方式是重啟設備;配置文件、補丁文件默認激活方式是不重啟設備,在線激活 · REBOOT:采用重啟設備的方式激活。缺省情況下,ACTIVEMODE為DEFAULT。如果該字段不存在、為空或是不合法值,均表示為缺省情況。有兩種ACTIVEMODE字段:全局字段和單台設備字段。位於[GLOBAL CONFIG]字段內的是全局字段,位於[DEVICE DESCRIPTION]內的是單台設備字段 如果單台設備設置了此字段的值為DEFAULT或REBOOT,則以單台設備設置的生效。如果單台設備沒有設置此字段或者此字段為空,則以全局設置的生效 |
|
DEVICE DESCRIPTION |
必選字段。單台設備文件信息描述起始標誌 DEVICE DESCRIPTION字段下表示單台設備信息的每個字段不可以重複出現,否則將不匹配這個DEVICE。 DEVICE按照文件中定義的順序從上到下進行匹配,匹配到一組之後不會再匹配其它DEVICE |
|
OPTION |
可選字段。單台設備文件信息有效標誌,表示該設備文件信息是否有效。 · OPTION=OK:有效 · OPTION=NOK:無效,此單台設備的文件信息都無需判斷 缺省情況下,OPTION為OK。如果該字段不存在、為空或是不合法值,均表示為缺省情況 |
|
SN |
可選字段。設備序列號。如果SN=DEFAULT,表示不匹配ESN序列號,否則需要和設備匹配SN。 缺省情況下,ESN為DEFAULT。如果該字段不存在或為空,則表示為缺省情況 |
待升級的設備將在索引文件中按DEVICE從上往下進行匹配,匹配的優先級為:MAC > SN > DEVICETYPE > DEFAULT。一旦匹配上,則按匹配上的DEVICE信息加載文件,如果此過程出錯,將不會再次進行匹配,隻會輸出錯誤報告 |
MAC |
可選字段。設備MAC地址,格式為:XXXX-XXXX-XXXX,X為十六進製數。如果MAC=DEFAULT,表示不匹配MAC地址,否則需要和設備匹配MAC地址 缺省情況下,MAC為DEFAULT。如果該字段不存在或為空,則表示為缺省情況 |
|
DEVICETYPE |
可選字段。表示與設備的類型匹配,例如S12700。如果DEVICETYPE=DEFAULT,表示不匹配設備類型。否則需要和設備的類型匹配 缺省情況下,DEVICETYPE為DEFAULT。如果該字段不存在或為空,則表示為缺省情況 |
|
DIRECTORY |
可選字段。配置文件或軟件包在U盤中存放的目錄。 此字段為空或不存在時,表示文件位於U盤根目錄下。 DIRECTORY=/abc,表示文件位於U盤的abc文件夾下。 缺省情況下,DIRECTORY字段為空。 索引文件中文件目錄的格式必須與設備的文件係統一致,且索引文件中文件目錄需要符合如下要求: · 目錄深度小於等於4級。目錄必須以“/”開頭,每一級目錄以“/”隔開,但不能以“/”結束,例如/abc/test是合法目錄,/abc/test/則是非法目錄。 · 每一級目錄的字符串長度範圍是1~15。 · 目錄名使用的字符不可以是空格、“~” 、“*” 、“/” 、“\” 、“:” 、“'” 、“"” 、“<” 、“>” 、“|” 、“?” 、“[” 、“]”、“%” 等字符,目錄名稱不區分大小寫 |
|
SYSTEM-IPE= |
可選字段。係統版本名稱,後綴名為“.ipe” |
|
SYSTEM-BOOT-BIN= |
可選字段。Boot軟件包名稱,後綴名為“.bin” |
|
SYSTEM-SYSTEM-BIN= |
可選字段。system軟件包名稱,後綴名為“.bin” |
|
SYSTEM-FEATURE-BIN= |
可選字段。特性軟件包名稱,後綴名為“.bin |
|
SYSTEM-PATCH-BIN= |
可選字段。係統軟件名稱,後綴名為“.bin” |
|
SYSTEM-CONFIG |
可選字段。配置文件名稱,後綴名為“.cfg” |
|
END LSW |
必選字段。文件結束標誌 |
索引文件模板如下:
BEGIN LSW
[GLOBAL CONFIG]
TIMESN=
AUTOOVERWRITEFILE=
AUTODELFILE=
ACTIVEMODE=
[DEVICE DESCRIPTION]
OPTION=
SN=
MAC=
AUTODELFILE=
ACTIVEMODE=
DEVICETYPE=
DIRECTORY=
SYSTEM-IPE=
SYSTEM-BOOT-BIN=
SYSTEM-SYSTEM-BIN=
SYSTEM-FEATURE-BIN=
SYSTEM-FEATURE-BIN=
SYSTEM-FEATURE-BIN=
SYSTEM-PATCH-BIN=
SYSTEM-CONFIG=
END LSW
編輯U盤自動配置索引文件時,請確保索引文件內容的正確性。待升級的設備將在索引文件中按DEVICE從上往下進行匹配,匹配的優先級為:MAC > SN > DEVICETYPE。一旦匹配上,則按匹配上的DEVICE信息進行加載文件,如果此過程出錯,將終止整個U盤自動配置進程,並輸出錯誤報告。成功升級的設備不會回滾配置。
通過索引文件自動配置時,設備會根據索引文件確認需要加載的文件:
(1) 第一步確認索引文件中是否指定了IPE文件:如果在索引文件中指定了IPE文件,則確認加載IPE文件,然後跳過第二步進行第三步;如果在索引文件中沒有指定IPE文件,則設備會跳過第一步進行第二步。
(2) 第二步確認索引文件中是否指定了Boot、System和Feature文件:如果在索引文件中指定了Boot、System和Feature文件,則確認加載對應的文件,其中Boot和System文件為必選,Feature文件為可選。確認加載對應的文件後會進行第三步。如果在索引文件中沒有指定Boot、System和Feature文件,則跳過第二步並進行第三步。
(3) 第三步確認索引文件中是否指定了Patch文件:如果在索引文件中指定了Patch文件,則確認加載Patch文件,然後跳過第三步進行第四步;如果在索引文件中沒有指定Patch文件,則設備會跳過第三步進行第四步。
(4) 第四步確認索引文件中是否指定了CFG配置文件:如果在索引文件中是否指定了CFG配置文件則確認加載CFG配置文件。在進行第四步後設備會開始加載需要加載的文件。如果在索引文件中未指定CFG配置文件,則設備會跳過加載文件的步驟。
在進行第四步後設備會開始加載需要加載的文件,如果加載失敗,則設備會終止U盤自動配置進程。
· 編寫索引文件時,按照固定格式輸入一行後必須回車換行後再進行新內容的編寫,編寫完成請注意保存索引文件。
· 如果某項關鍵字沒有匹配或者沒有搜索到,則認為該項的參數內容為空。
· 當設備的“GLOBAL CONFIG”中的全局配置與匹配的“DEVICE DESCRIPTION”中的單台設備配置的相同字段的配置不同時,以“DEVICE DESCRIPTION”中的配置為準。
(1) 開啟U盤自動配置功能。
a. 進入係統視圖。
system-view
b. 開啟U盤自動配置功能。
autodeploy udisk enable
缺省情況下,U盤自動配置功能處於開啟狀態。
若設備預先關閉了U盤自動配置功能,則配置本命令後需要保存配置並重啟設備後才能生效。
c. 保存當前配置。
save
(2) 製作索引文件。
(3) 將製作好的索引文件保存到U盤根目錄下,將索引文件中定義的開局文件保存到指定目錄,缺省為根目錄。
(4) 將U盤插入主設備的USB1接口,即usba0:。配置文件會從主設備自動同步到備設備。
(5) 觀察指示燈。
如果配置文件下發失敗,設備會把失敗的日誌寫到U盤根目錄下,日誌文件名為“配置文件全名.log”。管理員可以根據日誌信息進行問題定位和處理。
(6) 可以執行display current-configuration命令查看U盤中的配置是否已正確加載,該命令的詳細介紹請參見“基礎配置命令參考”中的“配置文件管理”。
(7) U盤自動配置完成後需拔出U盤。
管理員將配置文件保存在U盤上,設備在啟動時可以自動從U盤上獲取並執行配置文件,實現自動配置功能。
使用配置文件進行自動配置的流程如下:
(1) 設備檢測到U盤在位。
(2) 設備檢測U盤中是否存在“smart_config.ini”索引文件。
¡ 如果存在“smart_config.ini”索引文件,則使用索引文件指定的配置文件進行自動配置。
¡ 如果不存在“smart_config.ini”索引文件,則進入步驟(3)。
(4) 設備啟動過程中,檢測U盤中是否存在.cfg格式的配置文件。
¡ 如果存在,則進入步驟(5)。
¡ 如果不存在,則U盤自動配置流程結束。
(5) 設備從U盤獲取到配置文件後,比較該配置文件與設備上的當前主配置文件內容是否相同:
¡ 如果文件內容相同,設備將直接使用當前主用配置文件,不使用U盤上的配置文件。
¡ 如果文件內容不相同,則設備將U盤中的配置文件複製到本地,並執行步驟(6)。
設備本地存儲中有重名配置文件時,根據本地配置文件的屬性采用如下處理方式:
- 如果本地重名配置文件為當前主用配置文件,則設備將該文件以“原名_bak.cfg”為名稱另存。
- 如果本地重名配置文件不是當前主用配置文件,則設備直接使用U盤中的配置文件覆蓋本地重名文件。
(6) 設備執行U盤配置文件。
¡ 若設備執行U盤配置文件成功,則自動將U盤中配置文件的配置設置為設備當前的配置,並從U盤拷貝的配置文件設置為下次啟動的主用配置文件。
¡ 若設備執行U盤配置文件中的某條命令失敗時,則會忽略U盤配置文件中的所有配置,使用設備之前保存的配置文件;如果設備之前未保存配置文件,則設備空配置啟動。
(1) 準備一個沒有分區的U盤。
(2) 查詢設備的序列號。
display device manuinfo
該命令的詳細介紹請參見“基礎配置命令參考”中的“設備管理”。
(3) 創建配置文件名為“設備序列號.cfg”或“autodeploy.cfg”的配置文件,並保存在U盤的根目錄中。
若U盤中同時存在“設備序列號.cfg”和“autodeploy.cfg”文件時,設備優先使用配置文件“設備序列號.cfg”。
(1) 開啟U盤自動配置功能。
a. 進入係統視圖。
system-view
b. 開啟U盤自動配置功能。
autodeploy udisk enable
缺省情況下,U盤自動配置功能處於開啟狀態。
若設備預先關閉了U盤自動配置功能,則配置本命令後需要保存配置並重啟設備後才能生效。
c. 保存當前配置。
save
(2) 將U盤插入主設備的USB1接口,即usba0:。配置文件會從主設備自動同步到備設備。
(3) 手動重啟設備並觀察指示燈。
如果配置文件下發失敗,設備會把失敗的日誌寫到U盤根目錄下,日誌文件名為“配置文件全名.log”。管理員可以根據日誌信息進行問題定位和處理。
(4) 設備啟動完成後,可以執行display current-configuration命令查看U盤中的配置是否已正確加載,該命令的詳細介紹請參見“基礎配置命令參考”中的“配置文件管理”。
(5) U盤自動配置完成後需拔出U盤。
如圖1-2所示,某公司下屬兩個部門:市場部門和研發部門,兩個部門通過不同的網關設備連入網絡。要求連接終端主機的設備Switch D、Switch E、Switch F和Switch G執行自動配置功能,啟動後自動獲取並執行配置文件,以實現:
· 網絡管理員能夠通過Telnet方式登錄、控製設備。
· 登錄設備時需要進行認證,且登錄不同部門的設備使用的用戶名和密碼不能相同,以提供一定的安全保證。
具體組網情況如下:
· Switch A作為DHCP服務器,分別為市場部和研發部的主機分配IP地址和其他網絡配置參數。
· 網關Switch B和Switch C作為DHCP中繼設備。
· 一台運行TFTP管理軟件的TFTP服務器上保存配置文件。
(1) Switch A的配置
# 配置接口IP地址
<SwitchA> system-view
[SwitchA] vlan 2
[SwitchA-vlan2] port gigabitethernet 1/0/1
[SwitchA-vlan2] quit
[SwitchA] interface vlan-interface 2
[SwitchA-Vlan-interface2] ip address 192.168.1.42 24
[SwitchA-Vlan-interface2] quit
# 開啟DHCP服務。
[SwitchA] dhcp enable
# 配置VLAN接口2工作在DHCP服務器模式。
[SwitchA] interface vlan-interface 2
[SwitchA-Vlan-interface2] dhcp select server
[SwitchA-Vlan-interface2] quit
# 配置DHCP地址池market,為市場部動態分配192.168.2.0/24網段的地址,並指定TFTP server地址、網關地址和配置文件名。
[SwitchA] dhcp server ip-pool market
[SwitchA-dhcp-pool-market] network 192.168.2.0 24
[SwitchA-dhcp-pool-market] tftp-server ip-address 192.168.1.40
[SwitchA-dhcp-pool-market] gateway-list 192.168.2.1
[SwitchA-dhcp-pool-market] bootfile-name market.cfg
[SwitchA-dhcp-pool-market] quit
# 配置DHCP地址池rd,為研發部動態分配192.168.3.0/24網段的地址,並指定TFTP server地址、網關地址和配置文件名。
[SwitchA] dhcp server ip-pool rd
[SwitchA-dhcp-pool-rd] network 192.168.3.0 24
[SwitchA-dhcp-pool-rd] tftp-server ip-address 192.168.1.40
[SwitchA-dhcp-pool-rd] gateway-list 192.168.3.1
[SwitchA-dhcp-pool-rd] bootfile-name rd.cfg
[SwitchA-dhcp-pool-rd] quit
# 配置到達DHCP中繼的靜態路由。
[SwitchA] ip route-static 192.168.2.0 24 192.168.1.41
[SwitchA] ip route-static 192.168.3.0 24 192.168.1.43
[SwitchA] quit
(2) Switch B的配置
# 配置接口的IP地址
<SwitchB> system-view
[SwitchB] vlan 2
[SwitchB-vlan2] port gigabitethernet 1/0/3
[SwitchB-vlan2] quit
[SwitchB] interface vlan-interface 2
[SwitchB-Vlan-interface2] ip address 192.168.1.41 24
[SwitchB-Vlan-interface2] quit
[SwitchB] vlan 3
[SwitchB-vlan3] port gigabitethernet 1/0/1
[SwitchB-vlan3] port gigabitethernet 1/0/2
[SwitchB-vlan3] quit
[SwitchB] interface vlan-interface 3
[SwitchB-Vlan-interface3] ip address 192.168.2.1 24
[SwitchB-Vlan-interface3] quit
# 開啟DHCP服務。
[SwitchB] dhcp enable
# 配置VLAN接口3工作在DHCP中繼模式。
[SwitchB] interface vlan-interface 3
[SwitchB-Vlan-interface3] dhcp select relay
# 配置DHCP服務器的地址。
[SwitchB-Vlan-interface3] dhcp relay server-address 192.168.1.42
(3) Switch C的配置
# 配置接口的IP地址
<SwitchC> system-view
[SwitchC] vlan 2
[SwitchC-vlan2] port gigabitethernet 1/0/3
[SwitchC-vlan2] quit
[SwitchC] interface vlan-interface 2
[SwitchC-Vlan-interface2] ip address 192.168.1.43 24
[SwitchC-Vlan-interface2] quit
[SwitchC] vlan 3
[SwitchC-vlan3] port gigabitethernet 1/0/1
[SwitchC-vlan3] port gigabitethernet 1/0/2
[SwitchC-vlan3] quit
[SwitchC] interface vlan-interface 3
[SwitchC-Vlan-interface3] ip address 192.168.3.1 24
[SwitchC-Vlan-interface3] quit
# 開啟DHCP服務。
[SwitchC] dhcp enable
# 配置VLAN接口3工作在DHCP中繼模式。
[SwitchC] interface vlan-interface 3
[SwitchC-Vlan-interface3] dhcp select relay
# 配置DHCP服務器的地址。
[SwitchC-Vlan-interface3] dhcp relay server-address 192.168.1.42
(4) TFTP服務器配置
在TFTP server創建配置文件market.cfg,文件內容如下:
#
sysname Market
#
telnet server enable
#
vlan 3
#
local-user market
password simple build22345
service-type telnet
quit
#
interface Vlan-interface3
ip address dhcp-alloc
quit
#
interface gigabitethernet 1/0/1
port access vlan 3
quit
#
user-interface vty 0 63
authentication-mode scheme
user-role network-admin
#
return
在TFTP服務器創建配置文件rd.cfg,文件內容如下:
#
sysname RD
#
telnet server enable
#
vlan 3
#
local-user rd
password simple create22345
service-type telnet
quit
#
interface Vlan-interface3
ip address dhcp-alloc
quit
#
interface gigabitethernet 1/0/1
port access vlan 3
quit
#
user-interface vty 0 63
authentication-mode scheme
user-role network-admin
#
return
# 啟動TFTP管理軟件,並指定TFTP的工作路徑為保存上述配置文件的路徑。
# 以Windows XP係統的主機為例,需保證TFTP服務器與DHCP中繼之間路由可達。
(1) Switch D、Switch E、Switch F和Switch G在沒有配置文件的情況下啟動。啟動成功後,在Switch A上查看地址池中的地址綁定信息。
<SwitchA> display dhcp server ip-in-use
IP address Client-identifier/ Lease expiration Type
Hardware address
192.168.2.2 3030-3066-2e65-3233- May 6 05:21:25 2013 Auto(C)
642e-3561-6633-2d56-
6c61-6e2d-696e-7465-
7266-6163-6533
192.168.2.3 3030-3066-2e65-3230- May 6 05:22:50 2013 Auto(C)
302e-3232-3033-2d56-
6c61-6e2d-696e-7465-
7266-6163-6533
192.168.3.2 3030-6530-2e66-6330- May 6 05:23:15 2013 Auto(C)
302e-3335-3131-2d56-
6c61-6e2d-696e-7465-
7266-6163-6531
192.168.3.3 3030-6530-2e66-6330- May 6 05:24:10 2013 Auto(C)
302e-3335-3135-2d56-
6c61-6e2d-696e-7465-
7266-6163-6532
(2) 在Switch A上執行如下命令:
<SwitchA> telnet 192.168.2.2
(3) 輸入用戶名market、密碼build22345後,可以登錄Switch D或Switch E。
如圖1-3所示,Switch A啟動後自動從HTTP服務器獲取Tcl腳本啟動配置文件,並執行該文件,以實現:
· 網絡管理員能夠通過Telnet方式登錄、控製設備。
· 登錄設備時需要進行認證,以提供一定的安全保證。
(1) 配置DHCP服務器
# 開啟DHCP服務,創建名稱為1的DHCP地址池,配置地址池動態分配IP地址的網段為192.168.1.0/24。
<DeviceA> system-view
[DeviceA] dhcp enable
[DeviceA] dhcp server ip-pool 1
[DeviceA-dhcp-pool-1] network 192.168.1.0 24
# 配置DHCP客戶端遠程啟動配置文件為HTTP形式的URL。
[DeviceA-dhcp-pool-1] bootfile-name http://192.168.1.40/device.tcl
(2) 配置HTTP服務器,保證Switch A可以從HTTP服務器成功下載配置文件device.tcl。
# 在HTTP服務器創建配置文件device.tcl,文件內容如下:
system-view
telnet server enable
local-user user
password simple hello22345
service-type telnet
quit
user-interface vty 0 63
authentication-mode scheme
user-role network-admin
quit
interface gigabitethernet 1/0/1
port link-mode route
ip address dhcp-alloc
return
# 啟動HTTP管理軟件,開啟HTTP服務(配置過程略)。
(1) Switch A在沒有配置文件的情況下啟動。啟動成功後,在Device A上查看地址池中的地址綁定信息。
<DeviceA> display dhcp server ip-in-use
IP address Client identifier/ Lease expiration Type
Hardware address
192.168.1.2 0030-3030-632e-3239- Dec 12 17:41:15 2013 Auto(C)
3035-2e36-3736-622d-
4574-6830-2f30-2f32
(2) 在Device A上執行如下命令:
<SwitchA> telnet 192.168.1.2
(3) 輸入用戶名user、密碼hello22345後,用戶可以登錄Switch A。
如圖1-4所示,Switch A啟動後自動從HTTP服務器獲取Python腳本啟動配置文件,並執行該文件,以實現:
· 網絡管理員能夠通過Telnet方式登錄、控製設備。
· 登錄設備時需要進行認證,以提供一定的安全保證。
圖1-4 服務器自動配置組網圖(HTTP Python方式)
(1) 配置DHCP服務器
# 開啟DHCP服務,創建名稱為1的DHCP地址池,配置地址池動態分配IP地址的網段為192.168.1.0/24。
<DeviceA> system-view
[DeviceA] dhcp enable
[DeviceA] dhcp server ip-pool 1
[DeviceA-dhcp-pool-1] network 192.168.1.0 24
# 配置DHCP客戶端遠程啟動配置文件為HTTP形式的URL。
[DeviceA-dhcp-pool-1] bootfile-name http://192.168.1.40/device.py
(2) 配置HTTP服務器,保證Switch A可以從HTTP服務器成功下載配置文件device.py。
# 在HTTP服務器創建配置文件device.py,文件內容如下:
#!usr/bin/python
import plathformtools
plathformtools.CLI(‘system-view ;telnet server enable ;local-user user ;password simple hello22345 ;service-type telnet ;quit ;user-interface vty 0 63 ;authentication-mode scheme ;user-role network-admin ;quit ;interface gigabitethernet 1/0/1 ;port link-mode route ; ip address dhcp-alloc ;return’)
# 啟動HTTP管理軟件,開啟HTTP服務(配置過程略)。
(1) Switch A在沒有配置文件的情況下啟動。啟動成功後,在Device A上查看地址池中的地址綁定信息。
<DeviceA> display dhcp server ip-in-use
IP address Client identifier/ Lease expiration Type
Hardware address
192.168.1.2 0030-3030-632e-3239- Dec 12 17:41:15 2013 Auto(C)
3035-2e36-3736-622d-
4574-6830-2f30-2f32
(2) 在Device A上執行如下命令:
<DeviceA> telnet 192.168.1.2
(3) 輸入用戶名user、密碼hello22345後,用戶可以登錄Switch A。
如圖1-5所示,Switch A啟動後自動從SFTP服務器自動獲取並執行配置文件,以實現:
· 網絡管理員能夠通過Telnet方式登錄、控製設備。
· 登錄設備時需要進行認證,以提供一定的安全保證。
(1) 配置DHCP服務器
# 開啟DHCP服務,創建名稱為1的DHCP地址池,配置地址池動態分配IP地址的網段為192.168.1.0/24。
<DeviceA> system-view
[DeviceA] dhcp enable
[DeviceA] dhcp server ip-pool 1
[DeviceA-dhcp-pool-1] network 192.168.1.0 24
# 配置DHCP客戶端遠程啟動配置文件為SFTP形式的URL,user和pass為SFTP 服務器中對應用戶及其密碼。
[DeviceA-dhcp-pool-1] bootfile-name sftp://user%dd:pass@192.168.1.40:22/device.cfg
(2) 配置SFTP服務器,保證Switch A可以從SFTP服務器成功下載配置文件device.cfg。
# 在SFTP服務器創建配置文件device.cfg,文件內容如下:
#
telnet server enable
#
local-user user
password simple hello12345
service-type telnet
quit
#
user-interface vty 0 63
authentication-mode scheme
user-role network-admin
quit
#
interface gigabitethernet 1/0/1
port link-mode route
ip address dhcp-alloc
return
# 啟動SFTP管理軟件,開啟SFTP服務(配置過程略)。
(1) Switch A在沒有配置文件的情況下啟動。啟動成功後,在Device A上查看地址池中的地址綁定信息。
<DeviceA> display dhcp server ip-in-use
IP address Client identifier/ Lease expiration Type
Hardware address
192.168.1.2 0030-3030-632e-3239- Dec 12 17:41:15 2013 Auto(C)
3035-2e36-3736-622d-
4574-6830-2f30-2f32
(2) 在Device A上執行如下命令:
<SwitchA> telnet 192.168.1.2
(3) 輸入用戶名user、密碼hello12345後,用戶可以登錄Switch A。
如圖1-6所示,Switch A啟動後自動從FTP服務器自動獲取並執行配置文件,以實現:
· 網絡管理員能夠通過Telnet方式登錄、控製設備。
· 登錄設備時需要進行認證,以提供一定的安全保證。
(1) 配置DHCP服務器
# 開啟DHCP服務,創建名稱為1的DHCP地址池,配置地址池動態分配IP地址的網段為192.168.1.0/24。
<DeviceA> system-view
[DeviceA] dhcp enable
[DeviceA] dhcp server ip-pool 1
[DeviceA-dhcp-pool-1] network 192.168.1.0 24
# 配置DHCP客戶端遠程啟動配置文件為FTP形式的URL,user和pass為FTP 服務器中對應用戶及其密碼。
[DeviceA-dhcp-pool-1] bootfile-name ftp://user:pass@192.168.1.40:22/device.cfg
(2) 配置FTP服務器,保證Switch A可以從FTP服務器成功下載配置文件device.cfg。
# 在FTP服務器創建配置文件device.cfg,文件內容如下:
#
telnet server enable
#
local-user user
password simple hello12345
service-type telnet
quit
#
user-interface vty 0 63
authentication-mode scheme
user-role network-admin
quit
#
interface gigabitethernet 1/0/1
port link-mode route
ip address dhcp-alloc
return
# 啟動FTP管理軟件,開啟FTP服務(配置過程略)。
(1) Switch A在沒有配置文件的情況下啟動。啟動成功後,在Device A上查看地址池中的地址綁定信息。
<DeviceA> display dhcp server ip-in-use
IP address Client identifier/ Lease expiration Type
Hardware address
192.168.1.2 0030-3030-632e-3239- Dec 12 17:41:15 2013 Auto(C)
3035-2e36-3736-622d-
4574-6830-2f30-2f32
(2) 在Device A上執行如下命令:
<SwitchA> telnet 192.168.1.2
(3) 輸入用戶名user、密碼hello12345後,用戶可以登錄Switch A。
如圖1-7所示,Switch A和Switch B通過管理以太網口分別與HTTP服務器和Device A相連。Device A上開啟DHCP服務。為網絡中的設備動態分配192.168.1.0/24網段的IP地址。
現要求通過自動配置實現Switch A和Switch B根據腳本自動執行IRF配置的相關命令。然後再連接Switch A和Switch B之間的線纜,完成IRF的建立。
圖1-7 服務器自動配置實現IRF零配置組網圖
(1) 配置設備接口地址,保證設備間路由可達。
配置HTTP服務器。啟動HTTP管理軟件,開啟HTTP服務(配置過程略)。針對IRF零配置,HTTP服務器上需要配置Python腳本文件、配置文件、sn.txt和軟件啟動包等文件。以下是關於各文件的介紹:
· Python腳本文件:Python腳本是設備進行IRF零配置操作的主要文件,需要管理員自行準備並保存在HTTP服務器上。Python腳本需要完成的操作:
¡ 設備判斷flash是否存在足夠的存儲空間(可選);
¡ 設備從HTTP服務器下載配置文件;
¡ 設備從HTTP服務器下載啟動軟件包(可選);
¡ 設備從HTTP服務器下載sn.txt文件;
¡ 配置設備下次啟動時使用的啟動軟件包(可選);
¡ 解析sn.txt文件並修改設備的IRF成員編號;
¡ 配置設備下次啟動時使用的配置文件;
¡ 設備重新啟動。
Python腳本的具體內容如下(Python腳本中標注有簡單的中文注釋,使用時請將中文注釋刪除):
#!usr/bin/python
import comware
from time import strftime,gmtime,sleep
import signal
import os
import string
import commands
import hashlib
#python_config_file_mode
#'python_static'
#python_serial_number
#U can use 2 modes to obtain the config file
#- 'python_static'
#- 'python_serial_number'
python_config_file_mode = "python_serial_number"
#配置本次軟件升級設備flash所需的最小剩餘空間,單位為KB
#Required space to copy config kickstart and system image in KB
required_space = 500000
#配置HTTP服務器的相關參數:用戶名、密碼、HTTP服務器IP地址、VPN實例名稱、登錄的超時時間
#transfer information
username = ""
password = ""
hostname = "192.168.1.40"
protocol = "http"
vrf = ""
config_timeout = 120
irf_timeout = 120
image_timeout = 2100
#HTTP服務器的下載路徑
#Server File Path
server_path = ""
#下載到本地設備時,存放到Flash根目錄下
#Loacl File path
local_path = "flash:/"
#下載到設備之後的配置文件名
#Local config name
config_local_name = "startup.cfg"
#HTTP服務器上的配置文件名
#Server config name
config_server_name = "startup.cfg"
#下載到本地的啟動軟件包
#Local boot name
boot_local_name = "xxxx.ipe"
#HTTP服務器上的啟動軟件包
#Server boot name
boot_server_name = "xxxx.ipe"
#下載到本地的SN文件名
#Local irf name
irf_local_name = "sn.txt"
#HTTP服務器上的sn文件名
#Server irf name
irf_server_name = "sn.txt"
#設備本地上記錄升級日誌的log文件名
python_log_name = ""
#在設備上記錄升級日誌的方法
#Write Log File
def write2Log(info):
global python_log_name, local_path
if python_log_name == "":
try:
python_log_name = "%s%s_python_%s_script.log" %(local_path, strftime("%Y%m%d%H%M%S", gmtime()), os.getpid())
except Exception as inst:
print inst
fd = open(python_log_name, "a")
fd.write(info)
fd.flush()
fd.close()
#獲取設備的chassis號和slot號,與前麵定義的local_path變量,共同計算出文件本地的存放路徑
# get path according to the Chassis and Slot
def getPath(chassisID, slotID):
global local_path
path = ""
obj = comware.get_self_slot()
if (obj[0] == chassisID) and (obj[1] == slotID):
return local_path
if chassisID != -1:
path = "chassis%d#" % chassisID
if slotID != -1:
path = "%sslot%d#%s" %(path, slotID, local_path)
return path
#刪除下載到本地的文件
#Remove File
def removeFile(filename):
try:
os.remove(filename)
except os.error:
pass
#計算該設備需要刪除的文件數量
#Cleanup one device temp files
def cleanDeviceFiles(str, oDevNode):
global config_local_name, boot_local_name, irf_local_name
sFilePath = getPath(oDevNode[0], oDevNode[1])
if str == "error":
removeFile("%s%s" %(sFilePath, config_local_name))
removeFile("%s%s" %(sFilePath, boot_local_name))
removeFile("%s%s" %(sFilePath, irf_local_name))
removeFile("%s%s.md5" %(sFilePath, config_local_name))
removeFile("%s%s.md5" %(sFilePath, boot_local_name))
removeFile("%s%s.md5" %(sFilePath, irf_local_name))
write2Log("\ndelete %s all files\n" %sFilePath)
print "\ndelete %s all files" %sFilePath
#Cleanup files
def cleanupFiles(str):
aSlotRange = []
if ("get_standby_slot" in dir(comware)):
aSlotRange = aSlotRange + comware.get_standby_slot()
aSlotRange.append(comware.get_self_slot())
i = 0
while i < len(aSlotRange):
if(aSlotRange[i] != None):
cleanDeviceFiles(str, aSlotRange[i])
i = i + 1
#計算設備flash上的剩餘空間大小
#Verify if free space is available to download config, boot-loader image
def verifyfreespace(path):
global required_space
try:
s = os.statvfs(path)
freespace = (s.f_bavail * s.f_frsize) /1024
write2Log("\nthe %s free space is %s" %(path, freespace))
print "\n####the %s free space is %s####" %(path, freespace)
if required_space > freespace:
write2Log("\nthe %s space is not enough" % path)
print "\n####the %s space is not enough####" % path
return False
except Exception as inst:
write2Log("\nverify %s free space exception: %s" % (path, inst))
print "\n####verify %s free space exception: %s####" % (path, inst)
return False
return True
#判斷設備上的剩餘空間是否充足
#verify device freespace
def verifyDeviceFree(obj):
path = getPath(obj[0], obj[1])
if True != verifyfreespace(path):
return False
return True
#check all mpu free space
def verifyAllFreeSpace():
aSlotRange = []
if ("get_standby_slot" in dir(comware)):
aSlotRange = aSlotRange + comware.get_standby_slot()
aSlotRange.append(comware.get_self_slot())
bAllEnough = True
i = 0
while i < len(aSlotRange):
if(aSlotRange[i] != None) and (True != verifyDeviceFree(aSlotRange[i])):
bAllEnough = False
i = i + 1
return bAllEnough
def doExit(str):
if str == "success":
write2Log("\nThe script is running success!")
print "\n#### The script is running success! ####"
cleanupFiles("success")
comd = "reboot force"
comware.CLI(comd, False)
exit(0)
if str == "error":
write2Log("\nThe script is running failed!")
print "\n#### The script is running failed! ####"
cleanupFiles("error")
exit(1)
else:
exit(0)
#獲取軟件升級時chassis號和slot號參數
#get Chassis and Slot
def getChassisSlot(style):
if style == "master":
obj = comware.get_self_slot()
if len(obj) <= 0:
write2Log("\nget %s chassis and slot failed" % style)
print "\n####get %s chassis and slot failed####" % style
return None
return obj
#獲取啟動軟件包發生錯誤返回的信息
#signal terminal handler function
def sig_handler_no_exit(signum, function):
write2Log("\nSIGTERM Handler while configuring boot-loader variables")
print "\n####SIGTERM Handler while configuring boot-loader variables####"
#軟件升級過程發生錯誤時返回的信息
#signal terminal handler
def sigterm_handler(signum, function):
write2Log("\nSIGTERM Handler")
print "\n####SIGTERM Handler####"
cleanupFiles("error")
doExit("error")
#從HTTP服務器上下載文件
#transfer file
def doCopyFile(src = "", des = "", login_timeout = 10):
global username, password, hostname, protocol, vrf
print "INFO: Starting Copy of %s" % src
try:
removeFile(des)
obj = comware.Transfer(protocol, hostname, src, des, vrf, login_timeout, username, password)
if obj.get_error() != None:
write2Log("\ncopy %s failed: %s" % (src, obj.get_error()))
print "\n####copy %s failed: %s####" % (src, obj.get_error())
return False
except Exception as inst:
write2Log("\ncopy %s exception: %s" % (src, inst))
print "\n####copy %s exception: %s####" % (src, inst)
return False
write2Log("\ncopy file %s to %s success" % (src, des))
print "INFO: Completed Copy of %s" % src
return True
#Get MD5SUM from md5ConfigFile
def getMD5SumGiven(keyword, filename):
try:
file = open(filename, "r")
line = file.readline()
while "" != line:
if not string.find(line, keyword, 0, len(keyword)):
line = line.split("=")
line = line[1]
line = line.strip()
file.close()
return line
line = file.readline()
file.close()
except Exception as inst:
write2Log("\nget %s md5 exception: %s" % (filename, inst))
print "\n####get %s md5 exception: %s####" % (filename, inst)
return ""
#verify MD5SUM of the file
def verifyMD5sumofFile(md5sumgiven, filename):
if md5sumgiven == "":
write2Log("\nverify %s md5 error: the %s md5 file is error" %(filename, filename))
print "\n####verify %s md5 error: the %s md5 file is error####" %(filename, filename)
return False
try:
m = hashlib.md5()
f = open(filename, 'rb')
buffer = 8192
while 1:
chunk = f.read(buffer)
if not chunk:
break
m.update(chunk)
f.close()
md5calculated = m.hexdigest()
except Exception as inst:
write2Log("\nverify %s md5 exception: %s" % (filename, inst))
print "\n####verify %s md5 exception: %s####" % (filename, inst)
return False
if md5sumgiven == md5calculated:
return True
write2Log("\nverify %s md5 error: md5sumgiven is %s filemd5 is %s" %(filename, md5sumgiven, md5calculated))
print "\n####verify %s md5 error: md5sumgiven is %s filemd5 is %s####" %(filename, md5sumgiven, md5calculated)
return False
#Check MD5 file
def checkFile(src, dest):
src = "%s.md5" % src
destmd5 = "%s.md5" % dest
bFlag = doCopyFile(src, destmd5, 120)
if (True == bFlag) and (True == verifyMD5sumofFile(getMD5SumGiven("md5sum", destmd5), dest)):
write2Log("\ncheckFile success: %s" % destmd5)
print "\n####checkFile success: %s####" % destmd5
return True
elif (True != bFlag):
write2Log("\n%s is not exist! Don't verify the MD5 file!" % destmd5)
print "INFO: %s is not exist! Don't verify the MD5 file!" % destmd5
return True
return False
#Get config file according to the mode
def getCfgFileName():
global config_server_name
if (python_config_file_mode == "python_serial_number") and (os.environ.has_key('DEV_SERIAL')):
config_server_name = "%s.cfg" % os.environ['DEV_SERIAL']
return config_server_name
else:
return config_server_name
#copy file to all standby slot
def syncFileToStandby(sSrcFile, sFileName):
try:
aSlotRange = []
if ("get_standby_slot" in dir(comware)):
aSlotRange = aSlotRange + comware.get_standby_slot()
i = 0
while i < len(aSlotRange):
if(aSlotRange[i] != None):
sDestFile = "%s%s" %(getPath(aSlotRange[i][0], aSlotRange[i][1]), sFileName)
removeFile(sDestFile)
open(sDestFile,"wb").write(open(sSrcFile,"rb").read())
write2Log("\nsync file to standby %s" % (sDestFile))
print "\n####sync file to standby %s####" % (sDestFile)
i = i + 1
except Exception as inst:
write2Log("\nsync file to standby %s exception: %s" % (sSrcFile, inst))
print "\n####sync file to standby %s exception: %s####" % (sSrcFile, inst)
#根據腳本開始處定義的全局變量,下載啟動軟件包、配置文件、sn文件等
#Procedure to copy config file using global information
def copyAndCheckFile(src, dest, timeout):
global server_path, local_path
srcTmp = "%s%s" % (server_path, src)
sDestFile = "%s%s" % (local_path, dest)
if (True == doCopyFile(srcTmp, sDestFile, timeout)) and (True == checkFile(srcTmp, sDestFile)):
syncFileToStandby(sDestFile, dest)
return True
else:
srcTmp = "%sdefault_%s" %(server_path, src)
if (True == doCopyFile(srcTmp, sDestFile, timeout)) and (True == checkFile(srcTmp, sDestFile)):
syncFileToStandby(dest)
return True
return False
# split the Chassis and Slot
def splitChassisSlot(chassisID, slotID):
chassis_slot = ""
if chassisID != -1:
chassis_slot = " chassis %d" % chassisID
if slotID != -1:
chassis_slot = "%s slot %d" %(chassis_slot, slotID)
return chassis_slot
#從HTTP服務器上下載啟動軟件包
def copyBootImage():
global image_timeout, local_path, boot_server_name, boot_local_name
src = "%s" % boot_server_name
return copyAndCheckFile(src, boot_local_name, image_timeout)
#從HTTP服務器上下載配置文件
def copyCfgFile():
global config_timeout, local_path, config_local_name
src = "%s" % getCfgFileName()
return copyAndCheckFile(src, config_local_name, config_timeout)
#從HTTP服務器上下載sn.txt文件
def copyIrfStack():
global irf_timeout, local_path, irf_local_name, irf_server_name
src = "%s" % irf_server_name
return copyAndCheckFile(src, irf_local_name, config_timeout)
#執行boot-loader命令,為設備指定下次主用啟動文件
# Procedure to Install Boot Image
def installBoot(chassis_slot, sFile, style):
result = None
write2Log("\ninstall%s%s begin" %(chassis_slot, style))
print "INFO: Install%s%s Start, Please Wait..." %(chassis_slot, style)
comd = "boot-loader file %s%s%s" % (sFile, chassis_slot, style)
try:
result = comware.CLI(comd, False)
if result == None:
write2Log("\nboot-loader file %s%s%s failed" % (sFile, chassis_slot, style))
print "\n####boot-loader file %s%s%s failed####" % (sFile, chassis_slot, style)
return False
except Exception as inst:
write2Log("\nboot-loader %s exception: %s" % (sFile, inst))
print "\n####boot-loader %s exception: %s####" % (sFile, inst)
return False
return True
#Procedure to install boot image
def installBootImage():
global boot_local_name
aSlotRange = [comware.get_self_slot()]
if ("get_standby_slot" in dir(comware)):
aSlotRange = aSlotRange + comware.get_standby_slot()
bInstallOk = True
i = 0
while i < len(aSlotRange):
sFile = "%s%s" %(getPath(aSlotRange[0][0], aSlotRange[0][1]), boot_local_name)
if False == installBoot(splitChassisSlot(aSlotRange[i][0], aSlotRange[i][1]), sFile, " main"):
bInstallOk = False
i = i + 1
return bInstallOk
#執行startup saved-configuration命令為設備指定下次啟動配置文件
def startupCfg():
global local_path, config_local_name
result = None
dest = "%s%s" %(local_path, config_local_name)
write2Log("\nstartup saved-configuration %s begin" %dest)
print "INFO: Startup Saved-configuration Start"
comd = "startup saved-configuration %s main" % dest
try:
result = comware.CLI(comd, False)
if result == None:
write2Log("\nstartup saved-configuration %s failed" % dest)
print "\n####startup saved-configuration %s failed####" % dest
return False
except Exception as inst:
write2Log("\nstartup %s exception: %s" % (dest, inst))
print "\n####startup %s exception: %s####" % (dest, inst)
return False
write2Log("\nstartup saved-configuration %s success" % dest)
print "INFO: Completed Startup Saved-configuration"
return True
def getIrfCfg(line, num):
line = line.split()
number = None
if 3 == len(line):
number = line[num]
else :
number = None
return number
def getMemberID():
aMemId = comware.get_self_slot()
memId = None
if aMemId[0] == -1 :
memId = aMemId[1]
else :
memId = aMemId[0]
return memId
def getNewMemberID():
global irf_local_name, local_path, env
filename = "%s%s" %(local_path, irf_local_name)
serNum = os.environ['DEV_SERIAL']
print "\n####Test Chassis SN or Slot SN %s" % serNum
reNum = None
try:
file = open(filename, "r")
line = file.readline()
while "" != line:
if (serNum == getIrfCfg(line, 0)):
file.close()
reNum = getIrfCfg(line, 2)
return reNum
line = file.readline()
file.close()
except Exception as inst:
write2Log("\nget renumberID exception: %s" % inst)
print "\n####get renumberID exception: %s####" % inst
write2Log("\nget %s renumberID failed" % filename)
print "\n#### get %s renumberID failed ####" % filename
return reNum
#判斷設備是否是處於已經建立IRF
def isIrfDevice():
try:
result = comware.CLI("display irf", False)
if result == None:
return False
except Exception as inst:
return False
return True
#解析sn.txt文件並使用renumber修改設備的IRF成員編號
def getIrfComd():
comd = None
newMemberID = getNewMemberID()
aMemId = comware.get_self_slot()
if None == newMemberID:
return None
if False == isIrfDevice():
comd = "system-view ; irf member %s ; chassis convert mode irf" % newMemberID
else:
comd = "system-view ; irf member %s renumber %s" % (getMemberID(), newMemberID)
return comd
def stackIrfCfg():
global env
if (not os.environ.has_key('DEV_SERIAL')):
write2Log("\nenviron variable 'DEV_SERIAL' is not found!")
print "\n####environ variable 'DEV_SERIAL' is not found!####"
return False
comd = getIrfComd()
if None == comd:
return False
result = None
write2Log("\nstartup stack irf begin")
print "INFO: Startup stack irf Start"
try:
result = comware.CLI(comd, False)
if result == None:
write2Log("\nstartup stack irf failed: %s" % comd)
print "\n####startup stack irf failed: %s####" %comd
return False
except Exception as inst:
write2Log("\nstartup stack irf exception: %s command: %s" % (inst, comd))
print "\n####startup stack irf exception: %s command: %s####" % (inst, comd)
return False
write2Log("\nstartup stack irf success")
print "INFO: Completed Startup Stack Irf"
return True
#check if all standby slots are ready
def ifAllStandbyReady():
if (("get_slot_range" in dir(comware)) == False):
return True
aSlotRange = comware.get_slot_range()
bAllReady = True
for i in range(aSlotRange["MinSlot"], aSlotRange["MaxSlot"]):
oSlotInfo = comware.get_slot_info(i)
if (oSlotInfo != None) and (oSlotInfo["Role"] == "Standby") and (oSlotInfo["Status"] == "Fail"):
bAllReady = False
write2Log("\nSlot %s is not ready!" %i)
print "\n####Slot %s is not ready!####" %i
return bAllReady
#if have any standby slot was not ready sleep for waiting
def waitStandbyReady():
while ifAllStandbyReady() == False:
sleep(10)
#python main
#when download file user can stop script
waitStandbyReady()
signal.signal(signal.SIGTERM, sigterm_handler)
if (True == verifyAllFreeSpace()) and (True == copyBootImage()) and (True == copyCfgFile()) and (True == copyIrfStack()):
#after download file user can not stop script
signal.signal(signal.SIGTERM, sig_handler_no_exit)
if (True == installBootImage()) and (True == startupCfg()) and (True == stackIrfCfg()):
doExit("success")
doExit("error")
· 配置文件:配置文件包含了所有設備進行IRF的相關命令,管理員可以在已經成功創建IRF的設備上,將配置文件導出並修改然後保存在HTTP服務器上,供需要創建類似拓撲IRF的設備下載使用。
· sn.txt文件:每個設備都有唯一的設備序列號,sn.txt文件根據設備的序列號來指定設備在IRF組中的成員編碼。設備通過運行Python腳本來解析sn.txt文件,然後修改設備的IRF成員編號,並根據自身的成員編號來完成相應的IRF配置。
· 軟件啟動包:軟件啟動包是設備啟動、運行的必備軟件,需保存在HTTP服務器上。如果現有設備(包括主設備和從設備)的啟動軟件包全部一致且不需要升級軟件版本,可不需要準備該文件。
(2) 在Device A上配置DHCP服務器
# 開啟DHCP服務,創建名稱為1的DHCP地址池,配置地址池動態分配IP地址的網段為192.168.1.0/24。
<DeviceA> system-view
[DeviceA] dhcp enable
[DeviceA] dhcp server ip-pool 1
[DeviceA-dhcp-pool-1] network 192.168.1.0 24
# 配置DHCP客戶端遠程啟動配置文件為HTTP形式的URL。
[DeviceA-dhcp-pool-1] bootfile-name http://192.168.1.40/device.py
[DeviceA-dhcp-pool-1] quit
# 配置接口GigabitEthernet1/0/1工作在DHCP服務器模式。
[DeviceA] interface gigabitethernet 1/0/1
[DeviceA-GigabitEthernet1/0/1] dhcp select server
[DeviceA-GigabitEthernet1/0/1] quit
(3) 設備根據DHCP服務器獲取到Python腳本文件,執行Python腳本下載配置文件和軟件啟動包;解析sn.txt文件生成IRF成員編號。然後,所有設備會執行重啟操作。
(4) 設備重啟完畢後,連接Switch A和Switch B之間的線纜,連接好線纜後設備將進行IRF選舉,選舉失敗的一台設備會再次重啟。當設備自動重啟後,Switch A和Switch B成功組成IRF。
下麵以Switch A為例驗證設備是否成功組成IRF,Switch B和Switch A類似,不再贅述。
# 顯示IRF中所有成員設備的相關信息。
<Switch A> display irf
MemberID Slot Role Priority CPU-Mac Description
1 1 Standby 1 00e0-fc0f-8c02 ---
*+2 1 Master 30 00e0-fc0f-8c14 ---
--------------------------------------------------
* indicates the device is the master.
+ indicates the device through which the user logs in.
The Bridge MAC of the IRF is: 000c-1000-1111
Auto upgrade : yes
Mac persistent : always
Domain ID : 0
Auto merge : yes
以上顯示信息表明IRF已經成功建立。
不同款型規格的資料略有差異, 詳細信息請向具體銷售和400谘詢。H3C保留在沒有任何通知或提示的情況下對資料內容進行修改的權利!