通过shell脚本分析部署nginx网络服务
1.接收用户部署的服务名称
2.判断服务是否安装
已安装;自定义网站配置路径为/www;并创建共享目录和网页文件;重启服务
没有安装;安装对应的软件包
3.测试
判断服务是否成功运行;
已运行,访问网站
未运行,提示服务未启动,并显示自定义的配置文件内容
4.以上配置没有问题,请邮件告知我,并将脚本代码(代码文件)邮件发送我
我的邮箱账号:xxxxxx@163.com
一、整体流程分析
- 接收用户输入:脚本首先需要接收用户输入的要部署的服务名称,以此来确定后续针对该服务(这里明确是 nginx)的操作。
- 服务安装状态判断及处理:
- 已安装情况:如果判断出 nginx 已经安装,那么需要进行一系列自定义配置操作,包括设定自定义网站配置路径(这里指定为 /www),并且在该路径下创建共享目录以及网页文件,最后还要重启 nginx 服务。
- 未安装情况:若发现 nginx 未安装,则要执行相应的安装操作
- 服务运行状态测试及处理:在完成前面的安装或配置操作后,需要测试 nginx 服务是否成功运行。
- 已运行情况:如果 nginx 服务已运行,告知用户可以通过浏览器访问网站。
- 未运行情况:若 nginx 服务未运行,除了提示服务未启动外,还需要显示自定义的配置文件内容(这里应该是指之前创建的网页文件内容等),以便用户进一步排查问题。
- 邮件通知及脚本发送:当完成上述所有关于 nginx 部署及测试的操作后,如果整个过程没有问题,需要通过邮件告知用户,并且要将脚本代码本身作为附件一并发送给用户。
二、具体步骤分析
1. 接收用户部署的服务名称
通过read
命令来提示用户输入要部署的服务名称,并将用户输入的内容存储到一个变量中,以便后续进行判断和处理。
2. 判断服务是否安装及相应处理
已安装情况
- 确认安装状态:可以使用
which nginx
命令来检查 nginx 是否已经安装。如果该命令执行后输出为空(通过重定向>/dev/null 2>&1
将标准输出和错误输出都丢弃,若有输出说明找到了可执行文件,即已安装),则说明 nginx 已安装。
which”命令会查找 “nginx” 这个命令在系统中的可执行文件路径
- 如果系统中已经安装了 Nginx,那么它会返回 Nginx 可执行文件所在的路径
- 如果系统中没有安装 Nginx,那么它通常不会返回任何内容
- 标准输出一般用于输出命令正常执行的结果——用文件描述符 1 表示
- 标准错误输出则用于输出命令执行过程中出现的错误信息——用文件描述符 2 表示
- >:用于将标准输出重定向到一个指定的文件或设备。例如,echo "Hello" > file.txt会把 “Hello” 这句话的输出从默认的终端显示重定向到file.txt文件中,也就是会创建或覆盖file.txt` 文件并写入 “Hello“
- >> :与 “>类似,但它是追加模式,即如果指定的文件已经存在,不会覆盖原有内容,而是在文件末尾追加新的内容
- /dev/null :数据黑洞,任何写入其中的数据都会被丢弃
- 自定义配置操作:
- 创建自定义网站配置路径:使用
mkdir -p
命令创建指定的网站配置路径(/www),-p
选项确保即使父目录不存在也能创建成功。 - 创建共享目录和网页文件:在已创建的网站配置路径下,使用
touch
命令创建一个网页文件(如index.html
),并通过重定向操作(如echo "this is test" >
)向该网页文件写入一些测试内容。 - 重启服务:使用
systemctl restart nginx
命令来重启 nginx 服务,以使前面的配置更改生效。
- 创建自定义网站配置路径:使用
未安装情况
- 确认安装状态:与已安装情况判断相反
- 安装对应的软件包:
- 执行安装命令
mount /dev/sr0 /mnt
dnf install nginx -y
3. 测试服务是否成功运行及相应处理
已运行情况
- 使用
systemctl is-active nginx
命令来检查 nginx 服务是否处于活动状态(即已运行)。如果该命令执行后输出为空(同样通过重定向丢弃输出,若有输出说明服务未运行),则说明 nginx 服务已运行,此时告知用户可通过浏览器访问网站。
未运行情况
- 若
systemctl is-active nginx
命令执行后输出有内容,说明 nginx 服务未运行。此时除了提示服务未启动外,还需要显示自定义的配置文件内容。
4. 邮件告知及脚本发送
- 邮件设置:
- 确定邮件主题
- 编写邮件正文
- 指定附件:要将脚本代码本身作为附件发送,需要获取脚本文件的当前路径和文件名($(pwd)/$(basename $0)),并将其作为附件指定给邮件。
$(pwd)/$(basename $0)
- 构建出了当前脚本文件在文件系统中的完整路径及文件名
- 例如,如果当前工作目录是 /home/user/scripts 且脚本文件名为 test.sh,那么 $(pwd)/$(basename $0) 就等于 /home/user/scripts/test.sh
pwd
- 获取当前工作目录路径
basename
- 是一个用于获取路径中的文件名部分的命令
- 基本用法是 basename [路径],当给定一个完整的路径时,它会返回该路径中的文件名部分
- 例如,对于路径 /home/user/Documents/test.sh,执行 basename /home/user/Documents/test.sh 会返回 test.sh
- 如果只给定一个文件名(没有路径部分),它就直接返回该文件名本身
$0
- 是一个特殊的变量,在 Shell 脚本中它代表当前正在执行的脚本文件本身的名称(包括扩展名,如果有的话)
- 例如,如果你的脚本文件名为 test.sh,那么在脚本执行过程中,$0 的值就是 test.sh
- 发送邮件:使用
mail或s-nail
命令来发送邮件,需要指定邮件主题、收件人邮箱地址以及附件等相关信息。
5.邮箱部署
#挂载
[root@localhost yangjunjie]# mount /dev/sr0 /mnt
#安装邮件服务、
[root@server ~]#dnf install s-nail -y
#配置邮件服务
[root@localhost yangjunjie]# vim /etc/s-nail.rc
#测试邮件服务
[root@localhost yangjunjie]# echo 邮件内容:我是作业 | mail -s 主题 xxxxxx@163.com
三、实验操作
[root@Server ~]# cat test5.sh
#!/bin/bash# 接收用户输入的服务名称
read -p "请输入要部署的服务名称: " service_name# 判断输入的服务名称是否为nginx
if [ "$service_name" != "nginx" ]; thenecho "请输入正确的服务名称(nginx)"#终止脚本运行exit 1
fi
#################################################################
#使用which命令检查nginx是否已经安装
if which nginx &>/dev/null; thenecho "Nginx已安装"# 创建自定义网站配置路径及共享目录和网页文件website_path="/www"#使用-p选项确保即使父目录不存在也能创建成功mkdir -p $website_pathtouch $website_path/index.htmlecho "this is test" > $website_path/index.html# 重启nginx服务systemctl restart nginxelseecho "Nginx未安装,接下来将开始安装nginx"#配置挂载点mount /dev/sr0 /mntdnf install nginx -yfi#################################################################
# 测试nginx服务是否成功运行
if systemctl is-active nginx &>/dev/null; thenecho "Nginx服务已运行,可通过浏览器访问网站"
elseecho "Nginx服务未启动"echo "以下是自定义配置文件内容:"cat $website_path/index.html
fi#################################################################
#mail -s 邮件主题 s-nail 与之相同
#mail -a 添加附件
attachment="$(pwd)/$(basename $0)"echo "脚本代码——杨俊杰" | s-nail -s "Linux练习作业" -a "$attachment" lxx1065372838@163.com
[root@Server ~]#
运行脚本
邮箱测试(自己的)
网页测试
关闭防火墙和SElinux
[root@Server ~]# systemctl stop firewalld
[root@Server ~]# setenforce 0
修改配置文件
[root@Server ~]# vim /etc/nginx/nginx.conf