目录
- 一、项目拓扑
- 二、要求
- 三、shell编程
一、项目拓扑
二、要求
环境准备:
准备两个虚拟机,按照环境配置好对应的 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" ]; thenecho "此脚本必须以 root 身份运行"exit 1
elseecho "----正在以root身份运行----"
fi
# 配置本地软件仓库
local_repo(){ls /cdrom &> /dev/nullif [ $? -ne 0 ];then`mkdir -p /cdrom``mount /dev/cdrom /cdrom &>/dev/null`elsemount /dev/cdrom /cdrom &>/dev/nullficat <<EOF > /etc/yum.repos.d/local.repo
[local]
name=Local Repository
baseurl=file:///cdrom
enabled=1
gpgcheck=0
EOFecho "----配置本地软件仓库已经完成-----"}
#安装 httpd 和 bind 软件包
install_soft(){#查看这两个软件包是否安装httpd_status=$(rpm -qa httpd | wc -l)bind_status=$(rpm -qa bind | wc -l)if [ $httpd_status -eq 0 ];thenyum install httpd -y &>/dev/nullsystemctl enable httpd --nowfiif [ $bind_status -eq 0 ];thenyum install bind -y &>/dev/nullsystemctl enable named.service --nowfiecho "----https和bind软件包安装完成并实现开机自启----"
}
#实现 Web 服务器 www.exam.com 和 www.test.com
web_server2(){#创建页面的存放位置路径---www.exam.comls /testweb1 &>/dev/nullif [ $? -ne 0 ];thenmkdir /testweb1echo "Welcome to exam" > /testweb1/index.htmlfi#www.test.comls /testweb2 &>/dev/nullif [ $? -ne 0 ];thenmkdir /testweb2echo "Welcome to test" > /testweb2/index.htmlfi#取出本机的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 nonerequire all granted
</directory>
<virtualhost $ip:80>documentroot /testweb1servername www.exam.com
</virtualhost>
<directory /testweb2>allowoverride nonerequire all granted
</directory>
<virtualhost $ip:80>documentroot /testweb2servername www.test.com
</virtualhost>
EOF#重启服务器systemctl restart httpd.serviceecho "----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/nullfirewall-cmd --reload &>/dev/nullfirewall-cmd --add-port=53/udp --permanent &>/dev/nullfirewall-cmd --reload &>/dev/nullelsesystemctl enable firewalld.service --now &>/dev/nullfirewall-cmd --add-service=httpd --permanent &>/dev/nullfirewall-cmd --reload &>/dev/nullfirewall-cmd --add-port=53/udp --permanent &>/dev/nullfirewall-cmd --reload &>/dev/nullfiecho "----防火墙放行 Web 和 DNS 服务已经完成----"
}
#实现 DNS 服务,提供该环境中所有的主机名解析
dns_service(){#做一个dns的主配置文件的备份ls /etc/named.conf.bak &>/dev/nullif [ $? -ne 0 ];thencp /etc/named.conf /etc/named.conf.bak &>/dev/nullfi#修改主配置文件,先查询该配置文件是否做过修改,没修改在该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 ];thensed -i 's/allow-query/#allow-query/' /etc/named.confsed -i 's/dnssec-validation/#dnssec-validation/' /etc/named.confsed -i 's/listen-on port 53 { 127.0.0.1; };/listen-on port 53 { any; };/' /etc/named.confcat <<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 ; serial1D ; refresh1H ; retry1W ; expire3H ) ; minimumNS ns1
EOFcat <<EOF>> /var/named/named.test.com
ns1 A $ip_dns
www A $ip_web
EOFcat <<'EOF' > /var/named/named.exam.com
$TTL 1D
@ IN SOA @ admin.exam.com. (0 ; serial1D ; refresh1H ; retry1W ; expire3H ) ; minimum
EOFcat <<EOF >> /var/named/named.exam.comNS ns1
ns1 A $ip_dns
www A $ip_web
EOFfi#重启dns服务systemctl restart namedecho "----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.confecho "---/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
截图: