Bootstrap

【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" ]; 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

截图:
在这里插入图片描述

;