ssh免密碼登錄的最佳實踐(Ubuntu 16.4 + CentOs 6 中驗證通過)

背景介紹

在進行Hadoop分佈式的配置時,需要設置ssh免密碼登錄,網上有很多資料(度娘一搜一大堆),基本流程的介紹都是如下:

  1. ssh-keygen 生成密鑰對
  2. 將 本機的 ~/.ssh/id_rsa.pub 文件通過scp拷貝到目標機,然後重定向追加(>>)到其 ~/.ssh/authorized_keys 中;
  3. 通過 ssh 連接即可(初次連接時需要輸入 yes將目標機的fingerprint 加入 known_hosts)
  4. 類似方法操作需要連接的所有其他機器

雖然方式是對的,但如果按照這種做法,在需要配置的機器比較多時,工作量比較大(尤其是第4步),而且容易出錯。

最佳實踐

通過調查和總結,整理出批量設置多臺機器ssh免密碼登錄的最佳實踐方式。通過該方式,只需幾乎純自動化的腳本操作,即可短時間內配置好任意多臺機器,大大節約時間和減少出現問題的可能性。而且掌握了相關的方法和原理後,可以非常方便的進行集羣中的各種批量配置。


步驟如下

  1. 先在一臺機器上(如準備用於 hadoop 的 master上),以root賬號編輯一個包含需要配置的所有機器的 IP/機器名/別名的 對應文本(如 hadoop-hosts.txt ),其格式遵循 /etc/hosts 的語法:

    IP地址1   主機名    [別名1    [別名2]]

典型示例爲:

  192.168.100.4    master     hadoop-1
  192.168.100.5    slave01    hadoop-2
  192.168.100.6    slave02    hadoop-3

採用這種語法,一方面是爲了各個節點上的hadoop程序能夠通過主機名互相訪問(master, slavexx), 一方面又方便腳本的自動化處理(hadoop-xx), 如果需要佈置的機器比較多,則序號位數可以增加,但保證連續即可。

注意:此時不直接編輯 /etc/hosts , 是爲了方便後期腳本自動化處理


2.通過 shell 腳本中的 for 語法,將 hadoop-hosts.txt 的信息配置到集羣中的所有主機上,保證各主機之間能通過主機名/別名的方式訪問。依次執行以下幾個命令即可。

  #將映射列表加入本機的 hosts 中,這樣本機即可通過別名訪問其他主機(爲第二步的for做準備),這一步非常簡單,不再詳解
  cat hadoop-hosts.txt >> /etc/hosts

  #將 hadoop-hosts.txt 中的映射列表加入集羣中的其他所有主機,使得所有主機之間都可通過別名/機器名訪問 -- 這步比較複雜,後面詳細解釋
  for I in `seq 2 3`; do cat hadoop-hosts.txt | ssh root@hadoop-$I "cat >> /etc/hosts" ; done

