【shell脚本快速一键部署项目】

news2024/9/17 8:35:31

目录

  • 一、环境拓扑图
  • 二、主机环境描述
  • 三、注意
  • 四、需求描述
  • 五、shell代码的编写
  • 六、总结

一、环境拓扑图

在这里插入图片描述

二、主机环境描述

主机名主机地址需要提供的服务
content.exam.com172.25.250.101提供基于 httpd/nginx 的 YUM仓库服务
ntp.exam.com172.25.250.102提供基于Chronyd 的 NTP 服务
mysql.exam.com172.25.250.103提供基于 MySQL 的数据库服务
nfs.example.com172.25.250.104提供基于 NFS 的网络文件系统服务
dns.exam.com172.25.250.105提供基于 bind 的 DNS 服务
bbs.exam.com172.25.250.106提供基于 Discuz 的论坛服务

三、注意

  • 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脚本

五、shell代码的编写

#!/bin/bash
#########################
#File name:demo.sh
#Version:v1.0
#Created time:2024-07-19 10:08:38
#Description:
#########################
#安装httpd/Chronyd/MySQL/NFS/bind软件包
read -p "请确保你的Discuz文件在本机的/root目录里[y/n]:" result
if [ $result == "n" ];then
	echo -e "\033[32m请准备好环境 \033[0m "
	exit 0
fi
file_n=$(ls /root/Discuz* | wc -l)
if [ $file_n -eq 0 ];then
 	echo -e  "\033[32m在本机的家目录没有Discuz文件\033[0m "
 	exit 0
fi

read -p "注意 : 两台主机必须做免密登录[y/n]:" resu
if [ "$resu" == "n" ];then
	echo "请你先做免密登录"
	exit 0
fi
read -p "请输入你另一台主机的ip地址:" other_ip
$(ping -c2 $other_ip &>/dev/null)
if [ $? -eq 0 ];then
	echo "另一台主机已经准备好了"
else
	echo "该主机不存在????"
	exit 0
fi
check_local_yum(){
	local n=$(df -h | grep "/dev/sr0" | wc -l)
	if [ $n -eq 0 ];then
cat << EOF > /etc/yum.repos.d/local.repo
[localrepo]
name=localrepo1
baseurl = file:///mnt/AppStream/
enabled = 1
gpgcheck = 0
[localrepo1]
name=localrepo2
baseurl = file:///mnt/BaseOS/
enabled = 1
gpgcheck = 0
EOF
	mount /dev/sr0 /mnt
	fi
	echo "-本地yum仓库没有问题-"
}	
ip_yes()
{
	ip_nums=$(hostname -I | awk '{for(i=1;i<=NF;i++) count++}END {print count}')
	if [ $ip_nums -ge 5 ];then
		echo "主机的ip地址充足,地址个数:$ip_nums"
	else
		echo "主机的ip地址不满足要求"
		exit 0
	fi
}
dns_localhost()
{
	echo "nameserver $1" > /etc/resolv.conf 
	echo "本机的dns地址临时修改为$1"
}
install_softs()
{
	httpd_status=$(rpm -qa httpd | wc -l)
	if [ $httpd_status -eq 0 ];then
		yum install httpd -y &>/dev/null
		echo "正在安装httpd服务"
	fi
	chrony_status=$(rpm -qa chrony | wc -l)
	if [ $chrony_status -eq 0 ];then
		yum install chrony -y &>/dev/null
		echo "正在安装chrony的服务"
	fi
	mysql_status=$(rpm -qa mariadb |wc -l)
	if [ $mysql_status -eq 0 ];then
		yum install mariadb mariadb-server -y &>/dev/null
		echo "正在安装mysql的服务"
	fi
	nfs_status=$(rpm -qa nfs-utils | wc -l)
	if [ $nfs_status -eq 0 ];then
		yum install nfs_utils -y &>/dev/null
		echo "正在安装nfs的服务"
	fi
	bind_status=$(rpm -qa bind |wc -l)
	if [ $bind_status -eq 0 ];then
		yum install bind -y &>/dev/null
		echo "正在安装bind的服务"
	fi
	echo "httpd/Chronyd/MySQL/NFS/bind软件包***安装完成***"
}
httpd_config()
{
	ls /web-server/test &>/dev/null
	if [ $? -ne 0 ];then
		mkdir /web-server/test -p
		echo "Hello,Welcome to www.exam.com !" > /web-server/test/index.html
		chcon -t httpd_sys_content_t /web-server/test/ -R
	fi
	ls /web-server/yum/yum &>/dev/null
	if [ $? -ne 0 ];then
		mkdir /web-server/yum/yum -p
		chcon -t httpd_sys_content_t /web-server/yum/
	fi
cat << EOF > /etc/httpd/conf.d/vhost.conf
<directory /web-server>
        allowoverride none
        require all granted
</directory>
<virtualhost 0.0.0.0:80>
        documentroot /web-server/test
        servername www.exam.com
</virtualhost>
<virtualhost 0.0.0.0:80>
        documentroot /web-server/yum
        servername content.exam.com
</virtualhost>
EOF
#配置网络yum仓库
cat << EOF > /root/local.repo
[localrepo]
name=localrepo1
baseurl = http://content.exam.com/yum/AppStream/
enabled = 1
gpgcheck = 0
[localrepo1]
name=localrepo2
baseurl = http://content.exam.com/yum/BaseOS/
enabled = 1
gpgcheck = 0
EOF

	mount_host=$(df -h | grep -o "mnt")
 	if [ "$mount_host" == "mnt" ];then
 		umount /mnt
 		mount /dev/sr0 /web-server/yum/yum/
 	fi

	systemctl restart httpd
	echo "httpd的服务配置完成"
}
chrony_config(){
	local num=$(grep "local stratum 3" /etc/chrony.conf | wc -l)
	if [ $num -eq 0 ];then
		echo "local stratum 3" >> /etc/chrony.conf
		echo "allow $other_ip/32" >> /etc/chrony.conf
		echo "server ntp.aliyun.com iburst" >>/etc/chrony.conf
		sed -i '/pool 2.rhel.pool.ntp.org/d' /etc/chrony.conf

	fi
	systemctl restart chronyd
	local ch_num=$(chronyc tracking -V | awk '/Stratum/{print $3}')
	echo "chrony服务客服端配置完成,本服务器设置为$ch_num层"
}
mysql_config(){
	systemctl restart mariadb.service
	#数据库设置密码
	mysql -u root -e "SELECT 1;" &>/dev/null
	if [ $? -ne 0 ];then
		echo "数据库密码已经设置好了"
	else
		mysql -u root << EOF
alter user 'root'@'localhost' identified by 'redhat';
flush privileges;
EOF
	mysql -uroot -predhat -e "grant all privileges on *.* TO 'root'@'%' identified by 'redhat' with grant option;"
	mysql -uroot -predhat -e "create database bbs;"
	echo "数据库已经设置完成,密码:redhat,创建好bbs数据库"
	fi
}
nfs_config()
{
	ls /bbs &> /dev/null
	if [ $? -ne 0 ];then
		mkdir /bbs
	fi
	local num=$(grep '/bbs' /etc/exports |wc -l)
	if [ $num -eq 0 ];then
		echo "/bbs $other_ip(rw,sync,anonuid=0,anongid=0)" > /etc/exports
	fi
	systemctl restart nfs-server
	echo "nfs配置完成,导出的目录为/bbs"
}
dns_config()
{
	content_ip=$(hostname -I | awk '{print $1}')
	ntp_ip=$(hostname -I | awk '{print $2}')
	mysql_ip=$(hostname -I | awk '{print $3}')
	nfs_ip=$(hostname -I | awk '{print $4}')
	dns_ip=$(hostname -I | awk '{print $5}')
#	dns_localhost $dns_ip
	cat <<EOF > /etc/named.conf
options {
        listen-on port 53 { $dns_ip; };
        directory       "/var/named";
};

zone "." IN {
        type hint;
        file "named.ca";
};
zone "exam.com" IN {
        type master;
        file "named.exam";
};
EOF
	#编写区域配置文件



	 cat <<'EOF' > /var/named/named.exam
$TTL 1D
@       IN SOA  @ admin.exam.com. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      ns1
EOF
        cat <<EOF>> /var/named/named.exam
ns1     A       $dns_ip
www		A		$dns_ip
content A       $content_ip
ntp     A       $ntp_ip
mysql   A       $mysql_ip
nfs     A       $nfs_ip
dns     A       $dns_ip
bbs     A       $other_ip
EOF
	systemctl restart named
	echo "----dns服务配置完成---"
	echo "YUM仓库服务地址:$content_ip"
	echo "NTP服务地址:$ntp_ip"
	echo "mysql服务地址:$mysql_ip"
	echo "nfs服务地址:$nfs_ip"
	echo "dns服务地址:$dns_ip"
}
firewall_config()
{
	local fire=$(systemctl is-active firewalld.service)
	if [ $fire=="inactive" ];then
		systemctl start firewalld.service
	fi
	firewall-cmd --add-service=http --permanent &>/dev/null
	firewall-cmd --add-service=dns --permanent &>/dev/null
	firewall-cmd --add-service=nfs --permanent &>/dev/null
	firewall-cmd --add-port=123/udp --permanent &>/dev/null
	firewall-cmd --add-port=3306/tcp --permanent &>/dev/null
	firewall-cmd --add-service=mountd --permanent &>/dev/null
	firewall-cmd --add-service=rpc-bind --permanent &>/dev/null
	firewall-cmd --reload
	ssh $other_ip systemctl restart firewalld.service
	setenforce 1
	echo "---------正在改变客户端的selinux的配置,时间有点长,耐心等待--------------"
	ssh $other_ip setenforce 1
	ssh $other_ip setsebool -P httpd_use_nfs 1
	ssh $other_ip setsebool -P httpd_unified 1
	#ssh $other_ip ausearch -c 'php-fpm' --raw | audit2allow -M my-phpfpm
	#ssh $other_ip semodule -i my-phpfpm.pp
	ssh $other_ip setsebool -P httpd_can_network_connect_db 1
	ssh $other_ip firewall-cmd --add-service=http --permanent &>/dev/null
	ssh $other_ip firewall-cmd --add-port=9000/tcp --permanent &>/dev/null
	ssh $other_ip firewall-cmd --reload
	echo "客户端和服务端的防火墙、selinux都配置完成"
}


