????????上一節(jié)筆者完成了NTP服務(wù)器的搭建,并通過(guò)對(duì)交換機(jī)的配置在客戶端完成了時(shí)間校準(zhǔn)。但是同時(shí)遇到了一個(gè)很嚴(yán)重的問(wèn)題,筆者專網(wǎng)中有上百臺(tái)網(wǎng)絡(luò)交換機(jī),每個(gè)交換機(jī)都要同步ntp產(chǎn)生的重復(fù)勞動(dòng)簡(jiǎn)直讓筆者想拿頭撞墻。但需求永遠(yuǎn)在推進(jìn)技術(shù)學(xué)習(xí),秉持著想盡辦法偷懶的態(tài)度,筆者準(zhǔn)備通過(guò)一小段代碼來(lái)對(duì)網(wǎng)絡(luò)內(nèi)交換機(jī)進(jìn)行ntp server的配置。
????????整理一下現(xiàn)狀:1.交換機(jī)都處于專網(wǎng)中,筆者的服務(wù)器均可以直接訪問(wèn),無(wú)需代理設(shè)備;2.幾乎所有的交換機(jī)型號(hào)相同,也就是說(shuō)完成ntp的配置指令相同;3.所有交換機(jī)密碼相同;4.所有設(shè)備都可以telnet管理,端口均是默認(rèn)端口,唯一的區(qū)別就只有設(shè)備IP地址。
????????那筆者的思路就比較清楚了,首先有個(gè)指令配置的模板,其中包含了設(shè)備登陸、密碼輸入、配置指令及保存退出。其次定義一個(gè)IP地址的表單,對(duì)表單內(nèi)的IP地址進(jìn)行配置模板的重復(fù)執(zhí)行。
????????對(duì)于linux系統(tǒng)而已,大多數(shù)簡(jiǎn)短腳本都會(huì)采用bash來(lái)進(jìn)行編寫,而筆者之前嘗試過(guò)expect腳本編寫,感覺(jué)這個(gè)腳本語(yǔ)言對(duì)于初學(xué)者相對(duì)比較友好,因此這節(jié)筆者就通過(guò)expect來(lái)進(jìn)行功能實(shí)現(xiàn)。
????????登陸服務(wù)器,首先看一下服務(wù)器是否有bash和expect:
????????yum list installed | grep bash
????????yum list installed | grep expect

????????看到系統(tǒng)是自帶bash組件,但沒(méi)有expect,繼續(xù)按照以往的方式進(jìn)行軟件安裝:
????????yum list | grep expect

????????yum install expect.x86_64
????????完成軟件安裝。
????????查看一下yum把expect安裝到了哪里:
????????whereis expect

????????熟悉一下文件安裝的路徑。
????????下面筆者開(kāi)始一個(gè)初始化腳本的編寫,進(jìn)入文件夾
????????cd /var
????????筆者來(lái)新建一個(gè)文件夾用于儲(chǔ)存和管理腳本
????????mkdir expect

????????進(jìn)入筆者新建的文件夾
????????cd ./expect
????????開(kāi)始創(chuàng)建第一個(gè)shell文件
????????vi telnet.sh

????????編程語(yǔ)言第一步就是聲明語(yǔ)言,結(jié)合之前筆者看到的安裝路徑:
????????#!/usr/bin/expect
????????設(shè)置超時(shí)時(shí)間為3秒:
????????set timeout 3
????????繼續(xù)隨便找一臺(tái)交換機(jī)進(jìn)行測(cè)試:比如10.150.103.61,測(cè)試之前呢,筆者也先不拿ntp的相關(guān)配置來(lái)做操作,畢竟時(shí)間看起來(lái)比較麻煩。筆者用最簡(jiǎn)單、直觀可見(jiàn)的方式--修改交換機(jī)的名稱來(lái)測(cè)試:
? ? ? ? 插入一部分,編程的同時(shí)筆者先梳理一下交換機(jī)改名字的配置思路。
????????第一步telnet 10.150.103.61

????????執(zhí)行之后呢,交換機(jī)就需要輸入密碼,為了方便測(cè)試腳本筆者改為了簡(jiǎn)單好記的123456

????????輸入密碼之后呢,H3C交換機(jī)改個(gè)用戶名兩條簡(jiǎn)單指令:
????????system-view
????????sysname hbaitest1

????????保存退出:
????????quit
????????save
????????y
????????y

????????最后quit退出,就結(jié)束了~
????????如上交換機(jī)的配置指令已經(jīng)梳理清楚了,那就開(kāi)始腳本配置:

????????腳本配置的輕松愉快啊,spawn即是執(zhí)行了telnet的指令,之后expect會(huì)匹配密碼的輸入,完整匹配字符應(yīng)該是“Password:”前后兩個(gè)*表示字符“assword”前后匹配任意字符,這樣就匹配到了輸入密碼的界面。

????????后面的異常輕松,送密碼啊送指令啊,送完了之后interact腳本結(jié)束。
????????wq!
????????保存退出,下面筆者迫不及待的嘗試一下腳本的效果,運(yùn)行之前筆者先登錄這臺(tái)交換機(jī)設(shè)備,把它修改為原來(lái)的名字:hbai1

????????切換回服務(wù)器,執(zhí)行腳本。
????????./telnet.sh

????????提示權(quán)限不夠。直接給文件夾/var/expect賦予讀寫執(zhí)行權(quán)限
????????chmod –R 777 /var/expect

????????繼續(xù)運(yùn)行腳本
????????./telnet.sh

