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
| cd ./yum_installer
nohup /usr/bin/python -m SimpleHTTPServer 9381 &
|
2.安装 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
cp *.rpm repo1/test/centos7/
createrepo repo1/test/centos7
|
- 配置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 clean all
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 "挂载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]}@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" ssh -p$PORT ${ip[$i]} "mkdir /etc/yum.repos.d/bk;mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bk/"
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
|