自动化部署 - 构建YUM本地源

yum 本地源 构建

学会打rpm包后(见如何利用rpm-maven-plugin打包前后端项目,那么接着就是在本地集群构建yum源了

文章包含两个部分:一是自动脚本构建 yum源,二是分发yum源配置,使得整个集群yum安装从本地源拉取

相比较而言,本地YUM源服务器最大优点在局域网的快速网络连接和稳定性。有了局域网中的YUM源服务器,即便在Internet连接中断的情况下,也不会影响其他YUM客户端的软件升级和安装

构建本地yum源适用于以下场景:

  • 客户现场没有网络环境
  • 外网环境不佳
  • 减轻带宽压力
  • 本地化自动部署

本地源配置的三种方式

  • 一是直接使用CentOS光盘作为本地yum源,优点是简单便捷,缺点是光盘软件包可能不完整(centos 7 Everything 总共才6.57G);
  • 二是同步CentOS官方源到本地(相当于创建了一个公共镜像),优点是最靠谱,缺点是占空间费流量;
  • 三是创建完全自定义的本地源,优点是灵活性最大,缺点是只是作为其他源的补充。

因为有本地化部署的需求,且客户现场没有网络环境,所以稍微了解和构建下 CentOS光盘和 自定义本地源两种方式,最后通过构建脚本自动构建yum本地源,且通过分发脚本将yum源配置同步到集群的各台机器

一、yum本地源构建步骤

(手动测试一遍、了解下步骤)

1.启动http服务作为yum源的http服务
首先并没有选用apache httpd服务,而是直接用 python 的SimpleHTTPServer模块

1
2
3
4
# 切换到yum源存放的根目录
cd ./yum_installer
# 当前目录启动
nohup /usr/bin/python -m SimpleHTTPServer 9381 &

2.安装 createrepo 工具

1
2
#yum 安装 或者下载rpm包安装
yum install createrepo

3.安装yum源

3.1 使用linux iso 镜像中的RPM 源

1
mount ./bigfile/centos7_iso/CentOS-7-x86_64-DVD-1708.iso ./ambari/centos/centos7/ -t iso9660 -o loop

3.2 使用自己的rpm源

举例创建repo1仓库,先更新好rpm源,再在/etc/yum.repo.d/中增加test.repo

1
2
3
4
5
6
# 创建目录
mkdir -p repo1/test/centos7
# 拷贝 相关的rpm到该目录
cp *.rpm repo1/test/centos7/
# 更新仓库信息,会在repo1/test/centos7目录生成repodata目录
createrepo repo1/test/centos7
  1. 配置yum源

先备份/etc/yum.repo.d 所有repo文件,后续恢复从backup移到外面即可。
如果只是新增源,则不需要mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup

1
2
mkdir -p /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup

在/etc/yum.repo.d/中增加test.repo文件,写入

1
2
3
4
5
6
7
8
9
10
11
12
[base]
name=CentOS
baseurl=http://127.0.0.1:9381/ambari/centos/centos7
gpgcheck=1
enabled=1
gpgkey=http://127.0.0.1:9381/ambari/centos/centos7/RPM-GPG-KEY-CentOS-7
[test]
name=test
baseurl=http://127.0.0.1:9381/repo1/test/centos7
gpgcheck=0
enabled=1

这是执行

1
2
3
4
#清除yum源缓存
yum clean all
# 列出可用yum源
yum repolist

这样就只有上面配置的两个源 base[CentOS-7.iso]和 test[自己copy的rpm]


图片1:手动安装的yum源,没有配置centos.iso,test 仓库只放了一个rpm包


图片2:直接yum install 自定义rpm

自动构建(新增)rpm 本地源

自动构建脚本,文件路径和上面手动测试的不一致了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/bin/bash
set -e
if [ $# -ne 1 ];then
echo "please user in : ./install01.sh IP"
exit 1
fi
#echo $1
echo "挂载centos7的iso文件到ambari yum目录"
set +e
mount ./bigfile/centos7_iso/CentOS-7-x86_64-DVD-1708.iso ./ambari/centos/centos7/ -t iso9660 -o loop
set -e
echo "安装并启动yum源..."
echo "start web service by python"
sed 's/localhost/'$1'/g' tool/install/bk/ambari.repo_bk > tool/install/ambari.repo
CHECK01=`netstat -anlupt |grep '0.0.0.0:9381' |grep -v grep |wc -l` &> /dev/null
if [ -f /etc/yum.repos.d/ambari.repo ];then
rm -rf /etc/yum.repos.d/ambari.repo
fi
if [ -d /etc/yum.repos.d/bk ];then
rm -rf /etc/yum.repos.d/bk
fi
mkdir /etc/yum.repos.d/bk
if ls /etc/yum.repos.d/*.repo >/dev/null 2>&1;then
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bk/
fi
cp ./tool/install/ambari.repo /etc/yum.repos.d/
if [ $CHECK01 -eq 1 ] && [ -f ./log/test2 ];then
echo "yum源已经启动 , 跳过..."
else
nohup /usr/bin/python -m SimpleHTTPServer 9381 &
sleep 5
fi
yum clean all
echo "yum install wget -y -d 0 -e 0"
yum install wget -y -d 0 -e 0
set +e
echo "测试yum源是否正常..."
wget -O ./log/test2 http://$1:9381/tool/install/test
if [ $? -eq 0 ];then
echo "yum源安装并启动成功,使用端口:9381"
else
echo "yum源安装并启动失败,请处理!"
exit 1
fi
set -e

推广到集群

同 免密那篇文章分发授权文件一样,使用host.file,循环将repo文件分发到各台服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/bin/bash
set -e
LocalIP=$1
PORT=$2
if [ $# -ne 2 ];then
echo "please user in : ./distribute.sh local_IP ssh_port"
exit 1
fi
for i in `cat host.file`
do
ip[$L]=`echo $i |awk -F: '{print $1}'`
let "L=$L+1"
done
read -p "Has the distribute work been done ...in all host [y/n]: " ch
if [ $ch = y ] || [ $ch = Y ] ;then
echo "开始分发repo文件 , 请稍等..."
echo '' > ./log/distribute_status
for((i=0;i<${#ip[@]};i++))
do
{
set +e
echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@${ip[$i]}@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
#清理原来的.repo文件
ssh -p$PORT ${ip[$i]} "mkdir /etc/yum.repos.d/bk;mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bk/"
#分发ambari.repo文件
scp -P$PORT ./tool/install/ambari.repo ${ip[$i]}:/etc/yum.repos.d/
echo "yum install wget -y -d 0 -e 0"
ssh -p$PORT ${ip[$i]} "yum clean all;yum install wget -y -d 0 -e 0"
set -e
} > ./log/distribute_${ip[$i]}.log 2>&1 &
done
else
echo "give up the distribute work ...in all host"
fi
坚持原创技术分享,您的支持将鼓励我继续创作!
分享