expect批量配置交換機
因為日常維護交換機上千臺,考慮到定期需要配置和備份交換機。自動配置交換機的的方式大概這麼幾種:
1、使用crt調取vbs指令碼語言;
2、ansible自動化平臺;
3、expect工具;
4、新版本的交換機可配置定期備份命令。
第一種方式使用過,比較簡單,缺點crt軟體收費;ansible平臺需要一定時間需要配置;考慮管理的交換機較為老舊,本次採用expect工具。
前期準備
1)centos7作業系統
2) yum install -y expect #安裝expect
3)yum install -y openssh-server #安裝ssh客戶端
配置思路
1)ip.txt 存放配置交換機的IP地址、使用者名稱、密碼、enable密碼和描述;
2)shell 迴圈調取需要配置交換機的ip,並調取expect指令碼;
3)expect 登入交換機執行配置命令及日誌記錄。
1、expect指令碼
vim sw_backup.exp
#!/usr/bin/expect
set timeout 3 #超時時間
set ipadd [lindex $argv 0]
set user [lindex $argv 1]
set passwd [lindex $argv 2]
set enpasswd [lindex $argv 3]
set description [lindex $argv 4]
log_file $description.[clock format [clock seconds] -format "%Y-%m-%d"].log #收集日誌
spawn ssh [email protected]$a\ipadd #ssh遠端
expect {
"(yes/no)" { send "yes\r"; exp_continue } #第一次登入交換機需要確認
"*assword:" { send "$passwd\r" }
}
expect "*>*" { send "'enable\r" } #抓取超過螢幕長度的命令輸出
expect "*#*" { send "'$enpasswd\r" } #抓取超過螢幕長度的命令輸出
expect "*#*" { send "'terminal length 0\r" } #抓取超過螢幕長度的命令輸出
expect "*#*" { send "show version\r" }
expect "*#*" { send "show run\r" }
expect "*#*" { send "show interface status \r " }
expect "*#*" { send "show ip route \r " }
expect eof
exit
2、shell指令碼
vim backup.sh
#!/bin/bash
cat ip.txt | while read line #使用while命令迴圈登入主機進行配置
do
ipadd=`echo ${line}|awk '{print $1}'` #ip地址
user=`echo ${line}|awk '{print $2}'`
passwd=`echo ${line}|awk '{print $3}'`
enpasswd=`echo ${line}|awk '{print $4}'`
description=`echo ${line}|awk '{print $5}'`
./sw_backup.exp $ipadd $user $passwd $enpasswd $description #呼叫expect指令碼
done
注:
Linux Shell中有三種引號,分別為雙引號(" ")、單引號(' ')以及反引號(` `)。
其中雙引號對字串中出現的$、''、`和\進行替換;單引號不進行替換,將字串中所有字元作為普通字元輸出,而反引號中字串作為shell命令執行,並返回執行結果。具體含義如下:
雙引號(" "):在雙引號中,除了$, '', `和\以外所有的字元都解釋成字元本身。單引號(' '):在單引號中所有的字元包括特殊字元($,'',`和\)都將解釋成字元本身而成為普通字元。
反引號(` `):在反引號中的字串將解釋成shell命令來執行
3、ip地址表
vim ip.txt
192.168.3.154 ruijie 123456 ruijie ceshi
192.168.3.155 ruijie 123123 ruijie1 測試
4、FAQ
1、許可權不夠
[[email protected] ~]# ./sw_backup.exp
-bash: ./sw_backup.exp: Permission denied
解決方法:chmod -R 777 sw_backup.exp
2、shell迴圈語句,之前使用for測試過效果不好,最後使用while;
3、awk使用的引號要特別注意;