標籤:des style blog 檔案 os art
1). 背景:
叢集部署的時候, 需要一致的配置和環境設定. 對於虛擬機器叢集, 可以藉助鏡像拷貝, 複製和還原叢集機器. 對與物理機叢集而言, 則不一樣, 如果機器一多, 多人去操作和配置, 對於成熟精乾的團隊還好, 對於不熟悉環境的小團隊, 由於水平的參差不齊, 往往會導致不一致的環境. 因此無論如何, 寫指令碼進行自動化的配置和環境校正總是最佳實務.
2). 假設應用情境:
*) 系統內容:
安裝CDH5, 叢集規模為16台機器, 每台機器16CPU, 記憶體16G, 2塊SATA盤共500G, 作業系統為Centos 6.4.
叢集機器, ip範圍為192.168.1.101~192.168.1.116.
*) 基本要求
安裝CDH5時, 需要滿足以下基本要求
#) 需要配置每台機器的/etc/hosts檔案, 使得每台機器擁有叢集所有機器的網域名稱
#) 需要關閉防火牆, 並禁止開啟啟動
#) 需要配置本地yum源
#) 磁碟分割盡量滿足/mnt/disk{N}的形式
#) 機器時間基本同步
3). 具體實施
*) 配置叢集的ssh無登入登入
選擇一台中控機(跳板機), 或者叢集的某台機器, 作為自動化指令碼的發起端, 作為系統管理員, 採用root使用者.
#) 本地建立RSA密鑰, 產生RSA公開金鑰/私密金鑰對
mkdir -p ~/.ssh
cd ~/.ssh
ssh-keygen -t rsa -P ‘‘
預設產生id_rsa(私密金鑰), id_rsa.pub(公開金鑰)檔案
#) 編輯指令碼
ssh-copy-id -i id_rsa [email protected]<target_ip>
#! /bin/bashusername="root"server_ips=( "192.168.1.101" "192.168.1.102" "192.168.1.103" "192.168.1.104" "192.168.1.105" "192.168.1.106" "192.168.1.107" "192.168.1.108" "192.168.1.109" "192.168.1.110" "192.168.1.111" "192.168.1.112" "192.168.1.113" "192.168.1.114" "192.168.1.115" "192.168.1.116" )for (( i = 0; i < ${#server_ips[*]}; i++ )); do ssh-copy-id -i ~/.ssh/id_rsa [email protected]${server_ips[i]}done
執行, 當然這步還是痛苦的, 需要手動輸入16次密碼(16台機器).
#) 開啟RSA驗證
編輯/etc/ssh/sshd_conf
RSAAuthentication yesPubkeyAuthentication yesAuthorizedKeysFile .ssh/authorized_keysGSSAPIAuthentication noUseDNS no
前三項, 用於開啟RSA服務, 後兩項用於解決初始串連SSH響應慢的問題
#) 重啟ssh服務
service sshd restart
*) 編寫自動化指令碼
#! /bin/bashusername="root"server_ips=( "192.168.1.101" "192.168.1.102" "192.168.1.103" "192.168.1.104" "192.168.1.105" "192.168.1.106" "192.168.1.107" "192.168.1.108" "192.168.1.109" "192.168.1.110" "192.168.1.111" "192.168.1.112" "192.168.1.113" "192.168.1.114" "192.168.1.115" "192.168.1.116" )# description:# 在各個節點上, 執行命令, 並把執行結果匯總到一個檔案中, 便於對比# params:# $1 => command, 要執行的命令# $2 => filename, 要儲存輸出結果的檔案, 用於結果對比execute_all_servers() { ssh_command=$1 result_file=$2 echo "start execute..." > $result_file for (( i = 0; i < ${#server_ips[*]}; i++ )); do echo "server_ip: ${server_ips[i]}, execute command: ‘$ssh_command‘" >> $result_file ssh [email protected]${server_ips[i]} "$ssh_command" >> $result_file echo "=================================" >> $result_file done}
#) 檢測/etc/hosts檔案
execute_all_servers "cat /etc/hosts" "check_hosts_result.log"
#) 磁碟分割和掛載檢測
execute_all_servers "df -h ; fdisk -l" "check_fdisk_result.log"
#) 防火牆關閉檢測
execute_all_servers "service iptables status" "check_iptable_result.log"
#) 防火牆關閉命令
execute_all_servers "service iptables stop ; chkconfig --levels 235 iptables off" "stop_iptables_result.log"
其他需要加的環境檢測和環境配置, 皆可採用類似的方式去實現, 這並非完美, 只是提供了一種解決思路