关于yum仓库往nexus私服传包等实践
如何配置一个 yum 私服,这个问题很早之前就已经研究过,博客也发表过此文章:使用 nexus3 配置 yum 私有仓库 (opens new window),只不过打算重新启用的时候,发现原来博客中前半部分的配置没什么毛病,在后半部分的使用上,则稍有欠缺,这里另起文章,作为补充。
这个跟 Python 私服有点类似:
其实用一句话来表述,就是通过私服拉包的时候,走group的代理,从本地上传包的时候,要走local的仓库。
接下来就记录一下配置方法并用测试包来验证下。
创建私服的过程这里不详述了,已知现有 Yum 私仓,物料信息如下:
- group:http://nexus.test.com/repository/yum/
- local:http://nexus.test.com/repository/wpt-yum-local/
这两个仓库在客户端引用的时候,要分别配置,其中 group 可代理外部包自动下载,一些想要固定版本之类的包,则可以通过上传到 local 里边进行存储。
group 的配置上边文章已经介绍,这里着重说一下 local 仓库的应用,本文以将 elk-7.14.0 版本的 RPM 包及其依赖 down 到本地并传到私服的全流程。
# 1,配置 elk-repo
首先要在一台能够联网的的主机上配置 elk 的 repo,最好是能访问国外网站的节点,通过 repotrack
命令将 RPM 包及依赖下载到本地。
一些软件包 repo 源在国外,并不容易下载,这里提供一个开源的国内镜像同步搜索工具:
- name: search-mirror
desc: 开源软件的国内镜像站点
avatar: https://avatars2.githubusercontent.com/u/416130?s=460&u=8753e86600e300a9811cdc539aa158deec2e2724&v=4 # 可选
link: http://m.eryajf.net/#/
bgColor: "#0074ff" # 可选,默认var(--bodyBg)。颜色值有#号时请添加单引号
textColor: "#fff" # 可选,默认var(--textColor)
2
3
4
5
6
参考 elastic 官方文档,可以看到7.x (opens new window)(另外6.x (opens new window))的 repo 配置姿势大致如下:
# 安装秘钥
$ rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
# 配置repo
$ cat >> /etc/yum.repos.d/es7.repo << EOF
[elasticsearch]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF
2
3
4
5
6
7
8
9
10
11
12
13
14
注意官方配置的 enabled=
为0
,这里要改成1
。
如上配置搞定之后,来两步常规的构建缓存动作:
$ yum clean all
$ yum makecache
2
缓存构建完毕,这个时候可以简单查看一下源里的包:
$ yum list |grep elasticsearch
apm-server.i686 7.14.0-1 elasticsearch
apm-server.x86_64 7.14.0-1 elasticsearch
app-search.noarch 7.6.2-1 elasticsearch
auditbeat.i686 7.14.0-1 elasticsearch
auditbeat.x86_64 7.14.0-1 elasticsearch
elastic-agent.i686 7.12.1-1 elasticsearch
elastic-agent.x86_64 7.14.0-1 elasticsearch
elasticsearch.x86_64 7.14.0-1 elasticsearch
enterprise-search.noarch 7.14.0-1 elasticsearch
filebeat.i686 7.14.0-1 elasticsearch
filebeat.x86_64 7.14.0-1 elasticsearch
heartbeat-elastic.i686 7.14.0-1 elasticsearch
heartbeat-elastic.x86_64 7.14.0-1 elasticsearch
journalbeat.i686 7.14.0-1 elasticsearch
journalbeat.x86_64 7.14.0-1 elasticsearch
kibana.x86_64 7.14.0-1 elasticsearch
logstash.noarch 1:7.9.3-1 elasticsearch
logstash.x86_64 1:7.14.0-1 elasticsearch
metricbeat.i686 7.14.0-1 elasticsearch
metricbeat.x86_64 7.14.0-1 elasticsearch
packetbeat.i686 7.14.0-1 elasticsearch
packetbeat.x86_64 7.14.0-1 elasticsearch
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
可以看到我们常用的几大金刚的 rpm 包全在里边了。
注意
:这个地方不指定版本的时候,默认是对应大版本的最后一个版本,我们亦可以通过 yum list | grep elasticsearch-7.10.1
来查看指定小版本的包。
# 2,下载包
如上准备工作完成之后,我们就要下载包了,下载包有多种方式,这篇文章 (opens new window)介绍了三种方式,其中的 repotrack
既能下载 RPM 包及依赖又能下载依赖的依赖,因此针对一些离线环境是比较友好的,这里也使用此命令。
我们首先将四大金刚写入到一个文件:
$ cat a
kibana
elasticsearch
logstash
filebeat
2
3
4
5
然后使用如下命令将包缓存到本地:
for i in `cat a`;do repotrack $i -p 7;done
-p
参数是指定包的下载路径。
同理,如果你想缓存其他指定版本的包,可用如下命令:
for i in `cat a`;do repotrack $i-7.10.1 -p 7;done
命令跑完之后,可以在本地看到缓存下来的 RPM 包。
# 3,上传到私服
想要缓存的包已经有了之后,就可以通过命令将包批量传到私服了:
$ cd 7
$ for i in `ls`;do curl -v --user 'admin:admin' --upload-file $i http://nexus.test.com/repository/wpt-yum-local/7/os/x86_64/Packages/$i;done
2
注意
:在 local 这个块儿的 path 后边加了个 7/os/x86_64/Packages
,是为了与 group 缓存的 path 对齐,从而在客户端检索的时候能够直接使用。
# 4,正式应用
私服已经有了 RPM 包,这个时候找一台客户端主机,可以清空他的 repo 配置文件:
$ cd /etc/yum.repos.d
$ mkdir bak && mv * bak
2
添加如下一个配置文件:
$ cat >> /etc/yum.repos.d/nexus.repo << 'EOF'
[nexus]
name=Nexus Repository
baseurl=http://nexus.test.com/repository/yum/$releasever/os/$basearch/
enabled=1
gpgcheck=0
[nexus-local]
name=Nexus Repository
baseurl=http://nexus.test.com/repository/wpt-yum-local/
enabled=1
gpgcheck=0
EOF
2
3
4
5
6
7
8
9
10
11
12
13
如上配置将 group 和 local 分别写在配置文件,可实现内外两种包都能无忧下载并安装。
如上配置搞定之后,来两步常规的构建缓存动作:
$ yum clean all
$ yum makecache
2
缓存构建完毕,这个时候可以简单查看一下源里的包:
$ yum list |grep elasticsearch
elasticsearch.x86_64 7.14.0-1 nexus-local
2
此时可以看到这个包是在nexus-local
这个源里,那么再进行安装 elk 的包就直接走本地私服的 yum 源了。
如上姿势是拿这种标准下的包进行举例,与此雷同的还有诸如 remi 源同样可以利用此方式转移到本地私服,但是还有一些比如 gitlab,或者 grafana 这种的,默认通过 yum 源只能安装最新版本,而无法拿到之前的历史版本,这种时候可以直接下载对应版本的 rpm 包,直接 curl 上传到私服仓库即可。
# 5,报错汇总
在配置之后,将私服配置推广到了所有服务器,过程中遇到了一些报错,这里记录一波。
# 1,yum 命令无法执行
只要一执行命令,就报如下错误:
$ yum clean
error: rpmdb: BDB0113 Thread/process 19126/139888834549824 failed: BDB1507 Thread died in Berkeley DB library
error: db5 error(-30973) from dbenv->failchk: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery
error: cannot open Packages index using db5 - (-30973)
error: cannot open Packages database in /var/lib/rpm
CRITICAL:yum.main:
Error: rpmdb open failed
2
3
4
5
6
7
8
解决办法:
$ rm -rf /var/lib/rpm/__db.*
$ yum clean all && yum makecache
2
# 2,安装软件的报错
在安装软件的时候,报如下错误:
Error: Multilib version problems found. This often means that the root
cause is something else and multilib version checking is just
pointing out that there is a problem. Eg.:
1. You have an upgrade for libuuid which is missing some
dependency that another package requires. Yum is trying to
solve this by installing an older version of libuuid of the
different architecture. If you exclude the bad architecture
yum will tell you what the root cause is (which package
requires what). You can try redoing the upgrade with
--exclude libuuid.otherarch ... this should give you an error
message showing the root cause of the problem.
2. You have multiple architectures of libuuid installed, but
yum can only see an upgrade for one of those architectures.
If you don't want/need both architectures anymore then you
can remove the one with the missing update and everything
will work.
3. You have duplicate versions of libuuid installed already.
You can use "yum check" to get yum show these errors.
...you can also use --setopt=protected_multilib=false to remove
this checking, however this is almost never the correct thing to
do as something else is very likely to go wrong (often causing
much more problems).
Protected multilib versions: libuuid-2.23.2-65.el7.i686 != libuuid-2.23.2-65.el7_9.1.x86_64
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
那么在安装的时候加上提示的参数即可解决此问题:
$ yum install openresty --setopt=protected_multilib=false