当前位置: 首页> 健康> 科研 > Shell实现服务自动部署

Shell实现服务自动部署

时间:2025/9/12 15:16:45来源:https://blog.csdn.net/weixin_63657273/article/details/140664752 浏览次数:0次

一、环境

注意:

nfs.example.com应该为nfs.exam.com

172.25.250.101-172.25.250.105 共 5 个 IP 地址由servera.exam.com服务器进行提供。

172.25.250.106 由 serverb.exam.com 服务器进行提供。

二、需求

项目需求:

1. 172.25.250.101 主机上的 Web 服务要求提供 www.exam.com Web站点,该站点在任何路由可达 的主机上被访问,页面内容显示为 "Hello,Welcome to www.exam.com !",并提供 content.exam.com/yum/AppStream和content.exam.com/yum/BaseOS URL 作为网络仓库供所 有主机使用。

2. 172.25.250.102 主机提供基于Chronyd 的 NTP 服务将本主机作为时间服务器,对外提供 NTP 服 务,并设置本服务器为 3 层。

3. 172.25.250.103 主机提供的MySQL 数据库服务,要求使用需求1中提供的仓库进行安装,并将数据 库密码设定为 redhat。创建名称为 bbs 的数据库提供给论坛服务使用。

4. 172.25.250.104 主机提供 NFS 服务,该服务将导出本地的 /bbs 目录作为论坛数据目录,该导出指 定只能论坛所在主机使用,并且开机自动挂载。

5. 172.25.250.105 主机提供 DNS 服务,该服务需要提供对项目中所有主机名的正向和反向解析,并 要求所有服务器的 DNS 配置为该 DNS 服务器。

6. 172.25.250.106 主机提供基于 Discuz 的论坛服务,该论坛服务使用 172.25.250.103 主机提供的数 据库 bbs,使用 172.25.250.104 主机提供的 NFS 作为论坛数据目录,并开机挂载。并使用 172.25.250.101 主机提供的网络仓库,172.25.250.102 主机提供的 NTP 服务,172.25.250.105 主 机提供的 DNS 服务。

7. 所有服务器的防火墙服务和 SELinux 服务必须开启。

8. 所有服务器提供的网络服务必须在系统重启后仍然可以正常提供服务。

9. 根据所有服务的相关代码,编写一键部署shell脚本,最基础的功能为 通过执行该脚本实现所有上面 所有需求,要求脚本必须在 servera.exam.com 主机上运行,并支持多次运行

三、代码

