ssh+expect+scp實現伺服器叢集自動化搭建
之前介紹過ansible的使用,通過ssh授權批量控制伺服器叢集 但是生成金鑰和分發公鑰的時候都是需要確認密碼的,這一步也是可以自動化的,利用ssh + expect + scp就可以實現,其實只用這幾個命令結合也可以實現類似ansible的功能了 為了遠端操作伺服器進行環境初始化,總結我們都需要以下幾步操作 1.ssh-keygen生成金鑰對 2.將生成的公鑰傳送到node伺服器 3.scp拷貝安裝包到node伺服器 4.ssh遠端執行拷貝過去的安裝包
下面進行叢集環境初始化指令碼的編寫,通過ssh + expect + scp實現伺服器叢集自動化搭建
第一步,伺服器準備
這裡使用docker模擬幾臺伺服器,分別命名為node2,node3,node4(使用映象chenqionghe/ubuntu,密碼統一為88888888),生產環境為ip或host
docker run -d --name node2 -p 2223:22 chenqionghe/ubuntu docker run -d --name node3 -p 2224:22 chenqionghe/ubuntu docker run -d --name node4 -p 2225:22 chenqionghe/ubuntu
還得有一臺主控制伺服器node1,負責操作所有的伺服器節點
docker run -d --name node1 -p 2222:22 \ --link node2:node2 \ --link node3:node3 \ --link node4:node4 \ chenqionghe/ubuntu
初始化完成後進入node1節點
ssh [email protected] -p 2222
安裝必須軟體
apt-get install expect -y
建立存放指令碼的目錄~/env
mkdir -p ~/env && cd ~/env
這裡先模擬一個簡單的安裝包scripts/install.sh,安裝vim命令
mkdir scripts cat > scripts/install.sh <<EOF #!/bin/bash bash apt-get install vim -y EOF
建立機器列表配置檔案,vim nodes.txt
node2 node3 node4
第二步 編寫自動化指令碼
1.無互動ssh-keygen生成金鑰對指令碼,vim ssh-keygen.exp
#!/usr/bin/expect #set enter "\n" spawn ssh-keygen expect { "*(/root/.ssh/id_rsa)" {send "\r";exp_continue} "*(empty for no passphrase)" {send "\r";exp_continue} "*again" {send "\r"} } expect eof
2.無互動分發公鑰指令碼,vim send-sshkey.exp
#!/usr/bin/expect if { $argc != 2 } { send_user "usage: expect send-sshkey.exp file host\n" exit } #define var set file [lindex $argv 0] set host [lindex $argv 1] set password "88888888" spawn ssh-copy-id -i $file -p 22 root@$host expect { "yes/no" {send "yes\r";exp_continue} "*password" {send "$password\r"} } expect eof
3.遠端批量執行ssh指令碼, vim mssh.sh
#!/bin/bash Port=22 if [ $# -lt 1 ];then echo "Usage: `basename $0` command" exit fi echo $@ for v in `cat nodes.txt` do ssh -t -p ${Port} root@${v} $@ if [ $? -eq 0 ];then echo "執行成功:$v" else echo "執行失敗:$v" fi done
4.自動化部署指令碼,vim auto-deploy.sh
#!/usr/bin/env bash #機器列表 HostList=`cat nodes.txt` #埠號 Port=22 # 1.無互動生成金鑰對 if [ ! -f ~/.ssh/id_rsa.pub ];then expect ssh-keygen.exp fi # 2.無互動分發公金鑰 for v in ${HostList} do expect send-sshkey.exp ~/.ssh/id_rsa.pub ${v} if [ $? -eq 0 ];then echo "公鑰-傳送成功:$v" else echo "公鑰-傳送失敗:$v" fi done # 3.分發指令碼檔案(安裝軟體包) for v in ${HostList} do scp -P ${Port} -rp ~/env/scripts root@${v}:~ if [ $? -eq 0 ];then echo "scripts-傳送成功:$v" else echo "scripts-傳送失敗:$v" fi done # 4.使用指令碼檔案安裝 for v in ${HostList} do ssh -t -p ${Port} root@${v} /bin/bash ~/scripts/install.sh done
到這裡所有的檔案已經建立完成,整個env目錄結構如下
├── auto-deploy.sh ├── mssh.sh ├── nodes.txt ├── scripts │└── install.sh ├── send-sshkey.exp └── ssh-keygen.exp
第三步 執行自動化指令碼檢視效果
sh auto-deploy.sh
執行成功結果
spawn ssh-keygen ... 公鑰-傳送成功:node2 ... 公鑰-傳送成功:node3 ... 公鑰-傳送成功:node4 install.sh 100% 40 41.4KB/s 00:00 scripts-傳送成功:node2 install.sh 100% 40 45.0KB/s 00:00 scripts-傳送成功:node3 install.sh 100% 40 39.9KB/s 00:00 scripts-傳送成功:node4 ... Connection to node4 closed.
出現上面的結果代表3個node節點已經初始化完成,拷貝公鑰+安裝軟體成功!
我們再來執行一下遠端命令指令碼,檢視所有伺服器系統型別
sh mssh.sh "cat /etc/os-release|head -n 1"
執行結果如下
cat /etc/os-release|head -n 1 NAME="Ubuntu" Connection to node2 closed. 執行成功:node2 NAME="Ubuntu" Connection to node3 closed. 執行成功:node3 NAME="Ubuntu" Connection to node4 closed. 執行成功:node4
這樣就實現了自動化建立金鑰對+分發公鑰+所有伺服器軟體環境安裝+批量遠端執行指令碼mssh.sh,麻雀雖小,五臟俱全,絕對是乾貨!light weight baby!