學(xué)習(xí)linux運(yùn)維已經(jīng)3個(gè)多月了,搭建8臺(tái)的小型集群對(duì)學(xué)習(xí)效果的一次檢驗(yàn)和復(fù)習(xí)
其實(shí)還可以把分發(fā)公鑰也寫(xiě)到各服務(wù)器的腳本里,甚至在遍歷IP腳本里用三次for循環(huán)來(lái)免去生成IP文件及腳本列表的依賴(lài),但這這些只是在此流程上的優(yōu)化,總的思路還是一樣的.當(dāng)然用工具也是一樣的,比如sshpass免交互工具,ansible自動(dòng)化工具等等,這里用純腳本的思路,更重要的是能對(duì)學(xué)習(xí)來(lái)一次全面復(fù)習(xí).
因?yàn)閷?shí)體機(jī)與虛擬機(jī)在用密鑰連接出現(xiàn)bug,本次直接在管理機(jī)m01上操作,所以只有7臺(tái)服務(wù)器的腳本.
主機(jī)網(wǎng)絡(luò)參數(shù)配置:
主機(jī)名 | 網(wǎng)卡ens33 | 網(wǎng)卡ens37 | 用途 |
---|---|---|---|
lb01 | 10.0.0.5/24 | 172.16.1.5/24 | nginx負(fù)載均衡服務(wù)器01 |
lb02 | 10.0.0.6/24 | 172.16.1.6/24 | nginx負(fù)載均衡服務(wù)器02 |
web02 | 10.0.0.7/24 | 172.16.1.7/24 | apache web服務(wù)器 |
web01 | 10.0.0.8/24 | 172.16.1.8/24 | nginx web服務(wù)器 |
db01 | 10.0.0.51/24 | 172.16.1.51/24 | mysql數(shù)據(jù)庫(kù)服務(wù)器 |
nfs01 | 10.0.0.31/24 | 172.16.1.31/24 | NFS存儲(chǔ)服務(wù)器 |
backup | 10.0.0.41/24 | 172.16.1.41/24 | 存儲(chǔ)服務(wù)器 |
m01 | 10.0.0.61/24 | 172.16.1.61/24 | 管理服務(wù)器 |
必要的配置文件安裝包等
腳本
遍歷IP.sh
#!/bin/sh
echo "一鍵搭建集群腳本啟動(dòng)..."
#清空ip.txt
> ip.txt
#因?yàn)閐hcp設(shè)定在此區(qū)間
for i in {100..254}
do
ip=10.0.0.$i
ping -c1 -w1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "獲取到$ip"
echo "$ip" >>ip.txt
fi
done
echo "ip查找完成"
sh sshdsapub.sh
ssh公鑰分發(fā)(sshdsapub.sh)
#!/usr/bin/expect
#!/bin/sh
pass="password"
#檢測(cè)本機(jī)上已經(jīng)有公鑰
ls ~/.ssh/id_dsa.pub
if [ $? -eq 0 ];then
echo "ssh-keygen已創(chuàng)建"
else
echo "ssh-keygen未創(chuàng)建"
ssh-keygen -t dsa -P "" -f ~/.ssh/id_dsa >/dev/null 2>&1
echo "ssh-keygen已創(chuàng)建"
fi
for i in $(cat ip.txt)
do
echo "正在往$i推送公鑰"
#expect免交互推送公鑰
/usr/bin/expect <<-EOF
set timeout 10
spawn ssh-copy-id -i /home/xhlieren/.ssh/id_dsa.pub root@$i
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send "$pass\r" }
}
expect eof
EOF
done
wait
echo "公鑰推送完成"
sh 集群服務(wù)器腳本IP注入.sh
集群服務(wù)器腳本IP注入.sh
初始時(shí),各服務(wù)器安裝配置腳本中(如,backup.sh,nfs.sh...)并沒(méi)有寫(xiě)入IP(因?yàn)閐hcp下,ip并不是固定的),把遍歷到的ip注入到這些腳本的第二行.
#!/bin/bash
echo "ip注入腳本啟動(dòng)"
cp 集群8臺(tái)服務(wù)器腳本分發(fā)配合文本.txt 集群8臺(tái)服務(wù)器腳本分發(fā)配合文本.txt.ori
for i in $(cat ip.txt)
do
for n in $(cat 集群服務(wù)器腳本分發(fā)配合文本.txt.ori)
do
sed -i "2 i\ip=$i" $n
echo "$n:ip已注入"
#通過(guò)刪除首行和跳出循環(huán)的方式寫(xiě)入ip,如果有更方便的交替執(zhí)行循環(huán)方式,請(qǐng)告訴我
sed -i '1d' 集群服務(wù)器腳本分發(fā)配合文本.txt.ori
break
done
done
echo "ip注入完成"
rm -f 集群服務(wù)器腳本分發(fā)配合文本.txt.ori
sh 集群服務(wù)器并發(fā)安裝配置優(yōu)化.sh
集群服務(wù)器腳本分發(fā)配合文本.txt
供ip注入及并發(fā)執(zhí)行安裝配置腳本使用的文本,僅寫(xiě)入各服務(wù)器安裝配置腳本名
nfs01.sh
backup.sh
web01.sh
db01.sh
web02.sh
lb01.sh
lb02.sh
集群服務(wù)器并發(fā)安裝配置優(yōu)化.sh
#!/bin/sh
for i in $(cat 集群服務(wù)器腳本分發(fā)配合文本.txt)
do
#后臺(tái)執(zhí)行各服務(wù)器安裝配置腳本
{
echo "$i腳本啟動(dòng)"
sh $i
}&
done
#等待所有后臺(tái)腳本全部執(zhí)行完成
wait
echo "集群安裝完成"
sh 集群服務(wù)器重啟.sh
集群服務(wù)器重啟.sh
#!/bin/sh
echo "服務(wù)器重啟腳本開(kāi)啟..."
for i in $(cat ip.txt)
do
{
echo "$i重啟中..."
ssh root@$i reboot
}&
wait
echo "服務(wù)器重啟完畢,請(qǐng)使用設(shè)定的IP地址連接"
至此,一鍵搭建集群腳本的流程就結(jié)束了
下面是各服務(wù)器的安裝配置腳本,軟件用到的配置文件和軟件包要結(jié)合需求來(lái)設(shè)定
backup.sh
這是未注入ip時(shí)的腳本內(nèi)容
#!/bin/sh
echo "backup服務(wù)器配置中..."
#關(guān)閉防火墻并禁止開(kāi)機(jī)自啟
ssh root@$ip systemcat stop firewalld
ssh root@$ip systemcat disable firewalld
#安裝必要的軟件包
ssh root@$ip yum install -y rsync nfs-utils gcc lib* ntp mailx
#name
ssh root@$ip echo "backup" >/etc/hostname
#ntp時(shí)間同步
ssh root@$ip systemctl enable ntpd
ssh root@$ip systemctl start ntpd
ssh root@$ip timedatectl set-timezone Asia/Shanghai
ssh root@$ip timedatectl set-ntp yes
ssh root@$ip ntpq -p
#配置ens33
scp ~/conf/ifcfg-ens33 root$ip:/etc/sysconfig/network-scripts/ifcfg-ens33
ssh root@$ip sed -i "s#IPADDR=#IPADDR=10.0.0.41#g" /etc/sysconfig/network-scripts/ifcfg-ens33
#配置ens37
scp ~/conf/ifcfg-ens37 root$ip:/etc/sysconfig/network-scripts/ifcfg-ens37
ssh root@$ip sed -i "s#IPADDR=#IPADDR=172.16.1.41#g" /etc/sysconfig/network-scripts/ifcfg-ens37
#配置rsync
ssh root@$ip useradd rsync -s /sbin/nologin -M
scp ~/conf/rsyncd.conf root@$ip:/etc/rsyncd.conf
ssh root@$ip echo "rsync_backup:123456" >/etc/rsync.password
ssh root@$ip chmod 600 /etc/rsync.password
ssh root@$ip mkdir /backup -p
ssh root@$ip chown rsync.rsync /backup/
ssh root@$ip systemcat start rsync
ssh root@$ip systemcat enable rsync
#sersync實(shí)時(shí)同步配置,配合NFS
ssh root@$ip mkdir /data/ -p
ssh root@$ip mkdir /dataweb/ -p
#mail配置
scp ~/conf/mail.rc root@$ip:/etc/mail.rc
#crontab-check_and_del,如果文件存在就直接寫(xiě)入定時(shí)任務(wù),如果文件不存在先創(chuàng)建文件,設(shè)定權(quán)限后再寫(xiě)入定時(shí)任務(wù)
ssh root@$ip ls /var/spool/cron/root
if [ $? -eq 0 ];then
ssh root@$ip echo "01 00 * * * /usr/bin/sh /server/scripts/check_and_del.sh >/dev/null 2>&1" >>/var/spool/cron/root
else
ssh root@$ip touch /var/spool/cron/root
ssh root@$ip chmod 600 /var/spool/cron/root
ssh root@$ip echo "01 00 * * * /usr/bin/sh /server/scripts/check_and_del.sh >/dev/null 2>&1" >>/var/spool/cron/root
fi
#check_and_del.sh
ssh root@$ip mkdir /server/scripts -p
scp ~/conf/scripts/check_and_del.sh root@$ip:/server/scripts/check_and_del.sh
ssh root@$ip chmod +x /server/scripts/check_and_del.sh
#ssh優(yōu)化
scp ~/conf/sshd_config root@$ip:/etc/ssh/sshd_config
#執(zhí)行完成后刪除第2行ip,注意腳本中其它位置也不要出現(xiàn)"ip=地址",正則匹配指定行刪除還不明白,sed的sg可以指定行匹配,但只會(huì)清空指定行增加行數(shù),而不是刪除行
sed -i "/^ip.*[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/d" backup.sh
#sudo審計(jì)要結(jié)合實(shí)際情況,配置/etc/sudoers文件即可
nfs01.sh
#!/bin/sh
echo "nfs01服務(wù)器配置中..."
#關(guān)閉防火墻并禁止開(kāi)機(jī)自啟
ssh root@$ip systemcat stop firewalld
ssh root@$ip systemcat disable firewalld
#安裝必要的軟件包
ssh root@$ip yum install -y rsync nfs-utils gcc lib* ntp rpcbind
#name
ssh root@$ip echo "nfs01" >/etc/hostname
#ntp時(shí)間同步
ssh root@$ip systemctl enable ntpd
ssh root@$ip systemctl start ntpd
ssh root@$ip timedatectl set-timezone Asia/Shanghai
ssh root@$ip timedatectl set-ntp yes
ssh root@$ip ntpq -p
#配置ens33
scp ~/conf/ifcfg-ens33 root$ip:/etc/sysconfig/network-scripts/ifcfg-ens33
ssh root@$ip sed -i "s#IPADDR=#IPADDR=10.0.0.31#g" /etc/sysconfig/network-scripts/ifcfg-ens33
#配置ens37
scp ~/conf/ifcfg-ens37 root$ip:/etc/sysconfig/network-scripts/ifcfg-ens37
ssh root@$ip sed -i "s#IPADDR=#IPADDR=172.16.1.31#g" /etc/sysconfig/network-scripts/ifcfg-ens37
#rsync配置
ssh root@$ip echo "123456" >/etc/rsync.password
ssh root@$ip chmod 600 /etc/rsync.password
ssh root@$ip systemcat start rsync
ssh root@$ip systemcat enable rsync
#sersync配置
ssh root@$ip mkdir ~/tools/ -p
scp ~/tools/sersync2.5.4.tar.gz root@$ip:~/tools/
ssh root@$ip tar xf ~/tools/sersync-2.5.4.tar.gz
ssh root@$ip mkdir /application/ -p
ssh root@$ip cp ~/tools/sersync2.5.4/ /application/
ssh root@$ip chmod +x /etc/rc.local
ssh root@$ip echo "/application/bin/sersync2 -d -r -n 8 -o /application/conf/confxml.xml" >>/etc/rc.local
ssh root@$ip /application/bin/sersync2 -d -r -n 8 -o /application/conf/confxml.xml
#nfs
useradd -u 1001 www -s /sbin/nologin -M
ssh root@$ip mkdir /data -p
ssh root@$ip chown -R nfsnobody.nfsnobody /data
ssh root@$ip mkdir /dataweb/nfs-blog -p
ssh root@$ip chown -R www.www /dataweb/
scp ~/conf/exports root@$ip:/etc/exports
ssh root@$ip systemctl start rpcbind.service
ssh root@$ip systemctl start nfs.service
ssh root@$ip systemctl enable rpcbind.service
ssh root@$ip systemctl enable nfs.service
#bak.sh,重要配置定時(shí)備份
ssh root@$ip mkdir /server/scripts -p
scp ~/conf/scripts/bak.sh root@$ip:/server/scripts/bak.sh
ssh root@$ip chmod +x /server/scripts/bak.sh
#crontab+bak.sh
ssh root@$ip ls /var/spool/cron/root
if [ $? -eq 0 ];then
ssh root@$ip echo "01 00 * * * /usr/bin/sh /server/scripts/bak.sh >/dev/null 2>&1" >>/var/spool/cron/root
else
ssh root@$ip touch /var/spool/cron/root
ssh root@$ip chmod 600 /var/spool/cron/root
ssh root@$ip echo "01 00 * * * /usr/bin/sh /server/scripts/bak.sh >/dev/null 2>&1" >>/var/spool/cron/root
fi
#ssh優(yōu)化
scp ~/conf/sshd_config root@$ip:/etc/ssh/sshd_config
#執(zhí)行完成后刪除第2行ip,注意腳本中其它位置也不要出現(xiàn)IP地址,正則匹配指定行刪除還不明白,sed的sg可以指定行匹配,只會(huì)清空指定行增加行數(shù),而不是刪除行
sed -i "/^ip.*[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/d" backup.sh
#sudo審計(jì)要結(jié)合實(shí)際情況,配置/etc/sudoers文件即可
其他服務(wù)器安裝配置腳本即平時(shí)學(xué)習(xí)中的配置步驟,就不一一上傳了,完成所有腳本后,基本上會(huì)把學(xué)到知識(shí)重新梳理一遍,加深對(duì)集群框架的了解.