大資料學習——shell程式設計
03/ shell程式設計綜合練習
自動化軟體部署指令碼
3.1 需求
1、需求描述
公司內有一個N個節點的叢集,需要統一安裝一些軟體(jdk)
需要開發一個指令碼,實現對叢集中的N臺節點批量自動下載、安裝jdk
2、思路
1/ 編寫一個啟動指令碼,用來發送一個軟體安裝指令碼到每一臺機器
2/ 然後啟動每臺機器上的軟體安裝指令碼來執行軟體下載和安裝
3、expect的使用
痛點:使用scp命令遠端拷貝檔案時,會有人機互動的過程,如何讓指令碼完成人機互動?
妙藥: expect
用法示例:
先觀察 ssh localhost 的過程
再看expect的功能
#!/bin/bash/expect ## exp_test.sh set timeout -1; spawn ssh localhost; expect { "(yes/no)" {send "yes\r";exp_continue;} "password:" {send "hadoop\r";exp_continue;} eof {exit 0;} } |
執行: expect -f exp_test.sh
3.2 準備內網軟體下載伺服器
選擇一臺伺服器(比如mini)作為軟體源伺服器
1、安裝httpd (如果已有,可跳過)
yum install -y httpd
service httpd start
chkconfig --level 35 httpd on
2、製作區域網yum源
1/ 掛載centos安裝光碟到/mnt/cdrom (如果已有,可跳過)
mkdir /mnt/cdrom
mount -t iso9660 -o loop /dev/cdrom /mnt/cdrom
2/ 將本地yum庫放入httpd伺服器
ln -s /mnt/cdrom /var/www/html/centos
檢查點:用瀏覽器訪問 http://mini/centos 看能否看到光碟內容
3、編寫repo配置
vi /etc/yum.repos.d/centos.repo
[c6-httpd] name=CentOS-httpd baseurl=http://192.168.33.3/centos gpgcheck=0 enabled=1 |
4、分發repo配置到區域網
從母雞shizhan01上把centos.repo拷貝給所有需要自動安裝軟體的伺服器(仔雞mini1/mini2)
cd /etc/yum.repos.d/
scp /etc/yum.repos.d/innet.repo mini1:$PWD
scp /etc/yum.repos.d/innet.repo mini2:$PWD
5、準備一個jdk安裝包放在內網web伺服器上
3.3 指令碼開發
1、啟動指令碼
vi boot.sh
#!/bin/bash
SERVERS="mini1 mini2" PASSWORD=hadoop BASE_SERVER=192.168.33.11
## 實現免密登陸配置的函式 auto_ssh_copy_id() { expect -c "set timeout -1; spawn ssh-copy-id $1; expect { *(yes/no)* {send -- yes\r;exp_continue;} *assword:* {send -- $2\r;exp_continue;} eof {exit 0;} }"; }
ssh_copy_id_to_all() { for SERVER in $SERVERS do auto_ssh_copy_id $SERVER $PASSWORD done }
## 呼叫免密登陸配置函式,實現母雞到各仔雞的免密登陸配置 ssh_copy_id_to_all
## 完成分發install.sh到各仔雞的操作 ## 並讓仔雞啟動install.sh for SERVER in $SERVERS do scp install.sh [email protected]$SERVER:/root ssh [email protected]$SERVER /root/install.sh done |
2、安裝執行指令碼
vi install.sh
#!/bin/bash
BASE_SERVER=192.168.33.11 ## 為本機安裝wget命令 yum install -y wget ## 使用wget從母雞的web伺服器上下載jdk壓縮包 wget $BASE_SERVER/soft/jdk-7u67-linux-x64.gz ## 將下載的壓縮包解壓 tar -zxvf jdk-7u67-linux-x64.gz -C /usr/local ## 修改profile配置檔案 cat >> /etc/profile << EOF export JAVA_HOME=/usr/local/jdk1.7.0_67 export PATH=\$PATH:\$JAVA_HOME/bin EOF |
3、啟動指令碼
只要在baseServer即mini上啟動boot.sh即可