【2024】将二进制的node_exporter包制作成rpm包

想着能不能把二进制部署方式做的更简洁一些,所以制作了一个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

记住方法即可,可尝试制作其他rpm包

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-13 03:30:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-13 03:30:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-13 03:30:02       82 阅读
  4. Python语言-面向对象

    2024-04-13 03:30:02       91 阅读

热门阅读

  1. 学习笔记-微服务基础(黑马程序员)

    2024-04-13 03:30:02       30 阅读
  2. ORACAL执行计划

    2024-04-13 03:30:02       30 阅读
  3. 在vue3中使用pinia

    2024-04-13 03:30:02       28 阅读
  4. 正则表达式|*+?

    2024-04-13 03:30:02       74 阅读
  5. 深入理解 Golang 中 New() 和 make() 的区别

    2024-04-13 03:30:02       35 阅读
  6. 构建高效运维平台与数据中心可视化方案

    2024-04-13 03:30:02       29 阅读
  7. <网络安全>《72 微课堂<什么是靶场?>》

    2024-04-13 03:30:02       37 阅读
  8. Anaconda的常用指令

    2024-04-13 03:30:02       38 阅读
  9. 桶排序:原理、实现与应用场景详解

    2024-04-13 03:30:02       29 阅读
  10. LeetCode 1. Two Sum

    2024-04-13 03:30:02       37 阅读