03-Shell脚本
星期一, 4月 7, 2025 | 5分钟阅读

关于Linux系统大数据环境搭建——03-Shell脚本。
03-Shell脚本
添加开机启动项
需求:服务器开机后自动与cn.ntp.org.cn同步时间。
mkdir /usr/local/scripts
touch /usr/local/scripts/auto_ntpdate.sh
echo '#!/bin/bash' >> /usr/local/scripts/auto_ntpdate.sh
echo 'yum info ntp && yum -y install ntp && ntpdate cn.ntp.org.cn' >> /usr/local/scripts/auto_ntpdate.sh
chmod u+x /usr/local/scripts/auto_ntpdate.sh
echo '/usr/local/scripts/auto_ntpdate.sh' >> /etc/rc.d/rc.local
chmod u+x /etc/rc.d/rc.local
虚拟机初始化脚本
目标服务器环境如下:
首先,使用最初始的example
虚拟机克隆出一台完整虚拟机。然后,启动虚拟机并修改网络配置与主机名:
-
修改网络配置中的
IPADDR
并重启网络; -
echo node01 > /etc/hostname
修改主机名。
接下来,sh init.sh
运行脚本。
最后,拍摄快照方便后期回退。
然后通过已经初始化完成的node01完整克隆出 node02和 node03,修改它两的网络配置与主机名即可。
虚拟机初始化脚本 init.sh 完整内容如下:
#!/bin/bash
## -bash: ./init.sh: /bin/bash^M: bad interpreter: No such file or directory
## vim 或者 vi 的命令模式下,输入命令 set fileformat=unix 即可解决上述问题
echo -e "\e[1;44m【在 /opt 目录和 /var 目录下创建 yjx 目录,在 /usr/local 目录下创建 scripts 目录】\e[0m"
sleep 2
mkdir -p /opt/yjx /var/yjx /usr/local/scripts
echo -e "\e[1;44m【关闭并禁用 firewalld 防火墙】\e[0m"
sleep 2
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
echo -e "\e[1;44m【关闭 SELinux】\e[0m"
sleep 2
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
echo -e "\e[1;44m【修改 yum 源为阿里源】\e[0m"
sleep 2
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
echo -e "\e[1;44m【安装 wget】\e[0m"
sleep 2
yum -y install wget
echo -e "\e[1;44m【安装常用依赖】\e[0m"
sleep 2
yum -y install man man-pages telnet perl net-tools openssl-devel ntp lrzsz zip unzip tree vim rsync
echo -e "\e[1;44m【修改时区并与中国 NTP 时间服务器 cn.ntp.org.cn 进行时间同步】\e[0m"
sleep 2
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
yum info ntp && yum -y install ntp && ntpdate cn.ntp.org.cn
echo -e "\e[1;44m【修改 hosts 文件,添加集群环境机器 IP 与域名映射】\e[0m"
sleep 2
echo "192.168.126.100 basenode" >> /etc/hosts
echo "192.168.126.101 node01" >> /etc/hosts
echo "192.168.126.102 node02" >> /etc/hosts
echo "192.168.88.103 node03" >> /etc/hosts
echo -e "\e[1;44m【安装 JDK 并设置环境变量】\e[0m"
sleep 2
rpm -ivh jdk-8u351-linux-x64.rpm
echo 'export JAVA_HOME=/usr/java/jdk1.8.0_351-amd64' >> /etc/profile
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
source /etc/profile
echo -e "\e[1;44m【安装 Tomcat】\e[0m"
sleep 2
tar -zxf apache-tomcat-9.0.72.tar.gz -C /opt/yjx/
echo -e "\e[1;44m【安装 MySQL】\e[0m"
sleep 2
rpm -e --nodeps `rpm -qa | grep mariadb`
tar -xvf mysql-8.0.18-1.el7.x86_64.rpm-bundle.tar
rpm -ivh mysql-community-common-8.0.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-8.0.18-1.el7.x86_64.rpm
systemctl start mysqld
systemctl enable mysqld
temppasswd=`grep "A temporary password" /var/log/mysqld.log | awk '{print $NF}'`
mysql -uroot -p$temppasswd --connect-expired-password << EOF
SET GLOBAL validate_password.policy = low;
SET GLOBAL validate_password.length = 6;
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
USE mysql;
UPDATE user SET host = '%' WHERE user = 'root';
COMMIT;
FLUSH PRIVILEGES;
EXIT
EOF
systemctl restart mysqld
echo -e "\e[1;44m【添加时间同步服务至开机启动】\e[0m"
sleep 2
touch /usr/local/scripts/auto_ntpdate.sh
echo '#!/bin/bash' >> /usr/local/scripts/auto_ntpdate.sh
echo 'yum info ntp && yum -y install ntp && ntpdate cn.ntp.org.cn' >> /usr/local/scripts/auto_ntpdate.sh
chmod u+x /usr/local/scripts/auto_ntpdate.sh
echo '/usr/local/scripts/auto_ntpdate.sh' >> /etc/rc.d/rc.local
chmod u+x /etc/rc.d/rc.local
echo -e "\e[1;44m【删除 JDK Tomcat MySQL 安装包和虚拟机初始化脚本】\e[0m"
sleep 2
rm jdk* -rf
rm apache-tomcat* -rf
rm mysql* -rf
rm init.sh -rf
echo -e "\e[1;41m【即将关闭计算机】\e[0m"
sleep 2
shutdown -h now
服务器相互免秘钥
服务器相互免秘钥
生成密钥
分别在三台机器上运行以下命令生成密钥对:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
运行以上命令后会在~/.ssh/
目录下生成一对密钥对。
[root@node01 ~]# ls ~/.ssh/
id_rsa id_rsa.pub known_hosts
取消主机名与host校验
分别在三台机器上修改/etc/ssh/ssh_config
文件的配置,在Host *
节点下配置以下信息:
# 严格的密钥检查 no
StrictHostKeyChecking no
# 如果不希望生成已知主机列表文件,可以将已知主机列表文件信息写入黑洞(不会再生成 known_hosts 文件)
#UserKnownHostsFile /dev/null
这样以后再也不会弹出将该主机添加到当前设备的已知主机列表中的提示信息了。
如果将已知主机列表文件信息写入了黑洞,那么远程访问时会弹出以下警告:
Warning: Permanently added 'node02,192.168.88.102' (ECDSA) to the list of known hosts.
这个警告不影响任何操作,只是看着比较碍眼。解决办法:在文件夹~/.ssh/下创建config 文件,命令如下:
vim ~/.ssh/config
在新建的文件中写入如下内容:LogLevel=quiet
。
拷贝公钥
接下来把自己的公钥互相传递给其他主机,这个公钥文件必须放在对方主机的~/.ssh/authorized_keys
文件中。可以使用命令将公钥文件自动传递过去,分别在三台机器运行以下命令:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node01
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node02
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node03
前面已经通过脚本修改了hosts文件,添加了集群环境机器IP与域名映射,所以这里可以直接使用主机名。
传输文件测试是否已免密或者使用ssh协议登录对方主机进行测试:
[root@localhost ~]# scp anaconda-ks.cfg root@node02:~
Warning: Permanently added 'node02,192.168.88.102' (ECDSA) to the list of known hosts.
anaconda-ks.cfg
[root@localhost ~]# ssh root@node02
Warning: Permanently added 'node02,192.168.88.102' (ECDSA) to the list of known hosts.
Last login: Sat Jun 4 21:07:25 2022 from node01
测试没问题后,shutdown -h now
关机,拍摄快照方便后期回退。
集群启动脚本
在/usr/local/bin
目录下创建对应服务的脚本:
[root@node01 ~]# vim /usr/local/bin/tomcat
tomcat
脚本内容如下:
#!/bin/bash
user=$(whoami)
case $1 in
"start")
for i in node01 node02 node03
do
echo -e "\e[1;34m==================== $i Tomcat 启动====================\e[0m"
ssh $user@$i "/opt/yjx/apache-tomcat-9.0.72/bin/startup.sh"
done
;;
"shutdown")
for i in node01 node02 node03
do
echo -e "\e[1;34m==================== $i Tomcat 停止 ====================\e[0m"
ssh $user@$i "/opt/yjx/apache-tomcat-9.0.72/bin/shutdown.sh"
done
;;
esac
修改脚本权限为用户读写执行 rwx
,组读执行r-x
,其他用户无权限r--
:
[root@node01 ~]# chmod 754 /usr/local/bin/tomcat
JPS脚本
查看所有服务器JPS进程的脚本
[root@node01 ~]# vim /usr/local/bin/jpsall
jpsall
脚本内容如下:
#!/bin/bash
# 获取当前用户名称
user=$(whoami)
# $#:传递给脚本或函数的参数个数
params_count=$#
# 如果没有参数,直接运行 "jps"
if [ $params_count -lt 1 ]
then
for i in node01 node02 node03
do
echo -e "\e[1;34m==================== $i ====================\e[0m"
ssh $user@$i jps
done
exit
fi
# 如果有参数,运行 "jps -参数"
for i in node01 node02 node03
do
echo -e "\e[1;34m==================== $i ====================\e[0m"
params=""
for p in $@
do
params+="$p "
done
ssh $user@$i "jps $params"
done
修改脚本权限为用户读写执行 rwx
,组读执行r-x
,其他用户读执行r-x
:
[root@node01 ~]# chmod 755 /usr/local/bin/jpsall
文件分发脚本
在/usr/local/bin
目录下创建yjxrsync
脚本,如下:
[root@node01 ~]# vim /usr/local/bin/yjxrsync
yjxrsync
脚本内容如下:
#!/bin/bash
# 获取输入参数的个数
param_count=$#
# 如果没有参数,直接退出
if [ $param_count -lt 1 ]
then
echo -e "\e[1;31myjxrsync: You must pass in the file name parameter.\e[0m"
exit
fi
# 获取当前用户名称
user=$(whoami)
# 如果有参数,遍历参数(文件或目录名称)
for p in $@
do
echo -e "\e[1;34m==================== $p 开始同步 ====================\e[0m"
# basename:显示文件路径名的基本文件名,例如 /opt/bd 会显示 bd;/opt/bd/test.txt 会显示 test.txt
file_name=$(basename $p)
echo file_name=$file_name
# 获取文件的上级目录的绝对路径
# -P:如果切换的目标目录是一个符号链接,则直接切换到符号链接指向的目标目录
parent_dir=`cd -P $(dirname $p); pwd`
echo parent_dir=$parent_dir
# 循环处理文件
for i in node01 node02 node03
do
echo -e "\e[1;34m==================== $i ====================\e[0m"
rsync -av --delete $parent_dir/$file_name $user@$i:$parent_dir
done
done
修改脚本权限为用户读写执行rwx
,组读执行r-x
,其他用户无权限---
:
[root@node01 ~]# chmod 750 /usr/local/bin/yjxrsync