要理解第二步的工作,需要了解以下背景知識:

  • shell 中的for語法(詳情可通過 man sh 後搜索 “for command” 獲得), 可以通過範圍變量(此處爲 I, 範圍爲 2~3,在實際環境配置中,結束值3可根據集羣的大小自行進行設置) 重複執行指定的命令N次。注意 seq 2 3 兩邊的符號是 數字”1” 左邊的 “`” 符,而不是單引號,表示使用其結果作爲for 的變量範圍。在實際運行中,”hadoop-I" I 會依次被替換成 2, 3, 4…., 相當於表示了 hadoop-1, hadoop-2, … 等機器主機。
  • cat hadoop-hosts.txt | root@hadoop-$I “cat >> /etc/hosts” – 本步驟將 hadoop-hosts.txt 的內容列出並通過管道傳給 ssh,在別名爲 hadoop-xx 的機器上以root用戶執行 cat 命令,將其追加到 /etc/hosts 文件中,這樣就完成了遠程機器的hosts文件配置。
  • 注意:在命令執行時,可能出現類似如下的提示信息:
  The authenticity of host 'hadoop-2 (192.168.100.5)' can't be established.
ECDSA key fingerprint is SHA256:w+6Ou6AjZvjAWg8QuQJvvmt1Q2qtXZiUvhj1pbf4JTg.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'hadoop-2,192.168.100.5' (ECDSA) to the list of known hosts.
root@hadoop-2's password: 

這是提示要求將目標機的指紋信息(fingerprint)加入本機上的 knownhosts, 這樣以後不再提示,通常輸入 yes 或直接回車即可。


3.ssh-keygen 生成私鑰對,這一步沒有什麼特別的,通常在master所在機器上進行


4.將本機的公鑰分發到集羣中的其他機器,並加入 authorized_keys。

#也是很簡單的一句命令即可完成本機到集羣中所有機器的免密碼登錄配置
for I in `seq 3` ; do ssh-copy-id -i ~/.ssh/id_rsa.pub root@hadoop-$I ;done

此處有兩點需要注意:

  • seq 命令時只有一個參數,表示本次處理的機器是 hadoop-1 ~ hadoop-3(這樣 hadoop-1 能夠 ssh 到自生)
  • ssh-copy-id 是 openssh-client 中提供的輔助腳本,可以完成 ” 拷貝id_rsa.pub 文件到遠程主機 => 檢查並加入 authorized_keys 文件 => 設置文件權限 ” 等全部內容。如果執行時提示無此命令,執行 sudo apt install openssh-client 安裝即可。

5.在網上很多介紹中,需要依次在各個節點上都生成獨立的 id_rsa + id_rsa.pub 文件,重複加入 authorized_keys 文件中,不過最簡單的配置方式就是將本機的 id_rsa 文件複製到集羣中每臺機器上,這樣大家互聯時使用相同的祕鑰,公鑰,就不用再獨立配置了(注意:由於這樣存在安全隱患,最好只在測試環境下使用,正式環境時還是使用獨立的密鑰對)。

#一個語句即可將私鑰複製到集羣所有機器,這樣集羣中的所有機器都可免密碼互相訪問
for I in `seq 3` ; do scp ~/.ssh/id_rsa root@hadoop-$I:~/.ssh/id_rsa ;done

#由於本機已經ssh過集羣中所有的機器,其 known_hosts 文件,將其複製到集羣中所有機器後,從其上再互聯時不用再確認 "fingerprint"
for I in `seq 3` ; do scp ~/.ssh/known_hosts root@hadoop-$I:~/.ssh/known_hosts ;done

總結

1.前面的示例只是建立了各個主機之間 root 賬號之間的免密碼登錄,爲了安全起見,一般需要使用特殊的用戶名(如 hadoop)來運行指定服務,甚至可以配置成不同名字的賬號間自動登錄(超過本篇文章的範疇,此處不講,有機會時再分享吧)。

2.從前面的介紹可以知道,通過 for + ssh 遠程命令 的方式,可以在集羣中一次操作大量機器,大大提升效率和減少可能的問題,希望大家都能多研究。注意在測試腳本時,一定先本地測試好後,再通過 for 命令應用到大量機器上,以免出錯後難以挽救

補充腳本(創建並設置 hadoop 自動登錄的腳本)

#在遠程主機上創建 hadoop 用戶
for I in `seq 3`; do ssh root@hadoop-$I 'useradd hadoop' ; done

#設置初始密碼爲 123456
for I in `seq 3`; do ssh root@hadoop-$I "echo 'password' | passwd --stdin hadoop" ;done

#將指定 id_rsa.pub+id_rsa 分發到集羣中各主機上hadoop賬號下,此處爲了簡單,直接使用了root的,但爲了安全,不同賬號最好用不同的密鑰對
for I in `seq 3` ; do ssh-copy-id -i /root/.ssh/id_rsa.pub hadoop@hadoop-$I ;done
#
for I in `seq 3` ; do scp /root/.ssh/id_rsa hadoop@hadoop-$I:~/.ssh/id_rsa ;done
for I in `seq 3` ; do scp /root/known_hosts hadoop@hadoop-$I:~/.ssh/known_hosts ;done

#這樣配置之後,理論上hadoop用戶即可免密碼互相訪問,可通過如下命令驗證(當即不提示輸入密碼也不報錯即表示驗證通過):
for I in `seq 3` ; do ssh hadoop@hadoop-$I "exit" ;done

補充信息

後期調查得知,更好的維護多臺機器的方式是使用 dsh(Distributed Shell).

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章