expect腳本實現交換機批量配置


   整理一下現狀:1.交換機都處於專網中,筆者的服務器均可以直接訪問,無需代理設備;2.幾乎所有的交換機型號相同,也就是說完成ntp的配置指令相同;3.所有交換機密碼相同;4.所有設備都可以telnet管理,端口均是默認端口,唯一的區別就只有設備IP地址。

        那筆者的思路就比較清楚了,首先有個指令配置的模板,其中包含了設備登陸、密碼輸入、配置指令及保存退出。其次定義一個IP地址的表單,對表單內的IP地址進行配置模板的重復執行。

        對於linux系統而已,大多數簡短腳本都會采用bash來進行編寫,而筆者之前嘗試過expect腳本編寫,感覺這個腳本語言對於初學者相對比較友好,因此這節筆者就通過expect來進行功能實現。

        登陸服務器,首先看一下服務器是否有bash和expect:

        yum list installed | grep bash

        yum list installed | grep expect

 
 

        看到系統是自帶bash組件,但沒有expect,繼續按照以往的方式進行軟件安裝:

        yum list | grep expect

 
 

        yum install expect.x86_64

        完成軟件安裝。

        查看一下yum把expect安裝到了哪里:

        whereis expect

 
 

        熟悉一下文件安裝的路徑。

        下面筆者開始一個初始化腳本的編寫,進入文件夾

        cd /var

        筆者來新建一個文件夾用於儲存和管理腳本

        mkdir expect

 
 

        進入筆者新建的文件夾

        cd ./expect

        開始創建第一個shell文件

        vi telnet.sh

 
 

        編程語言第一步就是聲明語言,結合之前筆者看到的安裝路徑:

        #!/usr/bin/expect

        設置超時時間為3秒:

        set timeout 3

        繼續隨便找一台交換機進行測試:比如10.150.103.61,測試之前呢,筆者也先不拿ntp的相關配置來做操作,畢竟時間看起來比較麻煩。筆者用最簡單、直觀可見的方式--修改交換機的名稱來測試:

        插入一部分,編程的同時筆者先梳理一下交換機改名字的配置思路。

        第一步telnet 10.150.103.61

 
 

        執行之后呢,交換機就需要輸入密碼,為了方便測試腳本筆者改為了簡單好記的123456

 
 

        輸入密碼之后呢,H3C交換機改個用戶名兩條簡單指令:

        system-view

        sysname hbaitest1

 
 

        保存退出:

        quit

        save

        y

 

        y

 
 

        最后quit退出,就結束了~

        如上交換機的配置指令已經梳理清楚了,那就開始腳本配置:

 
 

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

 
 

        后面的異常輕松,送密碼啊送指令啊,送完了之后interact腳本結束。

        wq!

        保存退出,下面筆者迫不及待的嘗試一下腳本的效果,運行之前筆者先登錄這台交換機設備,把它修改為原來的名字:hbai1

 
 

        切換回服務器,執行腳本。

        ./telnet.sh

 
 

        提示權限不夠。直接給文件夾/var/expect賦予讀寫執行權限

        chmod –R 777 /var/expect

 
 

        繼續運行腳本

        ./telnet.sh

 
 

        再看一下交換機,名字已然變成了筆者修改過后的新名字。簡簡單單的腳本執行完成了。

 
 

        執行完成后繼續把名字修改回來:

 
 

        筆者最初的目的達成了,可以通過腳本自動修改交換機名稱,但是由於腳本是固定的IP地址(spawn telnet 10.150.103.61)無法做到修改多個設備。下一步,筆者就在上述腳本的基礎上進行優化設置。

        一、增加輸入,使得IP地址不再固定;

        常見腳本的輸入方式大約分為兩種,一種是交互式的,可以手動輸入,不過一旦輸入內容很多,輸入變量也會變成一件非常繁瑣的事情;另一種方便的方式就是新建一個文件,把所有需要管理的IP地址都加入其中。然后自動讀取文件執行就可以了。

        很明顯在筆者現有的應用場景下,第二種方式比較簡便,筆者只需要把所有的交換機IP地址貼出來就可以了,思路上呢,就是首先讀取文件第一行IP地址,telnet進行連接,執行交換機修改的命令;讀取文件第二行IP地址…………直到讀取文件結束。很清晰,一個循環操作。

        首先筆者新建一個文件來存儲IP地址:

        vi ip.txt

        輸入幾個測試的IP地址

 
 

        筆者新建一個腳本來測試下循環:

        vi read.sh

 
 

        設置讀取文件位置和操作:setf [open ip.txt]

        執行一個循環while:while {1}

        讀取字符串並寫入line變量中set line [gets $f]

        輸出變量:puts “ipaddress is : $line”

        判斷變量是否為空,文件讀取結束:    if {[eof $f]} {  close $f break  }

        成功完成后輸出提示:successful

        這樣一個簡單的循環腳本就完成了,筆者執行一下腳本來看看運行結果:

        ./read.sh

 
 

        不錯~輸入結束,結果很理想。下面筆者要做的就是整合之前完成的兩個腳本,一邊讀取IP地址,一遍執行筆者想要的配置操作。

        二、增加循環,使得腳本可以對多個設備執行命令。

        回顧一下循環的思路:

        1.讀取文件;2.執行循環;3.讀取字符串寫入變量;4.輸出變量;5.變量為空循環結束。

        回顧一下交換機配置更改的思路:

        1>telnet一個IP地址;2>在輸入密碼界面輸入密碼;3>執行命令;4>保存退出。

        思路上就是將循環中的“4.輸出變量”替換為“1>--4>交換機配置更改”,這樣就輕松愉快的結束了。

        開始操作,將循環腳本read.sh復制為modify.sh

        cp read.sh modify.sh

 
 

        編輯腳本:vi modify.sh

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

 
 

        完整腳本如上。

        找個測試環境,筆者把ip.txt的地址替換為可以訪問的交換機地址:vi ip.txt

 
 

        登陸這兩台設備:

 
 

        執行腳本:./modify.sh

        等待腳本執行完成后,回到這兩台交換機的管理界面,發現交換機名字已經批量修改了~

 
 

        到這里為止,筆者的執行腳本已經完成啦,以后的批量作業只需要將指令保存到腳本之中,並且維護交換機ip地址列表ip.txt就可以一鍵修改了~

        可以看到,一個功能性腳本最重要的就是理清思路,知道分幾步完成,每步該做什么;同樣對於一個復雜的步驟可以將其拆解出來,單獨使用一個腳本進行實現,最后再進行腳本的整合。每個復雜腳本基本上基於輸入、輸出、變量、運算符、注釋、流控制來進行的,邏輯思路非常重要。

 

 

        最后的最后,筆者優化一下了腳本。參考之前的ip地址列表,筆者將地址單獨出了一個文件以便修改。同樣,筆者將需要執行的命令也單獨出來一個文件,命名為command.txt。考慮到筆者最初的目的,將配置指令修改為上一節NTP相關配置。三個文件如下所示:

        ip.txt

 
 

        command.txt

 
 

        modify.sh

 
 

        利用如上腳本和兩個文件就可以實現網絡設備的批量telnet和ssh管理啦~



作者:嵩山奶熊
鏈接:https://www.jianshu.com/p/e17ec311ac6d
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM