Shell实现服务自动部署

news2024/11/12 16:43:23

一、环境

注意:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1948249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UEFI DebugLib 介绍

1.我们调试中常用Debug 打印信息&#xff0c;这些会输出到BIOS串口日志中 EFI_STATUSEFIAPIHelloWorld2(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE *SystemTable){EFI_STATUS Status;StatusEFI_SUCCESS;gST->ConOut->OutputString(gST->ConOut,L&q…

如何保护您的 WordPress 不被黑?

明月可以说是见到过太多 WordPress 网站被黑的示例了&#xff0c;加上平时明月也会接一些 WordPress 疑难杂症的解决服务订单&#xff0c;所以这方面绝对是专业对口了。作为一个资深 WordPress 博客站长&#xff0c;谁都有被黑过的经历&#xff0c;都是一步步走过来的&#xff…

从零入门AI for Science(AI+化学)#Datawhale AI 夏令营

基于天池平台“第二届世界科学智能大赛 物质科学赛道&#xff1a;催化反应产率预测”使用平台 我的Notebook 魔搭社区 https://modelscope.cn/my/mynotebook/preset 赛事官网 上海科学智能研究院 http://competition.sais.com.cn/competitionDetail/532233/myScore Task1 …

七、SpringBoot日志

1. 得到日志对象 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; //打印日志…

【Vue实战教程】之Vue工程化项目详解

Vue工程化项目 随着多年的发展&#xff0c;前端越来越模块化、组件化、工程化&#xff0c;这是前端发展的大趋势。webpack是目前用于构建前端工程化项目的主流工具之一&#xff0c;也正变得越来越重要。本章节我们来详细讲解一下如何使用webpack搭建Vue工程化项目。 1 使用we…

Web渗透-WAF绕过技巧

一、WAF简介 Web应用防护系统&#xff08;也称为&#xff1a;网站应用级入侵防御系统。英文&#xff1a;Web Application Firewall&#xff0c;简称&#xff1a; WAF&#xff09;。利用国际上公认的一种说法&#xff1a;Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略…

叮!2024 龙蜥操作系统大会议题征集正式启动

定啦&#xff01;2024 龙蜥操作系统大会&#xff08;OpenAnolis Conference&#xff0c;以下简称“龙蜥大会”&#xff09;将于 2024 年 8 月 30 日在北京中关村国家自主创新示范区会议中心盛大召开。 2024 龙蜥大会由中关村科学城管委会、海淀区委网信办、中国开源软件推进联…

配置sublime的中的C++编译器(.sublime-build),实现C++20

GCC 4.8: 支持 C11 (部分) GCC 4.9: 支持 C11 和 C14 (部分) GCC 5: 完全支持 C14 GCC 6: 支持 C14 和 C17 (部分) GCC 7: 支持 C17 (大部分) GCC 8: 完全支持 C17&#xff0c;部分支持 C20 GCC 9: 支持更多的 C20 特性 GCC 10: 支持大部分 C20 特性 GCC 11: 更全面地支持 C20 …

uniapp开发精选短视频视频小程序实战笔记20240725,实现顶部轮播图和热门短剧

创建项目 创建项目,叫video_app。 在pages.json里面修改一下标题: 新建search搜索页面和me我的页面。 此时界面预览效果如下: 引入静态资源 主要是static里面的内容,全部复制过来。 配置底部导航栏 pages.json,放到顶层,和全部样式同级: "tabBar&quo…

Java的类加载机制

Java的类加载机制是指将类的字节码文件&#xff08;.class文件&#xff09;加载到JVM中并将其转换为Class对象的过程。这个过程由类加载器&#xff08;ClassLoader&#xff09;完成。Java的类加载机制具有动态性和灵活性&#xff0c;使得Java能够支持动态加载类、实现模块化开发…

4s店客户管理系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;门店管理&#xff0c;车展管理&#xff0c;汽车品牌管理&#xff0c;新闻头条管理&#xff0c;预约试驾管理&#xff0c;我的收藏管理&#xff0c;系统管理 微信端账号功能包括&a…

HTTP请求入参类型解读

HTTP请求入参类型解读 Content-Type 在HTTP请求中&#xff0c;Content-Type请求头用于指示资源的MIME类型&#xff0c;即请求体的媒体类型。它告诉服务器实际发送的数据类型是什么&#xff0c;以便服务器能够正确地解析和处理这些数据。Content-Type可以有多种值&#xff0c;…

13.2 MongoDB

13.2 MongoDB 1. 概述2. docker安装3. SpringBoot整合MongoDB3.1 依赖3.2 配置连接1. 基于`yml`配置2. 基于配置类配置3.3 启动项坑1坑23.4 新增业务1. 实体类映射2. 数据层3. 业务层4. 控制层5. 测试结果3.5 单条记录查询业务1. 数据层2. 业务层3. 控制层4. 断点测试3.6 分页查…

代码随想录算法训练营day6 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1.两数之和

文章目录 哈希表键值 哈希函数哈希冲突拉链法线性探测法 常见的三种哈希结构集合映射C实现std::unordered_setstd::map 小结242.有效的字母异位词思路复习 349. 两个数组的交集使用数组实现哈希表的情况思路使用set实现哈希表的情况 202. 快乐数思路 1.两数之和思路 总结 今天是…

FoundationDB 基本使用

目录 一、FoundationDB介绍 二、安装单机版FoundationDB 2.1 下载安装程序 2.2 安装FoundationDB 2.3 修改配置信息 2.4 管理FoundationDB服务 三、fdbcli的常用命令 3.1连接数据库 3.2退出fdbcli 3.3查看版本 3.4 写模式 3.5写入键值 3.6读取键值 3.7删除键值 …

花几千上万学习Java,真没必要!(二十七)

1、Math类&#xff1a; package mathtest.com; public class MathDemo { public static void main(String[] args) { // 定义圆的半径 double radius 5.0; // 计算并打印圆的周长 double circumference 2 * Math.PI * radius; System.out.printf("圆的周长: %.2f…

Vue 状态管理 Vue CLI

Vue 状态管理 & Vue CLI 1、状态管理2、集中状态管理2.1 Vuex2.1.1 Vuex核心概念2.1.2 Vuex Store实例2.1.3 Vuex Getter2.1.4 Vuex Mutation2.1.4 Vuex Actions2.1.4 Vuex Module 2.2 Pinia2.2.1功能增强 3、Vuex 实现原理4、Pinia 实现原理5、CLI5.1 实现 1、状态管理 将…

【机器学习】激活函数:神经网络的灵魂

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 激活函数&#xff1a;神经网络的灵魂什么是激活函数?常见激活函数类型1. Sigmo…

Linux环境安装KubeSphere容器云平台并实现远程访问Web UI 界面

文章目录 前言1. 部署KubeSphere2. 本地测试访问3. Linux 安装Cpolar4. 配置KubeSphere公网访问地址5. 公网远程访问KubeSphere6. 固定KubeSphere公网地址 前言 本文主要介绍如何在Linux CentOS搭建KubeSphere并结合Cpolar内网穿透工具&#xff0c;实现远程访问&#xff0c;根…

UE4调试UE4Editor-Cmd.exe

在工作中&#xff0c;我们看到这样的构建命令&#xff1a; %EnginePath%\Binaries\Win64\UE4Editor-Cmd.exe %ClientPath%\%ProjectName%.uproject -runHotPatcher {其它参数} 我们应该如何调试UE4Editor-Cmd.exe呢&#xff1f;其实调试 UE4Editor.exe 就可以了&#xff08;参考…