client_yum_config()
{
	ssh $other_ip "echo \"nameserver $dns_ip\" > /etc/resolv.conf"
	scp /root/local.repo $other_ip:/etc/yum.repos.d/rpm.repo
}
client_ntp_config()
{
	chrony_status=$(ssh $other_ip rpm -qa chrony | wc -l)
        if [ $chrony_status -eq 0 ];then
                ssh $other_ip yum install chrony -y &>/dev/null
                echo "正在安装chrony的服务"
        fi
	local ch_file=$(ssh $other_ip egrep '^server.*iburst' /etc/chrony.conf | wc -l)
	if [ $ch_file -eq 0 ];then
		ssh $other_ip "echo \"server ntp.exam.com iburst\" >> /etc/chrony.conf"
		ssh $other_ip sed -i '/pool\ 2\.rhel\.pool\.ntp\.org\ iburst/d' /etc/chrony.conf
		ssh $other_ip systemctl restart chronyd
	fi
	echo "@@@@@@@客户端的ntp服务配置完成@@@@@@@"
}
client_php_config(){
	local php_num=$(ssh $other_ip rpm -qa php-fpm | wc -l)
	if [ $php_num -eq 0 ];then
		echo "正在安装php软件"
		ssh $other_ip yum install php* -y &>/dev/null
	fi
	ssh $other_ip systemctl restart php-fpm.service

}
client_php_http(){
	local httpd_num=$(ssh $other_ip rpm -qa httpd|wc -l)
	if [ $httpd_num -eq 0 ];then
		ssh $other_ip yum install httpd -y
	fi
	ssh $other_ip systemctl restart httpd
	echo "客服端的httpd的服务配置完成"
}
Discuz_config(){
	scp Discuz* $other_ip:/var/www/html/
	local file_n=$(ssh $other_ip ls /var/www/html | wc -l)
	if [ $file_n -le 3 ];then
		ssh $other_ip yum install unzip -y &>/dev/null
		ssh $other_ip unzip /var/www/html/Discuz* -d /var/www/html &>/dev/null
	fi
	echo "Discuz论坛解压完成"
	ssh $other_ip ls -d /var/www/html/upload/data.bak &>/dev/null
	if [ $? -ne 0 ];then
		ssh $other_ip mv /var/www/html/upload/data /var/www/html/upload/data.bak
		ssh $other_ip mkdir /var/www/html/upload/data
		ssh $other_ip mount $nfs_ip:/bbs /var/www/html/upload/data
		ssh $other_ip cp -p -r /var/www/html/upload/data.bak/* /var/www/html/upload/data/
	fi
	ssh $other_ip chmod o+w /var/www/html/upload/config -R
        ssh $other_ip chmod o+w /var/www/html/upload/data -R
        ssh $other_ip chmod o+w /var/www/html/upload/uc_* -R
	echo "discuz论坛搭建完成"
	echo "客户端的dns指向服务端成功"
}


server_config()
{
	ip_yes
	check_local_yum
	install_softs
	httpd_config
	chrony_config
	mysql_config
	nfs_config
	dns_config
	firewall_config
}
client_config(){
	client_yum_config
	client_php_config
	client_ntp_config
	client_php_http
	Discuz_config
}
server_config
client_config
echo -e "\033[33m 论坛已经完成安装,请在浏览器 http://$other_ip/upload/install/ 访问\033[0m"

六、总结

在编写这个shell脚本前,我的一个编写代码思路是,以模块化的思想编写,比如安装软件在一个模块,http配置在一个模块,dns配置在一个模块,先编写服务端,在编写客户端,然后分模块去测试,为了让这个shell脚本可以多次运行,有些相应的判断就必须要做,比如某个配置文件追加修改了,第二次运行就不能追加修改了。为了让脚本可以在不同的主机上去运行,shell脚本中的主机地址就不能写死,要用变量来获取ip地址。
在编写脚本中,如果出现问题,很难发现错误,最好的方法就是去看日志,像selinux一开启,就会出现很多问题,可以去:tail -f /var/log/messages查看,里面都会给你一些命令解决。像httpd,mariadb,php都有自己单独的日志文件,出错了都可以去上面找答案。

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

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

相关文章

GPU池化:点燃Jupyter Notebook中的AI算力之火

数据科学的火花在Jupyter Notebook中点燃&#xff0c;而GPU的加入&#xff0c;让这火焰更加炽热&#xff01;随着人工智能领域的飞速发展&#xff0c;利用GPU加速已成为数据科学和机器学习领域的新常态。 今天&#xff0c;我们要探索的&#xff0c;是Jupyter Notebook与GPU池化…

PHP学习:PHP基础

以.php作为后缀结尾的文件&#xff0c;由服务器解析和运行的语言。 一、语法 PHP 脚本可以放在文档中的任何位置。 PHP 脚本以 <?php 开始&#xff0c;以 ?> 结束。 <!DOCTYPE html> <html> <body><h1>My first PHP page</h1><?php …

spaCy语言模型下载

spaCy 是一个基于 Python 编写的开源自然语言处理&#xff08;NLP&#xff09;库&#xff0c;它提供了一系列的工具和功能&#xff0c;用于文本预处理、文本解析、命名实体识别、词性标注、句法分析和文本分类等任务。 spaCy支持多种语言模型对文本进行处理&#xff0c;包括中文…

自己在Vmware中搭建mqtt服务器

前言 在学习某个HMI的使用的时候&#xff0c;这个HMI带有MQTT功能&#xff0c;就想着自己是不是能够搭建一个自己的MQTT的服务器呢&#xff1f; 一、mqtt 自己搭建之一&#xff1a;Mosquitto 自己搭建MQTT服务器需要安装和运行MQTT服务软件&#xff0c;比如常用的是Mosquitto…

Tkinter简介与实战(1)

Tkinter简介与实战---实现一个计算器 Tkinter简介安装环境和安装命令WindowsmacOSLinux 注意事项使用正确的包管理器&#xff1a;检查安装完整性&#xff1a;更新 Python&#xff1a;使用虚拟环境&#xff1a; 一个实战例子-----计算器1.创建窗口&#xff1a;2.创建 GUI 组件&a…

学习大数据DAY27 Linux最终阶段测试

满分&#xff1a;100 得分&#xff1a;72 目录 一选择题&#xff08;每题 3 分&#xff0c;共计 30 分&#xff09; 二、编程题&#xff08;共 70…

ANSYS仿真DDR4的眼图

1 眼图的基本知识 对于数字信号&#xff0c;高低电平转换可以组合在多个序列中。以3位为例&#xff0c;总共有000-111和8种组合。在时域中&#xff0c;根据某个参考点对足够多的序列进行对齐&#xff0c;然后将波形叠加形成眼图&#xff0c;如下图所示。 图&#xff1a;眼图中…

JavaScript object find 示例

https://andi.cn/page/621631.html

从信息论的角度看微博推荐算法

引言 在数字时代&#xff0c;推荐系统已成为社交媒体和其他在线服务平台的核心组成部分。它们通过分析用户行为和偏好&#xff0c;为用户提供个性化的内容&#xff0c;从而提高用户满意度和平台的参与度。推荐系统不仅能够增强用户体验&#xff0c;还能显著提升广告投放的效率…

angular入门基础教程(一)环境配置与新建项目

ng已经更新到v18了&#xff0c;我对他的印象还停留在v1,v2的版本&#xff0c;最近研究了下&#xff0c;与react和vue是越来越像了&#xff0c;所以准备正式上手了。 新官网地址:https://angular.cn/ 准备条件 nodejs > 18.0vscodeng版本18.x(最新的版本) {"name&qu…

C# Unity 面向对象补全计划 之 继承(字段与属性)

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列旨在通过补全学习之后&#xff0c;给出任意类图都能实现并做到逻辑上严丝合缝 Q&#xff1a;为什么要单讲继承字段与属性&#xff0c;不讲继承方法了吗&#x…

【SuperMap GIS 信创部署系列】-- 金蝶V10中间件

⼀、安装包获取 本⽂以10.2.1版本安装为例&#xff0c;官⽹下载iserver war包即可。 下载地址&#xff1a;http://support.supermap.com.cn/DownloadCenter/DownloadPage.aspx?id1852 ⼆、部署 iServer.war 1.解压安装包 将下载的supermap-iserver-10.2.1-war.zip包进⾏解…

基于单片机的步进电机系统设计方法探究

摘 要&#xff1a; 单片机是步进电机系统的重要组成部分&#xff0c;对于步进电机系统的驱动控制具有重要的影响。通过分析步进电机系统的工作原理&#xff0c;对步进电机系统进行规划设置。达到降低步进电机的使用成本&#xff0c;提高步进电机的效率与性能的效果。文章主要探…

WIFI 接收机和发射机同步问题+CFO/SFO频率偏移问题

Synchronization Between Sender and Receiver & CFO Correction 解决同步问题和频率偏移问题是下面论文的关键&#xff0c;接下来结合论文进行详细解读 解读论文&#xff1a;Verification and Redesign of OFDM Backscatter 论文pdf&#xff1a;https://www.usenix.org/s…

当自动驾驶遇上扩散模型(Panacea): 生成自动驾驶BEV数据集

Abstract 在自动驾驶领域&#xff0c;对高质量的标注训练数据的需求日益增加。在本文中&#xff0c;我们提出了Panacea&#xff0c;这是一种创新的方法&#xff0c;用于生成驾驶场景中的全景和可控视频&#xff0c;能够生成无限数量的多样化、标注的样本&#xff0c;对于自动驾…

Mojo函数

正如在语言基础中提到的&#xff0c;Mojo支持两种类型的函数&#xff1a;def和fn函数。您可以在任何函数中使用这两种声明方式&#xff0c;包括main()函数&#xff0c;但它们具有不同的默认行为&#xff0c;如本页面所述。 我们认为def和fn都有很好的用例&#xff0c;并且不认…

华为云上如何创建桶

目录 一、进入对象存储服务(OBS)页面,点击【创建桶】二、输入桶的相关信息三、获取 projectId四、获取 OBS Endpoint五、获取 AK/SK一、进入对象存储服务(OBS)页面,点击【创建桶】 二、输入桶的相关信息 可以勾选购买套餐: 点【立即创建】按钮完成桶的创建。 三、获取…

FPGA开发——数码管的使用

一、概述 在我们的日常开发中&#xff0c;数字显示的领域中用得最多的就是数码管&#xff0c;这篇文章也是围绕数码管的静态显示和动态显示进行一个讲解。 1、理论 &#xff08;1&#xff09;数码管原理图 在对数码管进行相关控制时&#xff0c;其实就是对于8段发光二极管和…

LLM还能拿来做异常检测

我从csdn上一路找原文章找到了这一篇 它使用distilbert-base-uncased这个模型给表格数据做文本embedding&#xff0c;并且期望这个LLM已经蕴含了合理的房产相关信息&#xff0c;因此对于没见过的异常房产信息&#xff0c;一定会产生一个与大多数信息embedding都不一样的embedd…

【每日一题】【逆推法 + 贪心】【数学】造数 河南萌新联赛2024第(一)场:河南农业大学 A题 C++

河南萌新联赛2024第&#xff08;一&#xff09;场&#xff1a;河南农业大学 A题 造数 题目描述 样例 #1 样例输入 #1 2样例输出 #1 1样例 #2 样例输入 #2 5样例输出 #2 3做题思路 本题可以用逆推法 将三种操作反过来变为 − 1 , − 2 , / 2 -1 , -2 , /2 −1,−2,/2 …