洛陽光電技術發展中心 高佳林
?
針對linux服務器交互式自動化腳本實現與研究
洛陽光電技術發展中心 高佳林
【摘要】本文介紹了在linux服務器集群之間為了降低服務器之間由于linux操作系統的安全設置所帶來不必要的損耗,所以在linux集群服務器之間實現無密碼的SSH登錄,同時為了減少人工的干預把整個過程集成到集群的安裝過程中實現.無密碼登錄SSH需要交互式腳本實現,但是普通的linux服務器無法實現無人工干預的實現服務器之間生成公鑰的過程,所以需要用expect實現。并將其寫入RPM包中,實現安裝過程的全自動化。
【關鍵詞】無密碼;SSH登錄;RPM包
隨著信息技術的快速發展,本地應用逐步轉向網絡應用,高性能計算也由傳統的主機方式向網絡化集群演變,網絡存儲已經占據了存儲系統的主流地位。伴隨著計算技術、網絡通信和信息儲存等各項技術取得的巨大進步,特別是高性能計算技術和應用軟件的快速發展,基于主機的存儲系統無法滿足應用系統的需求,傳統的網絡存儲設備,也日益成為整個應用系統的性能瓶頸。為了解決單個服務器系統在數據存儲等方面的瓶頸,提出了分布式存儲,即:數據和程序可以不位于一個服務器上,而是分散到多個服務器,以網絡上分散分布的地理信息數據及受其影響的數據庫操作為研究對象的一種理論計算模型服務器形式。分布式有利于任務在整個計算機系統上進行分配與優化,克服了傳統集中式系統會導致中心主機資源緊張與響應瓶頸的缺陷,解決了網絡GIS 中存在的數據異構、數據共享、運算復雜等問題,是系統技術的一大進步。
隨著高性能計算應用的深化以及非結構化數據的爆炸性增長,以滿足并行I/O和結構化數據I/O需求為目標的傳統存儲架構,在性能、可靠性、擴展性以及總體擁有成本上,已經無法滿足跳躍性發展的高性能計算機及其配套的大型應用軟件的需求,存儲日益成為整個應用系統的性能瓶頸。通過增加磁盤數量、提升處理器性能和內存容量等方法可以暫時緩解客戶對于性能的需求,但無法從根本上解決傳統架構存儲系統的性能瓶頸問題,這就促使存儲系統的架構必須做出改變。
1.1無密碼SSH登錄
首先需要保證系統環境已經準備就緒。但是在實際的部署過程中,特別是大集群環境下,往往會因為個別節點的環境未準備就緒導致系統安裝部署的失敗,而依靠人工維護成本較高。為此,需要一個系統安裝環境檢測的自動化工具,實現系統安裝環境的自動化檢測,并根據檢測的結果報告進行相應的處理。在系統里各個服務器之間有很多數據的交互,如果還需要密碼來實現檢測訪問用戶就會有很大額外消耗,為了服務器之間訪問的方便,需要設置機器之間直接登陸而無需輸入登陸密碼。但是又為了保證服務器之間通信的安全性所以選擇用SSH服務,用交換公鑰方式來實現安全的無密碼登錄。
下面通過實驗實現兩臺模擬服務器之間的通信:有Server A,Server B通過一個交換機連接Server A的IP地址是192.168.0.1,而Server B的IP地址是192.168.0.2。
(1)從集群中選擇一臺服務器Server A,然后執行sshkeygen–t rsa命令,在目錄~/root/.ssh目錄下生成id_rsa和id_rsa.pub密鑰對。
(2)將Server A上~/root/.ssh目錄下的文件authorized_keys、id_rsa拷貝到其它的服務節點的~/root/.ssh目錄下。
(3)將Server A上/etc/hosts文件拷貝到其它服務節點的/etc目錄下。
(4)從ServerA上使用命令“ssh IP地址”登錄其它的服務器節點,然后在其它的服務節點上刪除Server A的訪問記錄,操作方法是刪除其它服務器節點上/root/.ssh/known_hosts文件中關于ServerA的訪問記錄,以實現雙向的無密碼訪問。
(5)為了提高訪問效率,需要修改每臺服務器上的文件/etc/ssh/sshd_config,將其中的“UseDNS”的值改為“no”,即取消其前面的注釋符“#”,然后將“MaxStartups”的值設置更大的值,如100,并取消其前面的注釋符“#”。修改完后運行“/etc/init.d/sshd restart”讓配置文件生效。
(6)進行完上述的操作后,在每臺服務器上實行“ssh 192.168.0.1”操作,如果還需要輸入密碼,則執行ssh-copy-id –i /root/.ssh/id_rsa.pub 192.168.0.1發送公鑰給192.168.0.1。
如此就可以實現服務器間無密碼訪問了。上述操作如圖1所示。

