一、环境
注意:
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