#!/bin/bash
check_ip() {
node1=$(hostname -I | awk '{print $1}')
node1_ipwd=$(hostname -I | awk '{print $1}' |  cut -d '.' -f 1-3)
node1_a1=$(echo $node1_ipwd | awk -F. '{print $1}' )
node1_a2=$(echo $node1_ipwd | awk -F. '{print $2}' )
node1_a3=$(echo $node1_ipwd | awk -F. '{print $3}' )
echo "请输入另一台主机的IP:"
read node2_ip
}
create_keygen() {
#公钥互信
sum=$(ls -l /root/.ssh | grep "id_rsa"|wc -l)
if [ $sum -eq 2 ];thenecho "公钥互信存在,开始进行验证,如果成功请输入exit退出,继续运行脚本!"ssh root@$node2_ip	
elseecho "还未进行公钥互信,正在进行公钥互信..."ssh-keygenssh-copy-id root@$node2_ipecho "公钥互信完成"
fi
}
sethost_addip() {
hostnamectl set-hostname servera.exam.com
ssh root@$node2_ip hostnamectl set-hostname serverb.exam.com
# 添加IP
nmcli connection modify ens160 +ipv4.addresses $node1_ipwd.102/24
nmcli connection modify ens160 +ipv4.addresses $node1_ipwd.103/24
nmcli connection modify ens160 +ipv4.addresses $node1_ipwd.104/24
nmcli connection modify ens160 +ipv4.addresses $node1_ipwd.105/24
nmcli connection up ens160
}
mount_repo() {
rm -f /etc/yum.repos.d/*.repo
touch /etc/yum.repos.d/yum.repo
cat > /etc/yum.repos.d/yum.repo <<EOF
[baseos]
name=baseos
baseurl=/mnt/BaseOS
gpgcheck=0
[appstream]
name=appstream
baseurl=/mnt/AppStream
gpgcheck=0
EOF
ismount=$(ls -l /mnt/ | head -1 | awk '{print $2}')
if [ $ismount -gt 0 ];thenecho "已经挂载..."
elseecho "还没有挂载,正在开始挂载..."mount /dev/sr0 /mnt/echo "挂载成功"
fi
}create_web() {
# 安装httpd服务
rpm -q httpd
if [ $? -eq 0 ];thenecho "httpd 服务已经安装..."
elseecho "httpd 服务没有安装..."echo "开始安装 httpd..."yum install httpd -y &> /dev/nullecho "安装完成..."	
ficat >> /etc/hosts <<EOF
$node1 www.exam.com
EOFecho "Hello,Welcome to www.exam.com!" > /var/www/html/index.html
systemctl start firewalld
setenforce 1
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=dns
echo "重启 httpd 服务"
systemctl restart httpd
curl www.exam.com
if [ $? -eq 0 ];thenecho "成功访问!"
elseecho "Web 服务未完成"
fi
}create_ntp() {
#NTP服务
rpm -q chrony
if [ $? -eq 0 ];thenecho "chrony 已安装"
elseecho "开始安装 chrony..."yum install chrony -y &> /dev/nullecho "chrony 安装完成"
fi
echo "开始配置时间服务..."
#sed -i '/pool 2.rhel.pool.ntp.org iburst/s/^/#/' /etc/chrony.conf
cat >> /etc/chrony.conf <<EOF
local stratum 3
allow $node1_ipwd.0/24
EOF
firewall-cmd --permanent --add-service=ntp
firewall-cmd --reload
systemctl enable chronyd
systemctl restart chronyd
ssh root@$node2_ip cat >> /etc/chrony.conf <<EOF
server $node2_ip iburst
EOF
ssh root@$node2_ip firewall-cmd --permanent --add-service=ntp
ssh root@$node2_ip firewall-cmd --reload
ssh root@$node2_ip systemctl enable chronyd
ssh root@$node2_ip systemctl restart chronyd
echo "时间服务配置完成"
}create_mysql() {
rpm -q mysql
if [ $? -eq 0 ];thenecho "mysql 已安装"
elseecho "开始安装 mysql..."yum install mysql -y &> /dev/nullyum install mysql-server -y &>/dev/nullecho "mysql 安装完成"systemctl start mysqldecho "修改mysql密码为redhat"mysqladmin -uroot password "redhat"echo "创建数据库bbs"mysqladmin -u root -predhat create bbs
fi
touch /script.sql
cat > /script.sql <<EOF
use mysql;
update user set host = '%' where user = 'root';
flush privileges;
EOF
echo "开始运行sql脚本..."
mysql -uroot -predhat < /script.sql
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
}create_dns() {
#配置dns正向解析
rpm -q bind
if [ $? -eq 0 ];then echo "bind 已安装"
elseecho "开始安装bind..."dnf insatll bind -y &> /dev/null
fi
cat > /etc/named.conf <<EOFoptions {listen-on port 53 { $node1_ipwd.105; };directory       "/var/named";
};
zone "." IN {type hint;file "named.ca";
};
zone "exam.com" IN {type master;file "named.exam";
};EOFtouch /var/named/named.exam
cat > /var/named/named.exam <<"EOF"
$TTL 1d
@	IN	SOA	@	admin.exam.com. (20240719011111)
EOF
cat >> /var/named/named.exam <<EOFIN	NS	ns.exam.com.
ns	IN	A	$node1
www	IN	A	$node1
content	IN	A	$node1
ntp	IN	A	$node1_ipwd.102
mysql	IN	A	$node1_ipwd.103
nfs	IN	A	$node1_ipwd.104
dns	IN	A	$node1_ipwd.105
bbs	IN	A	$node1_ipwd.106
ftp	IN	CNAME	www
EOFecho "DNS 正向解析配置完成,正在重启服务..."
systemctl restart httpd
systemctl restart named# dns反向解析
cat >> /etc/named.conf <<EOF
zone "$node1_a3.$node1_a2.$node1_a1.in-addr.arpa" IN{type master;file "fanxiang";
};
EOFcat > /etc/resolv.conf <<EOF
search localdomain
nameserver $node1_ipwd.105
EOF
ssh root@$node2_ip cat > /etc/resolv.conf <<EOF
search localdomain
nameserver $node1_ipwd.105
EOFtouch /var/named/fanxiang
cat > /var/named/fanxiang <<"EOF"
$TTL 1d
@	IN	SOA	@	admin.exam.com.(20240719011111)IN	NS	ns.exam.com.
101	IN	PTR	ns.exam.com.
101	IN	PTR	content.exam.com.
102	IN	PTR	ntp.exam.com.
103	IN	PTR	mysql.exam.com.
104	IN	PTR	nfs.exam.com
105	IN	PTR	dns.exam.com
106	IN	PTR	bbs.exam.com
EOF
echo "DNS 反向解析配置完成,正在重启服务..."
systemctl restart httpd
systemctl restart named
echo "重启服务完成"
}create_wlrepo() {
# 网络仓库
sed -i 's#/mnt/BaseOS#http://content.exam.com/yum/BaseOS#g' /etc/yum.repos.d/yum.repo
sed -i 's#/mnt/AppStream#http://content.exam.com/yum/AppStream#g' /etc/yum.repos.d/yum.repo
mkdir /var/www/html/yum/ -p
umount /mnt
mount /dev/sr0 /var/www/html/yum/touch /yum.repo
cat > /yum.repo <<EOF
[baseos]
name=baseos
baseurl=http://$node1/yum/BaseOS
gpgcheck=0
[appstream]
name=appstream
baseurl=http://$node1/yum/AppStream
gpgcheck=0
EOF
ssh root@$node2_ip rm -f /etc/yum.repos.d/*.repo
scp /yum.repo root@$node2_ip:/etc/yum.repos.d/
}create_nfs() {
# NFS
rpm -q nfs-utils
if [ $? -eq 0 ];thenecho "nfs-utils 已安装"
elseecho "nfs-utils 未安装,正开始安装..."dnf install nfs-utils -y &> /dev/nullsystemctl start nfs-serversystemctl enable --now nfs-serverecho "安装完成,服务开机自启!"fi
echo "导出本地/bbs目录"
mkdir /bbs
chmod 777 /bbs/
cat > /etc/exports <<EOF
/bbs $node2_ip(rw)
EOF
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=mountd
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --reload
firewall-cmd --list-service
systemctl restart nfs-serverssh root@$node2_ip yum install showmount -y &> /dev/null
ssh root@$node2_ip mkdir /bbs/
ssh root@$node2_ip mount $node1:/bbs /var/www/html/
ssh root@$node2_ip cat >> /etc/fstab <<EOF
$node1:/bbs /var/www/html nfs defaults 0 0
EOF
ssh root@$node2_ip systemctl restart nfs-server
rpm -q autofs
if [ $? -eq 0 ];thenecho "autofs已安装"
elseecho "autofs未安装,开始安装autofs..."dnf install autofs -y &> /dev/null
fi
touch /etc/auto.nfs
ssh root@$node2_ip cat > /etc/auto.nfs <<EOF
/var/www/html $node1_ipwd.101:/bbs
EOF
ssh root@$node2_ip cat >> /etc/auto.master <<EOF
/misc /etc/auto.misc
/nfs /etc/auto.nfs
EOF
echo "aotofs配置完成,重启服务..."
systemctl restart autofs
}create_luntan() {
#论坛搭建
ssh root@$node2_ip yum install httpd php* -y &> /dev/null
ssh root@$node2_ip systemctl restart httpdssh root@$node2_ip ls -l / | grep "Discuz_X3.5_SC_UTF8_20230520.zip"
if [ $? -eq 0 ];thenecho "Discuz_X3.5_SC_UTF8_20230520.zip存在与/中,正在开始解压..."check_file=$(ssh root@$node2_ip ls /var/www/html/ | wc -l)if [ $check_file -gt 0 ];thenecho "Discuz_X3.5_SC_UTF8_20230520.zip已解压过了!"elsessh root@$node2_ip yum install unzip -y &> /dev/nullssh root@$node2_ip unzip /Discuz_X3.5_SC_UTF8_20230520.zip -d /var/www/html/ &> /dev/nullfi
elseecho "/中没有Discuz_X3.5_SC_UTF8_20230520.zip,请确认再尝试..."
fi
#ssh root@$node2_ip yum install unzip -y &> /dev/null
#ssh root@$node2_ip unzip /Discuz_X3.5_SC_UTF8_20230520.zip -d /var/www/html/ &> /dev/nullssh root@$node2_ip firewall-cmd --permanent --add-service=http
ssh root@$node2_ip firewall-cmd --reload
ssh root@$node2_ip setsebool -P httpd_use_nfs 1mode1=$(ssh root@$node2_ip stat -c "%a" "/var/www/html/upload/data/")
mode2=$(ssh root@$node2_ip stat -c "%a" "/var/www/html/upload/config/")
mode3=$(ssh root@$node2_ip stat -c "%a" "/var/www/html/upload/uc_server/")
mode4=$(ssh root@$node2_ip stat -c "%a" "/var/www/html/upload/uc_client/")
if [ $mode1 -eq 777 ];thenecho "/var/www/html/upload/data权限已修改为777"
elseecho "/var/www/html/upload/data权限未修改"echo "正在修改..."ssh root@$node2_ip chmod 777 /var/www/html/upload/data/ -R
fiif [ $mode2 -eq 777 ];thenecho "/var/www/html/upload/config/权限已修改为777"
elseecho "/var/www/html/upload/config/权限未修改"echo "正在修改..."ssh root@$node2_ip chmod 777 /var/www/html/upload/config/ -R
fiif [ $mode3 -eq 777 ];thenecho "/var/www/html/upload/uc_server/权限已修改为777"
elseecho "/var/www/html/upload/uc_server/权限未修改"echo "正在修改..."ssh root@$node2_ip chmod 777 /var/www/html/upload/uc_server/ -R
fiif [ $mode4 -eq 777 ];thenecho "/var/www/html/upload/uc_client/权限已修改为777"
elseecho "/var/www/html/upload/uc_server/权限未修改"echo "正在修改..."ssh root@$node2_ip chmod 777 /var/www/html/upload/uc_client/ -R
fi
#ssh root@$node2_ip chmod 777 /var/www/html/upload/data/ /var/www/html/upload/config/ /var/www/html/upload/uc_server/ /var/www/html/upload/uc_client/ -R
ssh root@$node2_ip setsebool -P httpd_can_network_connect_db 1
ssh root@$node2_ip yum install mysql mysql-server -y &> /dev/null
ssh root@$node2_ip firewall-cmd --permanent --add-port=3306/tcp
ssh root@$node2_ip firewall-cmd --reload
echo "配置完成,请前往浏览器输入$node2_ip/upload完成论坛搭建!"
}main() {
check_ip
create_keygen
sethost_addip
mount_repo
create_web
create_ntp
create_mysql
create_dns
create_wlrepo
create_nfs
create_luntan
}main
关键字:Shell实现服务自动部署

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: