Shell实现服务自动部署

一、环境

注意:

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 ];then
	echo "公钥互信存在,开始进行验证,如果成功请输入exit退出,继续运行脚本!"
	ssh root@$node2_ip	
else
        echo "还未进行公钥互信,正在进行公钥互信..."
        ssh-keygen
        ssh-copy-id root@$node2_ip
        echo "公钥互信完成"
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 ];then
	echo "已经挂载..."
else
	echo "还没有挂载,正在开始挂载..."
	mount /dev/sr0 /mnt/
	echo "挂载成功"
fi
}

create_web() {
# 安装httpd服务
rpm -q httpd
if [ $? -eq 0 ];then
	echo "httpd 服务已经安装..."
else
	echo "httpd 服务没有安装..."
	echo "开始安装 httpd..."
	yum install httpd -y &> /dev/null
	echo "安装完成..."	
fi

cat >> /etc/hosts <<EOF
$node1 www.exam.com
EOF

echo "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 ];then
	echo "成功访问!"
else
	echo "Web 服务未完成"
fi
}

create_ntp() {
#NTP服务
rpm -q chrony
if [ $? -eq 0 ];then
	echo "chrony 已安装"
else
	echo "开始安装 chrony..."
	yum install chrony -y &> /dev/null
	echo "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 ];then
	echo "mysql 已安装"
else
	echo "开始安装 mysql..."
	yum install mysql -y &> /dev/null
	yum install mysql-server -y &>/dev/null
	echo "mysql 安装完成"
	
	systemctl start mysqld
	echo "修改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 已安装"
else
	echo "开始安装bind..."
	dnf insatll bind -y &> /dev/null
fi
cat > /etc/named.conf <<EOF

options {
        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";
};

EOF

touch /var/named/named.exam
cat > /var/named/named.exam <<"EOF"
$TTL 1d
@	IN	SOA	@	admin.exam.com. (2024071901
							1
							1
							1
							1)
EOF
cat >> /var/named/named.exam <<EOF
	IN	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
EOF

echo "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";
};
EOF

cat > /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
EOF

touch /var/named/fanxiang
cat > /var/named/fanxiang <<"EOF"
$TTL 1d
@	IN	SOA	@	admin.exam.com.(2024071901
							1
							1
							1
							1)
	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 ];then
	echo "nfs-utils 已安装"
else
	echo "nfs-utils 未安装,正开始安装..."
	dnf install nfs-utils -y &> /dev/null
	systemctl start nfs-server
	systemctl enable --now nfs-server
	echo "安装完成,服务开机自启!"

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-server

ssh 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 ];then
	echo "autofs已安装"
else
	echo "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 httpd

ssh root@$node2_ip ls -l / | grep "Discuz_X3.5_SC_UTF8_20230520.zip"
if [ $? -eq 0 ];then
	echo "Discuz_X3.5_SC_UTF8_20230520.zip存在与/中,正在开始解压..."
	check_file=$(ssh root@$node2_ip ls /var/www/html/ | wc -l)
	if [ $check_file -gt 0 ];then
		echo "Discuz_X3.5_SC_UTF8_20230520.zip已解压过了!"
	else
		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/null
	fi
else
	echo "/中没有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/null

ssh 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 1

mode1=$(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 ];then
	echo "/var/www/html/upload/data权限已修改为777"
else
	echo "/var/www/html/upload/data权限未修改"
	echo "正在修改..."
	ssh root@$node2_ip chmod 777 /var/www/html/upload/data/ -R
fi

if [ $mode2 -eq 777 ];then
	echo "/var/www/html/upload/config/权限已修改为777"
else
	echo "/var/www/html/upload/config/权限未修改"
	echo "正在修改..."
	ssh root@$node2_ip chmod 777 /var/www/html/upload/config/ -R
fi

if [ $mode3 -eq 777 ];then
	echo "/var/www/html/upload/uc_server/权限已修改为777"
else
	echo "/var/www/html/upload/uc_server/权限未修改"
	echo "正在修改..."
	ssh root@$node2_ip chmod 777 /var/www/html/upload/uc_server/ -R
fi

if [ $mode4 -eq 777 ];then
	echo "/var/www/html/upload/uc_client/权限已修改为777"
else
	echo "/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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

new不出对象来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值