Pulp 是一款开源的仓库管理工具,可以帮助您在组织内部获取、镜像、上传和发布内容。它可以用于管理各种类型的内容,例如软件包(从 RPM 包到 Ruby gems)、Ansible 集合、容器镜像,甚至任意文件。
一个典型的工作流程从从现有仓库(例如,http://mirror.centos.org/centos/7/os/x86_64/)获取软件包或手动添加软件包(对于组织内部构建的私有软件包)开始。然后,Pulp 帮助您创建可供客户端使用的任意软件包集合。有了它,您可以
- 控制消费者可用的内容
- 可以使用版本控制
- 通过提供本地、去重的数据源,减少带宽和存储需求
如果您是 Pulp 的新手,请阅读 Melanie Corr 撰写的关于如何使用 Pulp 管理您的软件仓库的介绍性文章。
使用 Pulp 管理 Debian 软件包
Pulp 依赖插件来充分处理不同类型的内容。例如,Pulp RPM 插件使您能够管理 .rpm 软件包。借助 Pulp Debian 插件,您可以在 APT 仓库中镜像、同步、上传和发布 .deb 软件包。如果您想管理和提供可供 Linux 发行版(如 Debian 和 Ubuntu)使用的软件包,pulp_deb 插件是必不可少的,它是 Pulp 社区提供和维护的免费开源软件。
借助 Pulp Debian 插件,您可以通过同步远程仓库、提供上传您自己内容的接口以及将内容发布到仓库来管理 Debian 内容。
Pulp 支持几种不同的 Debian 内容类型,包括软件包、软件包索引、Release 文件等等。“内容类型”指的是特定的工件或元数据。例如,类型为 package
的内容单元指的是 .deb 软件包。
同步远程仓库是 Pulp Debian 插件的主要功能之一,也是获取内容的方式之一。同步过程使用远程定义,其中包含 URL、发行版、组件和架构
- URL 是远程 APT 仓库的路径。
- 发行版是 APT 仓库的
dists/
目录和相关的Release
文件之间的路径。这通常(但不总是)是基于 Debian 的 Linux 发行版的代码名称或套件(Debian 10 的buster
,Debian 9 的stretch
,Ubuntu 20.04 的focal
等)。在任何 Debian 或 Ubuntu 主机上运行lsb_release -cs
都会显示发行版的代码名称。 - 组件描述仓库的任意子集(Debian 的
main
、contrib
或non-free
,或者 Ubuntu 的main
、restricted
、universe
和multiverse
)。您可以使用它来过滤和分类 APT 仓库中的软件包。 - 架构指的是软件包可以运行的处理器架构,最常见的是
i386
、amd64
或arm64
。如果软件包不依赖于特定的处理器架构,则可以将架构设置为all
。
指定发行版是强制性的,而定义组件和架构是可选的。如果未定义,Pulp 会自动同步所有软件包,而不会按组件或架构进行过滤。如果相应的 GPG 公钥已分配给远程仓库,Pulp 会自动验证 Release
文件的 GNU Privacy Guard 签名。
示例工作流程
使用 Pulp 的 REST API,可以轻松地从远程仓库转到逐字发布。以下 API 调用假设您正在使用 HTTPie。
假设您想向组织内的主机提供 .deb 软件包。以下基本工作流程指导您使用 Pulp 和 Pulp Debian 插件的初步步骤。

图片来源:Maximilian Kolb
1. 创建本地仓库
首先通过单个 API 调用在 Pulp 中创建一个本地仓库。您可以使用 HTTPie 或 curl 命令来完成此操作
http post http://<hostname>:24817/pulp/api/v3/repositories/deb/apt/ name=<name_of_your_repository>
2. 创建远程仓库
接下来,创建一个远程仓库。此 API 调用需要 URL 和任意 name
值。定义发行版和架构是可选的
http post http://<hostname>:24817/pulp/api/v3/remotes/deb/apt/ name="nginx.org" url="https://nginx.ac.cn/packages/debian" distributions="buster"
无论您只定义一个还是多个发行版,Pulp 稍后都将同步所有架构的软件包,因为这些架构对于此远程仓库是未定义的。
3. 同步
将远程内容获取到 Pulp 的第三个也是最后一个步骤是将远程仓库同步到您的本地仓库。您可以通过调用仓库的同步 API 端点来完成此操作
http post http://<hostname>:24817/pulp/api/v3/repositories/deb/apt/<uuid_repository>/sync/ remote=http://<hostname>:24817/pulp/api/v3/remotes/deb/apt/<uuid_remote>/
在此示例命令中,每个 UUID 都指的是 Pulp 的内部引用,API 将其显示为 pulp_href
。此步骤可能需要一些时间,具体取决于您的环境、仓库的大小和可用的带宽。
让您的 Pulp 内容可供使用
通过同步为 Pulp 获取内容后,客户端就可以使用它了。
1. 创建发布
发布总是基于 Pulp 仓库。它们包含关于如何发布内容的额外设置。您可以在任何包含 .deb 软件包的 APT 类型仓库上使用 APT
发布器。
以下 API 调用以逐字模式创建发布。也就是说,它提供与远程仓库完全相同的结构和内容
http post http://<hostname>:24817/pulp/api/v3/publications/deb/verbatim/ repository=/pulp/api/v3/repositories/deb/apt/<uuid_repository>/
将 UUID 替换为您要发布的仓库。此步骤可能需要一些时间,具体取决于仓库的大小。
2. 创建分发
分发采用已完成的发布,并通过 Pulp 内容应用提供服务,这使得您的用户可以使用它(或“可使用”)。在 Debian 系统的上下文中,这意味着可以将仓库添加到 /etc/apt/sources.list
中,并用作安装软件的方式。
以下 API 调用需要第一步中创建的发布的 UUID
http post http://<hostname>:24817/pulp/api/v3/distributions/deb/apt/ name="name_of_the_distribution" base_path="base_path_of_the_distribution" publication=http://<hostname>:24817/pulp/api/v3/publications/deb/verbatim/<uuid_publication>/
base_path
值是客户端引用 APT 仓库时使用的 URL 的一部分,名称可以是任意的。在特定的已发布分发上调用分发的 API 端点会返回 Pulp 仓库的 URL
http get http://<hostname>:24817/pulp/api/v3/distributions/deb/apt/<uuid_distribution>/
此 URL 可以直接供 APT 客户端使用。现在可以将其添加到 /etc/apt/sources.list
中作为有效的仓库。
Pulp API
使用这些 API 调用,您可以将 APT 仓库同步到您自己的 Pulp 实例并逐字重新发布它,而无需触及软件包、任何元数据或签名。有关更多信息和其他发布模式,请参阅 API 文档 和 功能概述。
开源的灵活性
Pulp 及其插件结构的一个重要方面是它非常灵活,这在很大程度上归功于其开源性质。您可以将 Pulp 作为独立服务运行,但这不是必须的。它可以集成到更大的系统中。
我在 ATIX 工作,在那里我们已经开始在一个名为 orcharhino 的项目中使用 Pulp 和 Pulp Debian 插件。它基于 Foreman,并包括功能强大的 Katello 插件,用于额外的内容管理功能,Katello 插件本身依赖于 Pulp 进行仓库管理。有了这个,我们已经能够通过自动化系统部署、配置管理和补丁管理来管理我们的数据中心。
换句话说,ATIX 开发 Pulp Debian 插件主要是考虑到 Katello 用例。无论您需要 Katello 还是 Pulp,或者只是特定的 Pulp 插件,您都可以放心,这种模块化是经过设计的。
使用 Pulp,您可以镜像远程软件仓库、托管私有软件包,并在一个平台上管理不同类型的内容。
立即试用 Pulp 和 Pulp Debian 插件,不要害怕加入并向社区寻求帮助。我们欢迎任何和所有反馈。
评论已关闭。