想着能不能把二进制部署方式做的更简洁一些,所以制作了一个rpm包。
本次实验的主角是node_exporter
原本的node_exporter
是二进制方式部署,部署步骤大概是:
下载——》创建工作目录——》解压到工作目录——》创建系统启动文件——》启动
创建系统文件是方便管理和进行开机自动启动程序
我把它做成rpm包是想实现更方便:
下载——》安装——》启动
或者说如果把rpm包提前放到本地仓库,可以实现:
安装——》启动
不过到了最后好像与预期有一点出入,下面是具体实现过程:
实验环境:Rocky Linux 9.2
二进制软件包:node_exporter-1.7.0.linux-amd64.tar.gz
第一步:安装必要的工具
在 Rocky Linux 上,你需要安装 rpm-build 和一些其他工具来制作 RPM 包,有可能这些工具本身就是存在的:
dnf install rpm-build rpmdevtools -y
第二步:设置RPM构建环境
使用 rpmdev-setuptree 创建一个构建目录结构在你的家目录中:
rpmdev-setuptree
它看起来是这样的:
rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
第三步:准备源文件
将你的node_exporter-1.7.0.linux-amd64.tar.gz
文件放入 ~/rpmbuild/SOURCES
目录中。
再创建一个node_exporter.service
为制作好rpm包后管理做准备
├── SOURCES
│ ├── node_exporter-1.7.0.linux-amd64.tar.gz
│ └── node_exporter.service
下面这个就是node_exporter.service
的文件内容
[Unit]
Description=node_exporter
Documentation=https:// prometheus.io/
After=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
第四步:创建 RPM spec 文件
在~/rpmbuild/SPECS
目录下创建一个名为node_exporter.spec
的文件。文件的内容就是构建rpm包的流程,文件内容具体的解析会放到最后说明。
注:一定要先看解析,不然可能会报错
├── SPECS
│ └── node_exporter.spec
Name: node_exporter
Version: 1.7.0
Release: 1%{?dist}
Summary: Prometheus Node Exporter
License: ASL 2.0
URL: https://prometheus.io/
Source0: %{name}-%{version}.linux-amd64.tar.gz
# BuildArch: noarch
Requires: libc.so.6
%description
Prometheus Node Exporter for hardware and OS metrics exposed by *NIX kernels.
%prep
%setup -q -n %{name}-%{version}.linux-amd64
%install
mkdir -p %{buildroot}/usr/local/bin
install -p -m 755 node_exporter %{buildroot}/usr/local/bin/node_exporter
mkdir -p %{buildroot}/usr/lib/systemd/system
install -m 644 %{_sourcedir}/node_exporter.service %{buildroot}/usr/lib/systemd/system/node_exporter.service
%files
%license LICENSE
%doc NOTICE
/usr/local/bin/node_exporter
/usr/lib/systemd/system/node_exporter.service
%changelog
* Fri Apr 12 2024 yyang 542585876@qq.com - 1.7.0-1
- First RPM release of node_exporter
第五步:构建RPM包
运行以下命令来构建 RPM 包,ba
表示先构建源代码包,然后使用这些源代码来构建二进制包
rpmbuild -ba ~/rpmbuild/SPECS/node_exporter.spec
第六步:安装rpm包
构建完成后,你可以在 ~/rpmbuild/RPMS/x86_64 目录找到 RPM 包。使用以下命令安装它:
dnf install ~/rpmbuild/RPMS/x86_64/node_exporter-1.7.0-1.el9.x86_64.rpm
注意:
如果是联网环境,安装rpm包时会自动安装需要的依赖,直到安装完成,就可以使用systemctl start node_exporter
启动服务了。
————————————————————————————
————————————————————————————
但是如果你需要把这个包转移到一个离线的环境中去运行,那还需要进行一些必要的步骤。
第七步:下载依赖包
下面命令安装却不执行可以看出需要哪些依赖项
[root@localhost data]# dnf install node_exporter-1.7.0-1.el9.x86_64.rpm
=====================================================================================================
软件包 架构 版本 仓库 大小
=====================================================================================================
安装:
node_exporter x86_64 1.7.0-1.el9 @commandline 4.4 M
安装依赖关系:
glibc i686 2.34-83.el9.12 baseos 1.9 M
glibc-gconv-extra i686 2.34-83.el9.12 baseos 1.6 M
libgcc i686 11.4.1-2.1.el9 baseos 104 k
然后将这些依赖包下载存放到指定目录中,我把它存放到了/data
目录下
dnf install --downloadonly --destdir=/data glibc.i686 glibc-gconv-extra.i686 libgcc.i686
如果依赖包太多的话可以使用下面这条命令,推荐使用下面这条命令
dnf download --resolve --downloaddir=/data/ node_exporter-1.7.0-1.el9.x86_64.rpm
第八步:离线安装node_exporter.rpm包
我们把依赖包都存放到了/data
目录下,然后把node_exporter-1.7.0-1.el9.x86_64.rpm
也放进入然后打成包传到需要安装的节点上解压后执行即可:
[root@localhost data]# ls
glibc-2.34-83.el9.12.i686.rpm libgcc-11.4.1-2.1.el9.i686.rpm
glibc-gconv-extra-2.34-83.el9.12.i686.rpm node_exporter-1.7.0-1.el9.x86_64.rpm
[root@localhost data]# dnf localinstall ./*
这只是其中一种方法,如果有本地软件仓库的话就更好了,把这几个包直接上传到软件仓库中直接实现安装——》启动
的流程。
————————————————————————————
下面说一下node_exporter.spec
文件的内容
# 定义软件的名称
Name: node_exporter
# 定义软件的版本
Version: 1.7.0
# 定义软件的发行版
Release: 1%{?dist}
# 描述,自定义写即可
Summary: Prometheus Node Exporter
# 软件包的许可证类型
License: ASL 2.0
# 软件包的官方网站或主页
URL: https://prometheus.io/
# 软件包的源代码或二进制文件的位置。
# %{name}和%{version}是宏,它们会被替换为前面定义的软件包名称和版本。
Source0: %{name}-%{version}.linux-amd64.tar.gz
# 这部分是关于软件包的描述作用
%description
Prometheus Node Exporter for hardware and OS metrics exposed by *NIX kernels.
# 标记这一部分是准备阶段
%prep
# 用于解压源代码包。-q选项表示静默模式,即不显示解压过程中的输出。-n选项后面跟的是解压后的目录名
%setup -q -n %{name}-%{version}.linux-amd64
# 定义了如何安装软件包的内容
%install
# 创建目录
mkdir -p %{buildroot}/usr/local/bin
# 将node_exporter文件安装到指定位置
install -p -m 755 node_exporter %{buildroot}/usr/local/bin/node_exporter
# 创建目录
mkdir -p %{buildroot}/usr/lib/systemd/system
# 将node_exporter.service安装到指定位置
install -m 644 %{_sourcedir}/node_exporter.service %{buildroot}/usr/lib/systemd/system/node_exporter.service
定义了软件包应该包含哪些文件
%files
# 包含LICENSE文件作为软件包的许可证文件
%license LICENSE
# 包含NOTICE文件作为软件包的文档
%doc NOTICE
/usr/local/bin/node_exporter
/usr/lib/systemd/system/node_exporter.service
# 这一行标记着变更日志的开始
%changelog
# 代表日期、变更人和邮件及发行版本
* Fri Apr 12 2024 yyang 542585876@qq.com - 1.7.0-1
# 变更的具体描述
- First RPM release of node_exporter