如何优雅的打造 All-in One 仓库
做过大型项目的同学一定都搞过自定义 yum 仓库,自定义 yum 在网上也有很多种方案,但今天我们来个不一样的玩法!
在开始之前先来抛出几个问题
- 如何快速的制作一个仓库?
- 如何快速的制作一个最精简仓库?
- 如何快速的制作一个包含 docker、pypi、yum 和 maven 等等的 All-in One 仓库?
- 如何在一个离线环境中快速的安装我们所需要的软件包?
Nexus 是什么?
简单来说 Nexus 是一个全能的仓储管理工具,它能帮我们解决有关软件包的一系列问题。下面我们来还原几个真实的场景,接下来我们就请上今天的主角, Nexus 闪亮全场!
情景一
公司接了一个超大型项目,需要在用户的离线环境中部署公司数十套产品。那么这个光荣而艰巨的任务就交到运维同学身上吧!
吃饭时间看见运维同学闷闷不乐,于是不解的过去问他,公司有大项目了,为啥还愁眉苦脸的呀?运维同学说,这十几套产品,要安装的软件一大堆,软件包依赖问题一大堆,这可如何是好呀。
我拍了拍运维同学的肩膀对他说,信杰哥,杰哥带你飞!
安装 Nexus 服务
在内网找一台可以访问公网的机器,安装 Nexus 服务
解压软件
tar xzf nexus-3.14.0-04-unix.tar.gz -C /data/sonatype-work/nexus3echo 'NEXUS_HOME="/data/nexus-3.14.0-04"' >> ~/.bashrcecho 'run_as_user="root"' >> /data/nexus-3.14.0-04/bin/nexus.rc
服务配置
shell> vim /etc/systemd/system/nexus.service
[Unit]Description=nexus serviceAfter=network.target
[Service]Type=forkingLimitNOFILE=65536ExecStart=/data/nexus-3.14.0-04/bin/nexus startExecStop=/data/nexus-3.14.0-04/bin/nexus stopUser=rootRestart=on-abort
[Install]WantedBy=multi-user.target
启动服务
systemctl reload-daemonsystemctl start nexus
登录
http://10.200.60.21:8081/
默认账号密码: admin/admin123
登录后记得修改 admin 密码
配置 yum proxy
创建 repository
选择 "yum(proxy)"
确定清华 Yum 仓库地址
填写 "name" 和 "Remote storage",注意 "Remote storage" 需要以 "/" 结尾
Repository 创建完成后
确定 Repository 的状态,"Online - Remote Available" 才是正确状态哦
编写客户端 Yum 配置文件,注意 "baseurl" 也需要以 "/" 结尾!
shell> vim tsinghua.repo[tsinghua]name=Tsinghua RHEL/CentOS $releasever - $basearchbaseurl=http://admin:admin123@10.200.60.21:8081/repository/tsinghua/$releasever/os/$basearch/enabled=1gpgcheck=0
执行安装
yum clean all; yum makecacheyum install http
安装完成后查看仓储中已经有了已安装过的 rpm 包
看到这里,不知道各位小伙伴有没有看明白,以上操作是我们使用 Nexus 仓库中 Yum proxy 的功能,创建了一个代理清华 Yum 源的 Repository,然后在内网的机器上,配置好指向 Nexus 中的 Repository,这时再安装软件,就会通过 Nexus 找到清华 Yum 源中的软件包进行安装。
只要运维同学使用了配置好的 Yum 源,所有安装过的软件都会记录在这里。到时测试完成后,批量把软件包进行下载,再通过 Nexus 创建私有仓储即可完美使用。
软件包有两种情况
- 如果软件包不存在,则 Nexus 会从 Proxy 端远程下载软件包
- 如果软件包存在,则直接返回给客户端使用
那可能有同学问了,如果清华 Yum 源的包不够用怎么办?我们还可以再添加 163、 epel 的源呀,所以只要能找到提供 Yum 的地址,都可以尽情的使用 Nexus yum proxy。并且以上配置不区别操作系统版本,如 CentOS 6 也可以使用,不信?我们来瞧瞧~
shell> cat /etc/*release*CentOS release 6.9 (Final)LSB_VERSION=base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarchcat: /etc/lsb-release.d: Is a directoryCentOS release 6.9 (Final)CentOS release 6.9 (Final)cpe:/o:centos:linux:6:GA
yum clean all; yum makecacheyum install httpd -y
可以看到,出现了一个 "6" 的目录,分支下也生成了 http 相关的 rpm 包
大家想想看,这是为什么呢?
情景二
一个 DB 小 A 跑来找我,说杰哥,我要装个 MySQL 8.0,可是咱们内网 Yum 源里没安装包呀,公司下载又特别慢,你有没有办法呀?
我看了他一眼,告诉他,信杰哥,不翻车。大家说说我们有什么办法来帮助他呢?
找到 MySQL 官方 Yum 源
下载下来,定晴一看,怎么是个 rpm 包呀?不慌,rpm 本身就是个压缩包,我们用压缩工具打开看看
原来 repo 文件藏在里面呀,这里有两个 repo 文件
- mysql-community-source.repo
- mysql-community.repo
让我们来猜猜,带有 source 的,是有关源码的仓库,不带 source 的,是编译好打包的 rpm 包,我们直接打开 mysql-community.repo,赫然看到,原来 MySQL 官方 Yum 源都在这里呢,里面内容相信大家都不陌生吧。
看到这里,是不是大家又明白点什么了!没错,有了官方 Yum 源地址,我们就可以在 Nexus 上创建 Yum proxy
编写 repo 文件
shell> cat mysql8.repo[mysql8]name=Mysql for RHEL/CentOS $releasever - $basearchbaseurl=http://admin:admin123@10.200.60.21:8081/repository/MySQL8.0/$releasever/$basearch/enabled=1gpgcheck=0
执行安装
yum install yum install mysql-community-client-8.0.11 mysql-community-server-8.0.11
同样,此 Yum 源同时支持 CentOS 6 和 CentOS 7,把同样的 repo 文件放到 CentOS 6 机器上,执行安装。
情景三
这一天,又一个运维小哥跑来找我,说杰哥杰哥,我们这次有好多需求,要下载好多 docker 镜像,又要下载好多 pypi 镜像,还要安装各个版本的 MySQL,我们搞不定啦,快来支持我们一下啊~~~
我吐……这下杰哥帮不了你了,给你份文档自己看着办吧。哈哈
尾声
结合以上几个情景,相信大家对 Nexus 都有一个大致的了解,Nexus 的权限管理、LDAP,还有 https 都有相应的支持,我们甚至可以把它当做 FTP 服务器来用,我们的 CI/CD 流程也已经集成了 Nexus 。所以 Nexus 还有好多好玩的,等着大家探(入)索(坑)哈!
- 常见Web源码泄露总结
- 浅析Entity Framework Core2.0的日志记录与动态查询条件
- ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)
- 【weakfilescan】敏感文件扫描工具
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
- ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)
- CVE-2017-11882漏洞复现
- ASP.NET Core使用静态文件、目录游览与MIME类型管理
- Python 黑客——使用Python破解门禁系统
- ASP.NET Core文件上传与下载(多种上传方式)
- 采用Opserver来监控你的ASP.NET项目系列(三、监控你的服务器状态)
- eclipse中运行hbase时不能显示表中的值
- 从 PHP 到 Java
- 用Lua定制Redis命令
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Matlab矩阵加入新元素
- 每个Python程序员都应该知道的10个缩写
- 《剑指offer》第九天:斐波那契数列
- [tensorflow损失函数系列]sigmoid_cross_entropy_with_logits
- 0794-5.16.2-Hive和Imapla查询decimal类型结果不同异常
- 利用TFRecords存储于读取带标签的图片
- matlab sum函数
- [tensorflow损失函数系列]softmax_cross_entropy_with_logits
- RESTful API 设计最佳实践
- Spring 是如何解决循环依赖的?
- 移动webhead参数
- 看了这篇泛型,下次设计链表别傻傻的用int 表示node节点的值了
- 标准TensorFlow格式 TFRecords
- LeetCode 05最长回文子串
- 基于NCNN的3x3可分离卷积再思考盒子滤波