????????再看一下交換機(jī),名字已然變成了筆者修改過(guò)后的新名字。簡(jiǎn)簡(jiǎn)單單的腳本執(zhí)行完成了。

????????執(zhí)行完成后繼續(xù)把名字修改回來(lái):

????????筆者最初的目的達(dá)成了,可以通過(guò)腳本自動(dòng)修改交換機(jī)名稱,但是由于腳本是固定的IP地址(spawn telnet 10.150.103.61)無(wú)法做到修改多個(gè)設(shè)備。下一步,筆者就在上述腳本的基礎(chǔ)上進(jìn)行優(yōu)化設(shè)置。
????????一、增加輸入,使得IP地址不再固定;
????????常見(jiàn)腳本的輸入方式大約分為兩種,一種是交互式的,可以手動(dòng)輸入,不過(guò)一旦輸入內(nèi)容很多,輸入變量也會(huì)變成一件非常繁瑣的事情;另一種方便的方式就是新建一個(gè)文件,把所有需要管理的IP地址都加入其中。然后自動(dòng)讀取文件執(zhí)行就可以了。
????????很明顯在筆者現(xiàn)有的應(yīng)用場(chǎng)景下,第二種方式比較簡(jiǎn)便,筆者只需要把所有的交換機(jī)IP地址貼出來(lái)就可以了,思路上呢,就是首先讀取文件第一行IP地址,telnet進(jìn)行連接,執(zhí)行交換機(jī)修改的命令;讀取文件第二行IP地址…………直到讀取文件結(jié)束。很清晰,一個(gè)循環(huán)操作。
????????首先筆者新建一個(gè)文件來(lái)存儲(chǔ)IP地址:
? ? ? ? vi ip.txt
????????輸入幾個(gè)測(cè)試的IP地址

????????筆者新建一個(gè)腳本來(lái)測(cè)試下循環(huán):
????????vi read.sh

????????設(shè)置讀取文件位置和操作:setf [open ip.txt]
????????執(zhí)行一個(gè)循環(huán)while:while {1}
????????讀取字符串并寫入line變量中set line [gets $f]
????????輸出變量:puts “ipaddress is : $line”
? ? ? ? 判斷變量是否為空,文件讀取結(jié)束:??? if {[eof $f]} {? close $f?break? }
????????成功完成后輸出提示:successful
????????這樣一個(gè)簡(jiǎn)單的循環(huán)腳本就完成了,筆者執(zhí)行一下腳本來(lái)看看運(yùn)行結(jié)果:
????????./read.sh

????????不錯(cuò)~輸入結(jié)束,結(jié)果很理想。下面筆者要做的就是整合之前完成的兩個(gè)腳本,一邊讀取IP地址,一遍執(zhí)行筆者想要的配置操作。
????????二、增加循環(huán),使得腳本可以對(duì)多個(gè)設(shè)備執(zhí)行命令。
????????回顧一下循環(huán)的思路:
????????1.讀取文件;2.執(zhí)行循環(huán);3.讀取字符串寫入變量;4.輸出變量;5.變量為空循環(huán)結(jié)束。
????????回顧一下交換機(jī)配置更改的思路:
????????1>telnet一個(gè)IP地址;2>在輸入密碼界面輸入密碼;3>執(zhí)行命令;4>保存退出。
????????思路上就是將循環(huán)中的“4.輸出變量”替換為“1>--4>交換機(jī)配置更改”,這樣就輕松愉快的結(jié)束了。
? ? ? ? 開(kāi)始操作,將循環(huán)腳本read.sh復(fù)制為modify.sh
????????cp read.sh modify.sh

????????編輯腳本:vi modify.sh
????????將第四條輸出ip地址替換為telnet.sh腳本中的命令修改配置:

????????完整腳本如上。
????????找個(gè)測(cè)試環(huán)境,筆者把ip.txt的地址替換為可以訪問(wèn)的交換機(jī)地址:vi ip.txt

????????登陸這兩臺(tái)設(shè)備:

????????執(zhí)行腳本:./modify.sh
????????等待腳本執(zhí)行完成后,回到這兩臺(tái)交換機(jī)的管理界面,發(fā)現(xiàn)交換機(jī)名字已經(jīng)批量修改了~

? ? ? ? 到這里為止,筆者的執(zhí)行腳本已經(jīng)完成啦,以后的批量作業(yè)只需要將指令保存到腳本之中,并且維護(hù)交換機(jī)ip地址列表ip.txt就可以一鍵修改了~
????????可以看到,一個(gè)功能性腳本最重要的就是理清思路,知道分幾步完成,每步該做什么;同樣對(duì)于一個(gè)復(fù)雜的步驟可以將其拆解出來(lái),單獨(dú)使用一個(gè)腳本進(jìn)行實(shí)現(xiàn),最后再進(jìn)行腳本的整合。每個(gè)復(fù)雜腳本基本上基于輸入、輸出、變量、運(yùn)算符、注釋、流控制來(lái)進(jìn)行的,邏輯思路非常重要。
????????最后的最后,筆者優(yōu)化一下了腳本。參考之前的ip地址列表,筆者將地址單獨(dú)出了一個(gè)文件以便修改。同樣,筆者將需要執(zhí)行的命令也單獨(dú)出來(lái)一個(gè)文件,命名為command.txt??紤]到筆者最初的目的,將配置指令修改為上一節(jié)NTP相關(guān)配置。三個(gè)文件如下所示:
????????ip.txt

????????command.txt

????????modify.sh

????????利用如上腳本和兩個(gè)文件就可以實(shí)現(xiàn)網(wǎng)絡(luò)設(shè)備的批量telnet和ssh管理啦~