分發系統—expect

20.27 分發系統介紹

  • 分發系統就是一個主要用來上線代碼或同步文件的腳本。

現在一些比較大的企業,大都使用了負載均衡,而有時由於一些程序要更改,或者有些bug要修改,快速更新代碼等,若是僅是幾臺server的話,很簡單,把已經改好的程序拷過去,或者rsync遠程推送,再或者網上NFS共享一下就能夠了。但若是有幾十臺幾百臺,那樣的方法會太繁瑣,此時就能夠用expect來批量實現分發任務。shell

20.28 expect腳本遠程登陸

  • expect的安裝:yum install -y expectvim

  • 下面來進行expect腳本的遠程登陸:bash

    本機IP爲120,遠程IP爲124負載均衡

    進入/usr/local/sbin目錄下(expect腳本通常放在此目錄中),新建一個名稱爲test.expect的腳本文件,內容以下:ssh

    #! /usr/bin/expect
    set host "192.168.6.124"
    set passwd "123456"
    spawn ssh root@$host
    expect {
    "yes/no" { send "yes\r"; exp_continue}
    "assword:" { send "$passwd\r" }
    }
    interact

而後更改權限:chmod a+x test.expect,此時就能夠遠程鏈接124了。 網站

20.29 expect腳本遠程執行命令

再在/usr/local/sbin/目錄下新建一個test2.expect的腳本,內容以下:spa

#!/usr/bin/expect
set user "root"
set passwd "123456"
spawn ssh $user@192.168.6.124

expect {
"yes/no" { send "yes\r"; exp_continue}
"password:" { send "$passwd\r" }
}
expect "]*"
send "touch /tmp/test.txt\r"
expect "]*"
send "echo hello world! > /tmp/test.txt\r"
expect "]*"
send "exit\r"

給test2.expect腳本賦予x權限:chmod a+x test2.expect,而後執行: .net

在124上查看/tmp/目錄下是否有test.txt: 3d

20.30 expect腳本傳遞參數

  • expect腳本能夠接受從bash傳遞過來的參數.可使用[lindex $argv n]得到,n從0開始,分別表示第1個,第2個,第3個,第n個參數。

新建名爲test3.expect的腳本文件,內容以下:code

#!/usr/bin/expect
set user [lindex $argv 0]
set host [lindex $argv 1]
set passwd "123456"
set cm [lindex $argv 2]
spawn ssh $user@$host

expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect "]*"
send "$cm\r"
expect "]*"
send "exit\r"

增長x權限後執行:

20.31 expect腳本同步文件

新建名爲test4.expect的腳本文件,內容以下:

#!/usr/bin/expect
set passwd "123456"
spawn rsync -av root@192.168.6.124:/tmp/test.txt /tmp/
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect eof

增長x權限後執行:

20.32 expect腳本指定host和要同步的文件

新建名爲test5.expect的腳本文件,內容以下:

#!/usr/bin/expect
set passwd "123456"
set host [lindex $argv 0]
set file [lindex $argv 1]
spawn rsync -av $file root@$host:$file
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect eof

增長x權限後執行:

20.33 構建文件分發系統

  • 需求背景:

    對於大公司而言,確定時不時會有網站或者配置文件更新,並且使用的機器確定 也是好多臺,少則幾臺,多則幾十甚至上百臺。因此,自動同步文件是相當重要的。

  • 實現思路:

    首先要有一臺模板機器,把要分發的文件準備好,而後只要使用expect腳本批量把 須要同步的文件分發到目標機器便可。

  • 核心命令:

    rsync -av --files-from=list.txt / root@host:/ 注意:這裏的都是根目錄

    使用rsync 的 --files參數,能夠實現調用文件裏面的列表,進行多個文件遠程傳輸,從而實現文件分發文件分發系統的實現。

    新建名爲rsync.expect的腳本文件,內容以下:

    #!/usr/bin/expect
    set passwd "123456"
    set host [lindex $argv 0]
    set file [lindex $argv 1]
    spawn rsync -av --files-from=$file / root@$host:/
    expect {
    "yes/no" { send "yes\r"}
    "password:" { send "$passwd\r" }
    }
    expect eof

    而後在/tmp/目錄下新建文件ip.list

    [root@zhangjin-120:/usr/local/sbin]#vim /tmp/ip.list
    
    192.168.6.123
    192.168.6.124

    建立須要同步文件的列表文件file.list

    [root@zhangjin-120:/usr/local/sbin]#vim /tmp/file.list
    
    /tmp/test.txt
    /tmp/test2.txt
    /root/123.sh

    再建立一個名爲rsync的shell腳本,內容以下:

    #!/bin/bash
    for ip in `cat /tmp/ip.list`
    do
        echo $ip
        ./rsync.expect $ip /tmp/file.list
    done

    增長x權限後執行:

20.34 批量遠程執行命令

  • 當同步完代碼後有可能須要批量地重啓服務,所以還須要批量遠程執行命令,相似於自動化。 這裏是用expect編寫執行命令的腳本並用shell腳原本批量調用它。

    建立名爲exe.expect的腳本,內容以下:

#!/usr/bin/expect
set host [lindex $argv 0]
set passwd "123456"
set cm [lindex $argv 1]
spawn ssh root@$host
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect "]*"
send "$cm\r"
expect "]*"
send "exit\r"

賦予x權限。

再建立exe.sh的shell腳本,內容以下:

#!/bin/bash
for ip in `cat ip.list`
do
    echo $ip
    ./exe.expect $ip "w;free -m;ls /tmp"
done
相關文章
相關標籤/搜索