在大規模自動化部署時我們常常需要配置好伺服器的SSH互信,以便自動化腳本可以免密登錄遠程伺服器,常規的手動配置SSH互信步驟如下: 使用ssh-keygen生成本地ssh key(mha01),生成的文件如下: cp .ssh/id_rsa.pub .ssh/authorized_keys 將.ss ...
在大規模自動化部署時我們常常需要配置好伺服器的SSH互信,以便自動化腳本可以免密登錄遠程伺服器,常規的手動配置SSH互信步驟如下:
- 使用ssh-keygen生成本地ssh key(mha01),生成的文件如下:
- cp .ssh/id_rsa.pub .ssh/authorized_keys
- 將.ssh內容全部拷貝至遠程伺服器mha02,在正式拷貝之前會把遠程伺服器加到.ssh/known_hosts文件中然後再拷貝。
#!/usr/bin/expect #此腳本需配合ip.list文件使用,ip.list文件存儲所有伺服器IP,包含本地伺服器。 #此腳本需要和ip.list一起放置在用戶~/目錄下才能執行。 set passwd xxx --設置伺服器密碼變數,需要所有伺服器上要配置ssh互信的用戶的密碼全部一致。 spawn ssh-keygen expect { "id_rsa" {send "\r";exp_continue} "Overwrite" {send "y\r";exp_continue} "phrase" {send "\r";exp_continue} "again" {send "\r";exp_continue} } #需要註意的是路徑不能以~開頭,因此要麼寫成絕對路徑要麼寫成相對路徑,絕對不能用~/來表示家目錄。但是如果是$ip:~/卻可以,奇坑無比。 spawn cp .ssh/id_rsa.pub .ssh/authorized_keys --這可也可以寫成spawn cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys set hosts [open ip.list r] while { [gets $hosts ip]>=0} { spawn scp -r .ssh/ $ip:~/ --這裡也可以寫成spawn scp -r /root/.ssh/ $ip:/root/ expect { "yes/no" {send "yes\r";exp_continue} "password:" {send "$passwd\r";exp_continue} } } close $hosts假設有mha01-mha99 99台伺服器,那麼配置完畢後mha01可以免密登錄其他98台伺服器,但是mha02只能免密登錄mha01和mha02,mha03只能免密登錄前3台伺服器,以此類推mha99和mha01一樣可以免密登陸全部伺服器,如果想要01-99之間的伺服器也能像01和99一樣,可以把腳本的第二部分再次執行一遍,這樣相當於把包含全部hosts的known_hosts文件的.ssh目錄傳輸到所有伺服器節點。