10.Shell项目实战
1.Shell
典型应用之主机存活状态,要求判断三次,如果三次失败则失败
cat ping_count_3.sh
#!/usr/bin/bash
IP="192.168.70"
for i in {150..170}
do
IP_UP=$IP.$i
for i in {1..3}
do
{
ping -c1 -W1 $IP_UP &>/dev/null
if [ $? -eq 0 ];then
echo $IP_UP 连接成功!
break
fi
echo $IP_UP 尝试"$i"次失败!
}&
done
done
2.Shell典型应用之MySQL
部署
cat mysql_install.sh
#!/usr/bin/bash
#1.检查是否存在mysql对应的软件包
rpm_install_mysql(){
rpm_check_mysql=$(rpm -qa|grep mysql-community-server|wc -l)
rpm_check_mysql_version=$(rpm -qa|grep mysql-community-server)
if [ $rpm_check_mysql -eq 0 ];then
cat >/etc/yum.repos.d/mysql.repo<<-EOF
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
EOF
yum clean all && yum makecache
yum install -y mysql-community-server
else
echo "${rpm_check_mysql_version%-*} Installed Ok"
fi
}
#2.初始化MySQL数据库
clear_mysql(){
systemctl start mysqld
if [ $? -eq 0 ];then
Mysql_old_pass=$(grep "temporary password" /var/log/mysqld.log |tail -n1|awk -F '[ :]' '{print $NF}')
mysqladmin -uroot -p"$Mysql_old_pass" password "Xuliangwei.com123"
fi
}
rpm_install_mysql
clear_mysql
3.Shell典型应用之LNMP架构部署
config目录
nginx_install.sh
php_install.sh
4.Shell典型应用之服务器初始化脚本
1.配置yum源
2.安装基础软件
yum install -y vim nc iotop iftop glances dstat telnet wget
更新系统内核、
yum update && rm -rf /etc/yum.repos.d/CentOS*
3.调整文件描述符
/etc/security/limits.d/20-nproc.conf
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
4.调整时区
test -f /etc/localtime && rm -f /etc/localtime && \
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
5.调整语言
sed -i 's#LANG=.*#LANG="en_US.UTF-8"#g' /etc/locale.conf
6.时间同步
7.调整防火墙与selinux
8.关闭ipv6
cd /etc/modprobe.d/ && touch ipv6.conf
cat >> /etc/modprobe.d/ipv6.conf << EOF
alias net-pf-10 off
alias ipv6 off
EOF
9.调整历史记录
修改为100000
grep -q 'HISTTIMEFORMAT' /etc/profile
if [ $? -eq 0 ];then
sed -i 's/^HISTTIMEFORMAT=.*$/HISTTIMEFORMAT="%F %T"/' /etc/profile
else
echo 'HISTTIMEFORMAT="%F %T "' >> /etc/profile
fi
10调整内核参数
cat >> /etc/sysctl.conf <<EOF
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=0
EOF
1.Shell典型应用之主控脚本实现
cat montor_main.sh
#!/usr/bin/bash
resettem=$(tput sgr0)
declare -A ssharray
i=0
numbers=""
for scripts_file in `ls -I "montor_main.sh" ./`
do
echo -e "\e[1;35m" "The Scripts:" ${i} '==>' ${resettem} ${scripts_file}
ssharray[$i]=${scripts_file}
numbers="${numbers} | ${i}"
i=$((i+1))
done
while true
do
read -p "Please input a number [ ${numbers} ]:" execshell
if [[ ! ${execshell} =~ ^[0-9]+ ]];then
exit
fi
/usr/bin/bash ./${ssharray[$execshell]}
done
2.Shell典型应用之系统信息及运行状态获取
cat system_info.sh
#!/usr/bin/bash
#Program function system_info
resettem=$(tput sgr0)
# Check OS Type
Os=$(hostnamectl |awk -F":" '/Operating System/ {print $2}')
echo -e "\e[1;35m" "当前的系统版本-->" "${resettem}""${Os}"
# Check Kernel Release
Os_kernel=$(hostnamectl |awk -F":" '/Kernel/ {print $2}')
echo -e "\e[1;35m" "当前的系统内核-->" "${resettem}""${Os_kernel}"
# Check Architecture
Os_Arch=$(hostnamectl |awk -F":" '/Architecture/ {print $2}')
echo -e "\e[1;35m" "当前的系统平台-->" "${resettem}""${Os_Arch}"
# Check Hostname
Os_HostName=$(hostnamectl |awk -F":" '/Static hostname/ {print $2}')
echo -e "\e[1;35m" "当前的系统名称-->" "${resettem}""${Os_HostName}"
# Check Internal IP
Internalip=$(hostname -I)
echo -e "\e[1;35m" "当前的内网IP-->" "${resettem}""${Internalip}"
# Check External IP
Externalip=$(curl -s icanhazip.com)
echo -e "\e[1;35m" "当前的外网IP-->" "${resettem}""${Externalip}"
# Check DNS Name
NameServer=$(awk "/nameserver/{print $2}" /etc/resolv.conf)
echo -e "\e[1;35m" "当前的DNS-->" "${resettem}""${NameServer}"
# Check if connected to Internet or not
ping -c2 xuliangwei.com &>/dev/null && \
echo -e "\e[1;35m" "当前网络畅通-->" "${resettem}""Connected" || \
echo -e "\e[1;35m" "当前网络阻塞-->" "${resettem}""Disconnected"
# Check Logged In Users
who>/tmp/who
echo -e "\e[1;35m" "用户状态信息-->" "${resettem}" && \
cat /tmp/who && rm -f /tmp/who
# Check System Free
system_mem_usages=$(free -mh|awk '/Mem/{print $NF}')
echo -e "\e[1;35m" "系统可用内存-->" "${resettem}""${system_mem_usages}"
# Check System Load
loadaverge=$(top -n 1 -b|awk '/load/{print $12,$13,$14}')
echo -e "\e[1;35m" "系统负载状态-->" "${resettem}""${loadaverge}"
# Chkek Disk
DiskStatus=$(df -h|awk '!/(Filesystem|tmpfs|boot)/')
echo -e "\e[1;35m" "系统磁盘状态-->" "${resettem}""${DiskStatus}"
4.Shell典型应用之nginx和mysql应用状态分析
监控MySQL主从复制状态
1.搭建主从复制环境
2.基于mysql客户端连接,获取主从复制状态
3.使用show slave status\G;获取状态信息
Slave_IO_Running IO线程是否有连接到主服务器上
Seconds_Behind_Master 主从同步的延时时间
cat mysql_status.sh
#!/usr/bin/bash
#Program-function 这是MySQL主从同步检测脚本
IP=192.168.70
User=remote
Pass=Bgx123.com
Sync_Date=$(date +%F)
for i in {160..161}
do
IP_MySQL=$IP.$i
echo "##正在操作$IP_MySQL"
/usr/bin/mysql -h$IP_MySQL -u$User -p$Pass -e "show slave status\G" 2>/dev/null|egrep -i 'Slave_IO_Running:|Slave_SQL_Running:' &>/tmp/status.txt
if [ ! -s /tmp/status.txt ];then
echo "当前MySQL是主库"
break
fi
IO=$(grep "IO" /tmp/status.txt |awk '{print $2}')
SQL=$(grep "SQL" /tmp/status.txt |awk '{print $2}')
if [[ $IO == "Yes" && $SQL == "Yes" ]];then
echo "当前MySQL主从状态OK"
else
#mail -s "主从同步失败$IP_MySQL" </tmp/status.txt
/usr/bin/mail -s "${Sync_Date}-${IP_MySQL}主从同步失败" 552408925@qq.com <"/tmp/status.txt"
echo "当前Slave的IO状态是: $IO"
echo "当前Slave的SQL状态是: $SQL"
fi
done
4.Shell典型应用之应用日志分析
cat loginfo.sh
#!/usr/bin/bash
resettem=$(tput sgr0)
Logfile=/soft/scripts/log/log.bjstack.log
Nginx_Status_code=( $(cat $Logfile |egrep -io "HTTP/1\.[0|1]\"[[:blank:]][0-9]{3}"|awk -F "[ ]+" '{
if($2>=100 && $2<200)
{i++}
else if($2>=200 && $2<300)
{j++}
else if($2>=300 && $2<400)
{k++}
else if($2>=400 && $2<500)
{n++}
else if($2<500)
{p++}
}END{ print i?i:0,j?j:0,k?k:0,n?n:0,p?p:0,i+j+k+n+p}'
))
echo -e "\e[1;35m" "Http Status[100+]: ""${resettem} ${Nginx_Status_code[0]}"
echo -e "\e[1;35m" "Http Status[200+]: ""${resettem} ${Nginx_Status_code[1]}"
echo -e "\e[1;35m" "Http Status[300+]: ""${resettem} ${Nginx_Status_code[2]}"
echo -e "\e[1;35m" "Http Status[400+]:""${resettem} ${Nginx_Status_code[3]}"
echo -e "\e[1;35m" "Http Status[500+]:""${resettem} ${Nginx_Status_code[4]}"
echo -e "\e[1;35m" "Http Status[Total]:""${resettem} ${Nginx_Status_code[5]}"
作业
作业
1.请使用一台主机执行Shell脚本,给其他机器部署MySQL
1.使用ssh无密码登录系统
2.对端系统存在对应的仓库
3.能够使用yum进行安装
2.Shell典型应用之LNMP架构部署
1.脚本运行后输入IP,即可访问phpinfo页面
3.Shell典型应用之系统初始化
1.基于该脚本进行扩展
2.基于该脚本做响应的判断与输出
4.shell主从同步
0.搭建主从同步(原理讲解一遍,提交作业)
1.判断端口是否能正常连接
2.登陆从库进行状态查看
3.提取状态信息进行比对
4.比对mysql主从同步延迟