linux集群自動化搭建(生成密鑰對+分發公鑰+遠程批量執行腳本)


之前介紹過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 root@127.0.0.1 -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!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM