一、项目拓扑
二、要求
环境准备:
准备两个虚拟机,按照环境配置好对应的 IP 地址和对应的主机名和 SSH 密钥登录在 workstation.exam.com 节点实现如下需求:
1、编写 Shell 脚本,要求代码逻辑符合需求,前后代码风格统一,执行时显示信息简明扼要,符合代码意图。
2、该脚本应当实现 node.exam.com 节点上的需求,同时包含对应服务的测试结果
在 node.exam.com 节点上应当完成的需求,并应当对每个步骤的结果进行判断:
1、实现本地软件仓库配置,仓库路径为 /cdrom
2、实现安装 httpd 和 bind 软件包,用来提供 Web 和 DNS 服务
3、实现 Web 服务器 www.exam.com 和 www.test.com
4、要求访问 www.exam.com 时,页面内容为 Welcome to exam
5、要求访问 www.test.com 时,页面内容为 Welcome to test
6、该 Web 服务器监听地址为 172.16.10.10,端口为 80
7、要求实现 DNS 服务,监听地址为 172.16.10.11,要求提供该环境中所有的主机名解析。
8、要求实现防火墙放行 Web 和 DNS 服务,永久并立即生效
9、要求实现 Web 和 DNS 服务开机自动启动
三、shell编程
1、首先node.exam.com这个节点需要两个ip地址,可以通过nmcli命令添加IP地址。
2、由于每个人的虚拟vm分配的IP地址不一定是172.16.10/24这个网段,所以ip地址不必跟实验一致,只要能实现需求就行。
实验环境:欧拉系统
完整的代码:
#!/bin/bash
# 检查是否为 root 用户
if [ "$(id -u)" -ne "0" ]; then
echo "此脚本必须以 root 身份运行"
exit 1
else
echo "----正在以root身份运行----"
fi
# 配置本地软件仓库
local_repo(){
ls /cdrom &> /dev/null
if [ $? -ne 0 ];then
`mkdir -p /cdrom`
`mount /dev/cdrom /cdrom &>/dev/null`
else
mount /dev/cdrom /cdrom &>/dev/null
fi
cat <<EOF > /etc/yum.repos.d/local.repo
[local]
name=Local Repository
baseurl=file:///cdrom
enabled=1
gpgcheck=0
EOF
echo "----配置本地软件仓库已经完成-----"
}
#安装 httpd 和 bind 软件包
install_soft(){
#查看这两个软件包是否安装
httpd_status=$(rpm -qa httpd | wc -l)
bind_status=$(rpm -qa bind | wc -l)
if [ $httpd_status -eq 0 ];then
yum install httpd -y &>/dev/null
systemctl enable httpd --now
fi
if [ $bind_status -eq 0 ];then
yum install bind -y &>/dev/null
systemctl enable named.service --now
fi
echo "----https和bind软件包安装完成并实现开机自启----"
}
#实现 Web 服务器 www.exam.com 和 www.test.com
web_server2(){
#创建页面的存放位置路径---www.exam.com
ls /testweb1 &>/dev/null
if [ $? -ne 0 ];then
mkdir /testweb1
echo "Welcome to exam" > /testweb1/index.html
fi
#www.test.com
ls /testweb2 &>/dev/null
if [ $? -ne 0 ];then
mkdir /testweb2
echo "Welcome to test" > /testweb2/index.html
fi
#取出本机的ip地址,用于监听本机
ip=$(ip add | grep -E "inet.*global" | head -1 | awk '{print $2}'|cut -d/ -f1)
cat <<EOF > /etc/httpd/conf.d/vhost.conf
<directory /testweb1>
allowoverride none
require all granted
</directory>
<virtualhost $ip:80>
documentroot /testweb1
servername www.exam.com
</virtualhost>
<directory /testweb2>
allowoverride none
require all granted
</directory>
<virtualhost $ip:80>
documentroot /testweb2
servername www.test.com
</virtualhost>
EOF
#重启服务器
systemctl restart httpd.service
echo "----web服务器配置完成,通过www.exam.com/www.test.com可在本机访问----"
}
#实现防火墙放行 Web 和 DNS 服务,永久并立即生效
firewall_pass(){
firewall_status=$(systemctl is-active firewalld.service)
if [ "$firewall_status" = "active" ];then
firewall-cmd --add-service=httpd --permanent &>/dev/null
firewall-cmd --reload &>/dev/null
firewall-cmd --add-port=53/udp --permanent &>/dev/null
firewall-cmd --reload &>/dev/null
else
systemctl enable firewalld.service --now &>/dev/null
firewall-cmd --add-service=httpd --permanent &>/dev/null
firewall-cmd --reload &>/dev/null
firewall-cmd --add-port=53/udp --permanent &>/dev/null
firewall-cmd --reload &>/dev/null
fi
echo "----防火墙放行 Web 和 DNS 服务已经完成----"
}
#实现 DNS 服务,提供该环境中所有的主机名解析
dns_service(){
#做一个dns的主配置文件的备份
ls /etc/named.conf.bak &>/dev/null
if [ $? -ne 0 ];then
cp /etc/named.conf /etc/named.conf.bak &>/dev/null
fi
#修改主配置文件,先查询该配置文件是否做过修改,没修改在该
num=$(grep '#allow-query' /etc/named.conf|wc -l)
#获取dns的ip地址
ip_dns=$(hostname -I | awk '{print $2}')
#获取web服务器的ip地址
ip_web=$(hostname -I | awk '{print $1}')
if [ $num -eq 0 ];then
sed -i 's/allow-query/#allow-query/' /etc/named.conf
sed -i 's/dnssec-validation/#dnssec-validation/' /etc/named.conf
sed -i 's/listen-on port 53 { 127.0.0.1; };/listen-on port 53 { any; };/' /etc/named.conf
cat <<EOF >> /etc/named.conf
zone "test.com" IN{
type master;
file "named.test.com";
};
zone "exam.com" IN{
type master;
file "named.exam.com";
};
EOF
#编写区域配置文件
cat <<'EOF' > /var/named/named.test.com
$TTL 1D
@ IN SOA @ admin.test.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns1
EOF
cat <<EOF>> /var/named/named.test.com
ns1 A $ip_dns
www A $ip_web
EOF
cat <<'EOF' > /var/named/named.exam.com
$TTL 1D
@ IN SOA @ admin.exam.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
EOF
cat <<EOF >> /var/named/named.exam.com
NS ns1
ns1 A $ip_dns
www A $ip_web
EOF
fi
#重启dns服务
systemctl restart named
echo "----DNS服务配置完成,重启完成----"
echo "****dns_ip:$ip_dns;web_ip:$ip_web****"
}
#修改本地/etc/resolv.conf
change_file(){
ip_dns=$(hostname -I | awk '{print $2}')
echo "nameserver $ip_dns" > /etc/resolv.conf
echo "---/etc/resolv.conf的dns地址修改完成---"
echo "通过curl www.exam.com 或者 curl www.test.com测试"
}
local_repo
install_soft
web_server2
dns_service
firewall_pass
change_file
截图: