天天看點

Linux批量部署工具Expect

前言*随着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 &amp;&amp;</code><code>exit</code> <code>0</code>

<code>#Auto Tuoch login.exp File</code>

<code>cat</code><code>&gt;login.exp &lt;&lt;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