前言*随着IT企業的迅猛發展,Linux運維逐漸趨向于自動化,所謂的自動化運維,常常表現為:從程式打包-代碼管理-上傳-更新部署-代碼復原等等一系列工作。實作自動化運維後将減去人工的重複工作、避免人工的誤操作等等。
目前主流的自動化工具有puppet、Expect、pssh等等,今天我們來研究一下expect如何來實作自動部署和日常管理維護。
一、Expect簡介
expect是一種能夠按照腳本内容裡面設定的方式與互動式程式進行“會話”的程式。根據腳本内容,Expect可以知道程式會提示或回報什麼内容以及什麼是正确的應答。它是一種可以提供“分支和嵌套結構”來引導程式流程的解釋型腳本語言。
我們熟知的shell程式設計功能雖然很強大,但是不能實作有互動功能的多機器之前的操作,例如ssh和scp等。而expect可以幫助我們來實作。
二、Expect安裝
1
<code>yum </code><code>install</code> <code>expect -y</code>
三、Expect使用
使用Expect批量管理和部署伺服器大緻分為兩個步驟,使用for循環讀取伺服器IP、密碼清單并取值,遠端執行指令。如下需求,在兩台伺服器上執行mkdir /tmp/`date +%Y%m%d`指令,如何實作?
首先定義expect 登陸腳本:
1、login.exp,内容如下(詳細的參數就不解釋了):
2
3
4
5
6
7
8
9
10
11
12
<code>#!/usr/bin/expect -f</code>
<code>set</code> <code>ip [lindex $argv 0 ]</code>
<code>set</code> <code>passwd</code> <code>[lindex $argv 1 ]</code>
<code>set</code> <code>command</code> <code>[lindex $argv 2]</code>
<code>set</code> <code>timeout 1</code>
<code>spawn </code><code>ssh</code> <code>root@$ip</code>
<code>expect {</code>
<code>"yes/no"</code> <code>{ send </code><code>"yes\r"</code><code>;exp_continue }</code>
<code>"password:"</code> <code>{ send </code><code>"$passwd\r"</code> <code>}</code>
<code>}</code>
<code>expect </code><code>"*#*"</code> <code>{ send </code><code>"$command\r"</code> <code>}</code>
<code>expect eof</code>
2、建立批量執行腳本auto_exec.sh
<code>#!/bin/sh</code>
<code>#auto exec command</code>
<code>#wugk 20130712</code>
<code>CMD=</code><code>"$*"</code>
<code>for</code> <code>i </code><code>in</code> <code>`</code><code>awk</code> <code>'{print $1}'</code> <code>passwd</code><code>.txt`</code>
<code>do</code>
<code> </code><code>j=`</code><code>awk</code> <code>-</code><code>v</code> <code>I=</code><code>"$i"</code> <code>'{if(I==$1)print $2}'</code> <code>passwd</code><code>.txt`</code>
<code> </code><code>expect </code><code>/data/sh/login</code><code>.exp $i $j </code><code>"$CMD"</code>
<code>done</code>
3、建立批量IP、密碼檔案
cat passwd.txt内容如下:(第一列為IP,第二列為密碼)
<code>192.168.1.100 abc_123</code>
<code>192.168.1.101 abc_456</code>
四、測試腳本
直接執行:
<code>/bin/sh</code> <code>auto_exec.sh </code><code>"mkdir -p /tmp/`date +%Y%m%d`"</code>
然後登陸兩台伺服器檢視是否在/tmp/下生産一個以目前系統日期為名稱的目錄。
五、SCP遠端拷貝
如果需要遠端推送檔案,重建立立檔案login.scp相關參數和auto_exec.sh變量:
1、login.scp内容如下:
13
<code>set</code> <code>src_file [lindex $argv 2]</code>
<code>set</code> <code>des_dir [lindex $argv 3]</code>
<code>spawn </code><code>scp</code> <code>-r $src_file root@$ip:$des_dir</code>
<code>expect </code><code>"#*"</code>
2、auto_exec_scp.sh腳本内容如下
<code>read</code> <code>-p </code><code>"Please Enter insert Source File or DIR: "</code> <code>src_file</code>
<code>echo</code> <code>======================================================</code>
<code>sleep</code> <code>1</code>
<code>read</code> <code>-p </code><code>"Please Enter insert Destination DIR: "</code> <code>des_dir</code>
<code> </code><code>expect login.</code><code>scp</code> <code>$i $j $src_file $des_dir</code>
密碼檔案保持不變即可。
看上面的腳本可能有點暈,直接上下面的腳本,拷貝即可使用,一個是用于遠端執行執行指令的,一個是用于遠端拷貝檔案的。
六、一鍵安裝expect、ssh批量執行auto_exec_ssh.sh腳本:(遠端執行指令)
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<code>#auto exec expect shell scripts</code>
<code>if</code>
<code> </code><code>[ ! -e </code><code>/usr/bin/expect</code> <code>];</code><code>then</code>
<code> </code><code>yum </code><code>install</code> <code>expect -y</code>
<code>fi</code>
<code>#Judge passwd.txt exist</code>
<code> </code><code>[ ! -e .</code><code>/passwd</code><code>.txt ];</code><code>then</code>
<code> </code><code>echo</code> <code>-e </code><code>"The passwd.txt is not exist......Please touch ./passwd.txt ,Content Example:\n192.168.1.11 passwd1\n192.168.1.12 passwd2"</code>
<code> </code><code>sleep</code> <code>2 &&</code><code>exit</code> <code>0</code>
<code>#Auto Tuoch login.exp File</code>
<code>cat</code><code>>login.exp <<EOF</code>
<code>set</code> <code>ip [lindex \$argv 0 ]</code>
<code>set</code> <code>passwd</code> <code>[lindex \$argv 1 ]</code>
<code>set</code> <code>command</code> <code>[lindex \$argv 2]</code>
<code>set</code> <code>timeout -1</code>
<code>spawn </code><code>ssh</code> <code>root@\$ip</code>
<code>"password:"</code> <code>{ send </code><code>"\$passwd\r"</code> <code>}</code>
<code>expect </code><code>"*#*"</code> <code>{ send </code><code>"\$command\r"</code> <code>}</code>
<code>expect </code><code>"#*"</code> <code>{ send </code><code>"exit\r"</code> <code>}</code>
<code>EOF</code>
<code>##Auto exec shell scripts</code>
<code> </code><code>[ </code><code>"$1"</code> <code>== </code><code>""</code> <code>];</code><code>then</code>
<code> </code><code>echo</code> <code>========================================================</code>
<code> </code><code>echo</code> <code>"Please insert your command ,Example {/bin/sh $0 'mkdir -p /tmp'} ,waiting exit ........... "</code>
<code> </code><code>sleep</code> <code>2</code>
<code> </code><code>exit</code> <code>1</code>
<code> </code><code>expect .</code><code>/login</code><code>.exp $i $j </code><code>"$CMD"</code>
七、一鍵安裝expect、scp批量拷貝auto_exec_scp.sh腳本:(批量SCP拷貝)
<code>set</code> <code>ip [lindex \$argv 0]</code>
<code>set</code> <code>passwd</code> <code>[lindex \$argv 1]</code>
<code>set</code> <code>src_file [lindex \$argv 2]</code>
<code>set</code> <code>des_dir [lindex \$argv 3]</code>
<code>spawn </code><code>scp</code> <code>-r \$src_file root@\$ip:\$des_dir</code>
<code>"yes/no"</code> <code>{ send </code><code>"yes\r"</code><code>; exp_continue }</code>
<code>"password:"</code> <code>{ send </code><code>"\$passwd\r"</code> <code>}</code>
<code>expect </code><code>"100%"</code>
<code> </code><code>echo</code> <code>"Please insert your are command ,Example {/bin/sh $0 /src /des } ,waiting exit ........... "</code>
<code>for</code> <code>i </code><code>in</code> <code>`</code><code>awk</code> <code>'{print $1}'</code> <code>passwd</code><code>.txt`</code>
<code> </code><code>j=`</code><code>awk</code> <code>-</code><code>v</code> <code>I=</code><code>"$i"</code> <code>'{if(I==$1)print $2}'</code> <code>passwd</code><code>.txt`</code>
<code> </code><code>expect .</code><code>/login</code><code>.exp $i $j $1 $2</code>
腳本已在真實環境使用,附上兩個腳本執行過程圖:
<a target="_blank" href="http://blog.51cto.com/attachment/201312/172331956.png"></a>
<a target="_blank" href="http://blog.51cto.com/attachment/201312/172333152.png"></a>
本文轉自 wgkgood 51CTO部落格,原文連結:http://blog.51cto.com/wgkgood/1271543