圖1
1.2自動化腳本
此時已經可以實現服務器無密碼登錄但是我們要將其整個過程自動化實現。要實現的自動化過程是寫入sshkeygen–t rsa屏幕上輸出要求設定生成密鑰的目錄直接回車后選擇默認的目錄,然后屏幕會提示要求輸入互通的密鑰,依然回車選擇默認的空密碼。但通過實驗發現簡單的通過shell腳本無法一次性的自動生成密鑰文件,將上面的命令全部按照語法寫入shell腳本后運行時總會有輸入密碼的提示,通過內核分析得知Linux操作系統為了自身的安全考慮默認阻止了公鑰的一次性生成,為了解決這個問題我們使用了expect這個文件在編譯安裝后寫入交互式腳本如下:
#!/usr/local/bin/expect –f
set timeout 80
set server “ ”
spawn ssh-keygen -t rsa
expect “Enter file in which to save the key (/root/.ssh/id_rsa):”
send “ ”
expect “Enter passphrase (empty for no passphrase):”
send “ ”
expect “Enter same passphase again:”
send “ ”
expect eof
exit
此時可以在運行腳本后發現/root/.ssh/目錄下生成了密鑰文件,在寫入shell腳本即可實現服務器之間的無密碼登錄。
此時我們已經可以實現服務器之間的無密碼的登錄操作了,服務器可以實現降低之間消耗的操作了,于此同時我們需要將其寫入RPM包中將其打包到分布式系統安裝軟件上去,從而實現分布式系統安裝過后的無人工干預操作。此時需要用到rpmbuild這個命令來完成RPM包得生成,可以編輯.spec文件來實現我們想要的在安裝操作過程中所需要的服務器,與此同時因為很多linux服務器是默認不支持expect軟件的所以需要把expect軟件安裝的整個過程寫入RPM包得生成。故程序如下:
summary:tcl_exp
name:tcl_exp
Version:1.0.0
release:1
license:GPL
source: tcl_exp.tar.gz
group:system
%description
tcl_exp
%prep
%setup -c
%install
mkdir -p /home/tcl_exp
tar xvf /usr/src/redhat/SOURCES/tcl_exp.tar.gz -C /home/tcl_exp/
chmod 777 /home/tcl_exp/*
echo "start tar tcl"
tar -zxvf /home/tcl_exp/tcl_exp/tcl8.4.19-src.tar.gz -C /home/
tcl_exp/tcl_exp/
cd /home/tcl_exp/tcl_exp/tcl8.4.19/
cd unix
./configure --prefix=/expect
make
make install
tar -zxvf /home/tcl_exp/tcl_exp/expect-5.43.0.tar.gz -C /home/
tcl_exp/tcl_exp/
cd /home/tcl_exp/tcl_exp/expect-5.43/
./configure --with-tclinclude=/root/tcl8.4.19/generic/ --with-tclconfig=/
usr/local/lib
make
make install
%files
/usr/src/redhat/SOURCES/tcl_exp.tar.gz
/home/tcl_exp/tcl_exp/tcl8.4.19-src.tar.gz
/home/tcl_exp/tcl_exp/expect-5.43.0.tar.gz
%preun
應用此種方法可以解決了在部署云存儲平臺時所面臨的一些問題,實現了這些問題雖然小但是卻極大的阻礙了存儲平臺的自動化實施,因此不得不耗費人力,并且這種方法可以擴展到很多的計算平臺的應用上。可以實現在安裝云存儲平臺前對于網絡架構的自動化檢測,減少人的參與,從而提高效率,減少不要的麻煩。
參考文獻
[1]王勇.ParaStor:一種海量數據存儲系統(這個是一個技術文檔).
[2]張健.parastor使用說明文檔.北京曙光科技有限公司(這個是一個技術文檔).
[3]曙光幵行存儲系統.北京曙光科技有限公司.
[4]龔靖,雷俊智,龍洋.云存儲解析[M].人民郵電出版社.