news 2026/9/23 3:55:21

Salt 包管理器 spm 命令完全指南:从包构建、仓库管理到安装卸载的 CLI 实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Salt 包管理器 spm 命令完全指南:从包构建、仓库管理到安装卸载的 CLI 实战
  • 运维
  • 配置管理
  • 后端

【免费下载链接】salt

Software to automate the management and configuration of infrastructure and applications at scale.

项目地址:https://gitcode.com/gh_mirrors/sa/salt
点击查看免费下载

spm(Salt Package Manager)是 Salt 官方提供的包管理前端命令,用于将 Salt formula(一组 SLS 文件)以及 Salt 模块打包、分发并在 Salt Master 上安装管理。本文将基于仓库中的官方 CLI 参考文档(doc/ref/cli/spm.rst),结合源码(salt/spm/init.py、salt/cli/spm.py)与配置实现(salt/config/init.py),完整讲解spm的每个子命令、命令行选项、FORMULA 打包规范与仓库配置方法。读完本文,你将掌握从零构建一个.spm包、搭建并更新 SPM 仓库、在 Salt Master 上安装/查询/卸载包的完整实战流程,并理解其底层实现原理。

spm 命令概览

Synopsis(语法)

spm <command> [<argument>]

spm是管理 Salt 包的前端命令。包通常只包含 formula(即一组安装到 Salt Masterfile_roots中的 SLS 文件),但 Salt 模块(Salt modules)也可以被打包安装。SPM 的设计受到了 RPM、Yum、Pacman 等既有打包系统的影响(见 doc/topics/spm/index.rst),因此其命令风格与这些传统包管理器高度一致。

入口与实现

从源码看,spm命令的 CLI 解析入口位于 salt/cli/spm.py(版本自 2015.8.0 起引入):

ui = salt.spm.SPMCmdlineInterface() self.parse_args() ... client = salt.spm.SPMClient(ui, self.config) client.run(self.args)

命令行参数解析完成后,会实例化SPMClient并调用其run()方法分发命令。run()方法(salt/spm/init.py)维护了一个命令分发表:installlocalremovebuildupdate_repocreate_repofilesinfolist等命令都会被路由到对应的_install_build_remove等内部方法;遇到未识别的命令则抛出SPMInvocationError("Invalid command ...")

全局选项(Options)

spm支持以下通用命令行选项:

选项说明
-y, --assume-yes对特定命令的交互式确认提示直接回答 "yes",不再询问用户。默认值为 False。
-f, --force强制执行为spm正常情况下会拒绝执行的操作。该操作通常具有破坏性,请谨慎使用。
--logfile日志文件位置,默认/var/log/salt/spm
--loglevel日志级别,默认warning

选项的底层行为

  • --assume-yes对应配置项assume_yes。在安装(_install)和卸载(_remove)流程中,如果assume_yes为 False,会通过SPMCmdlineInterface.confirm()打印操作内容并提示Proceed? [N/y],只有输入以y开头的确认才会继续,否则抛出SPMOperationCanceled取消操作(见 salt/spm/init.py)。
  • --force对应配置项force。它有两个关键作用:其一,在依赖检查阶段(_check_all_deps),如果包已经安装且未加--force,会抛出SPMPackageError拒绝重复安装;加--force后则允许强制覆盖安装。其二,安装时若目标路径存在同名文件(check_existing检测),不加--force会拒绝安装,加--force才会继续。

子命令详解(Commands)

update_repo:更新仓库元数据

连接到系统本地配置的远程仓库,下载它们的元数据(SPM-METADATA文件)。

spm update_repo

从源码实现看(salt/spm/init.py),该命令遍历spm_repos_config(默认/etc/salt/spm.repos)及其.d目录下的所有*.repo文件,对每个启用的仓库执行元数据下载:file://协议直接读取本地文件,http(s) 协议则通过salt.utils.http.query()拉取{url}/SPM-METADATA,随后将结果缓存到spm_cache_dir(默认/var/cache/salt/spm)。支持只更新指定仓库:spm update_repo <repo_name>

install:从仓库安装包

从已配置的 SPM 仓库安装一个包,必须指定包名:

spm install apache

安装流程(salt/spm/init.py)大致如下:

  1. 依赖检查:对目标包调用_check_all_deps递归解析dependencies(必需)、optional(可选)和recommended(推荐)依赖,并打印可选/推荐依赖信息;必需依赖若在仓库中不可得,会直接拒绝安装。
  2. 确认提示:非-y模式下打印待安装包列表并请求确认。
  3. 下载:遍历仓库元数据,根据版本号(version)与发布号(release)选出最新版本,下载到spm_cache_dir下的对应缓存目录(支持file://本地复制与 http(s) 下载,http(s) 仓库可配置 Basic Auth 用户名/密码)。
  4. 安装:解包 BZ2 压缩的 tarball,先做已存在文件检查,再注册包信息到包数据库,最后按文件成员逐一落盘并记录 SHA1 校验值。

需要注意:当前 SPM 安装前不会检查目标文件是否已存在,已有文件会被直接覆盖而不警告(官方文档明确提示,见 doc/topics/spm/master.rst)。

remove:卸载已安装的包

从系统中移除一个已安装的包,必须指定包名:

spm remove apache

卸载逻辑(salt/spm/init.py)很谨慎:对于包注册的每个文件,先计算当前 SHA1 摘要与安装时记录的摘要比对,只有未被修改过的文件才会被删除;被修改过的文件保留在原位。删除完成后清理空目录,并从包数据库中注销文件与包记录。官方文档还提示:空目录也会一并移除。

info:查看已安装包的信息

列出某个已安装包的详细信息,必须指定包名:

spm info apache

输出字段(由 salt/spm/init.py 中的_get_info生成)包括:NameVersionReleaseInstall DateSupported OSes(os)、Supported OS families(os_family)、DependenciesOS DependenciesOS Family DependenciesSummaryDescription。这些信息均来自包的 FORMULA 文件定义;若包未安装,会抛出SPMPackageError("package ... not installed")

files:列出已安装包的文件清单

列出某个已安装包所拥有的全部文件,必须指定包名:

spm files apache

该命令查询包数据库(默认 SQLite 库/var/cache/salt/spm/packages.db)中该包的list_files记录并逐行输出。加--verbose时可同时输出每条记录的全部字段(文件路径与摘要等,逗号分隔)。

local:直接操作本地包文件

在本地包文件上执行上述部分操作(installfilesinfo;不支持remove),而不是操作仓库中的包或已安装的包。必须指定系统上一个有效的本地文件路径:

spm local install /srv/spm/apache-201506-1.spm spm local info /srv/spm/apache-201506-1.spm spm local files /srv/spm/apache-201506-1.spm

spm local install不依赖任何已配置的 SPM 仓库(见 doc/topics/spm/master.rst 中的spm-master-local章节)。其实现(salt/spm/init.py)先弹出local参数再分发到_local_install_local_list_files_local_info;包名从文件名推导(按-切分后去掉末尾的version-release段)。注意:local infolocal files直接读取包文件内的 FORMULA 与成员列表,无需安装。

build:从 FORMULA 目录构建包

从包含FORMULA文件的目录构建一个.spm包,必须指定系统上一个有效的本地目录路径:

spm build /path/to/saltstack-formulas/apache-formula

构建逻辑(salt/spm/init.py)要点:

  • 目标目录下必须存在FORMULA文件,且其中必须定义nameversionreleasesummarydescription五个必填字段,否则抛出SPMPackageError
  • 生成的包文件名为{name}-{version}-{release}.spm,输出到spm_build_dir(默认/srv/spm_build,与官方文档 doc/topics/spm/config.rst 一致;注意文档中另有一处提到/srv/spm/为构建输出目录的表述)。
  • 包格式为 BZ2 压缩的 tarball(tarfile.open(out_path, "w:bz2"))。
  • 若 FORMULA 声明了files列表,则只打包列出的文件并按声明顺序写入;否则将整个公式目录加入包中,但会依据spm_build_exclude(默认排除CVS.hg.git.svn,见 salt/config/init.py)过滤排除项。

create_repo:为目录生成仓库元数据

扫描一个目录中的全部合法.spm包文件,并在该目录下生成描述它们的SPM-METADATA文件:

spm create_repo /srv/spm_build

实现细节(salt/spm/init.py):

  • 递归扫描目录下所有.spm结尾且tarfile.is_tarfile()校验通过的文件,读取每个包内的 FORMULA。
  • 若同一包存在多个版本/发布,只保留最新版本(比较versionrelease),旧文件的处理策略由spm_repo_dups配置决定:ignore(默认,留在原地)、archive(移入./archive/)或delete(删除)。
  • 最终把所有包信息以 YAML 格式写入{repo_path}/SPM-METADATA

该命令即使目录中已存在元数据也照常执行(用于每次新增/更新包后重新生成)。

配套知识:FORMULA 文件规范

要使用spm build成功打包,公式目录根部必须有一个FORMULA文件(YAML 格式)。下面是最小示例(源自 doc/topics/spm/spm_formula.rst):

name: apache os: RedHat, Debian, Ubuntu, SUSE, FreeBSD os_family: RedHat, Debian, Suse, FreeBSD version: 201506 release: 2 summary: Formula for installing Apache description: Formula for installing Apache

必填字段

字段说明
name包名,会出现在包文件名、仓库元数据与包数据库中。即使源公式叫apache-formula,建议也命名为apache
os该公式支持的osgrain 值,帮助用户判断适用系统。
os_family该公式支持的os_familygrain 值。
version包版本,建议采用YYYYMM格式(如 2015 年 6 月发布则为201506);一个月内多次发布时用release区分。
release发布号,主要用于同一版本的修订(版本公开后需要立即更新时递增)。
summary一行包描述。
description更详细的包描述,可多行。

另有minimum_version字段(建议的最小 Salt 版本,当前不强制校验)。

可选字段

  • top_level_dir:官方推荐设置。公式仓库通常把.sls文件放在子目录(如apache/),此字段指定该子目录名;不设置则默认用包名。top_level_dir之外的文件(如README.rstLICENSE)不会安装,pillar.example_modules/等特殊文件除外。
  • dependencies:逗号分隔的必装依赖包列表。安装时 SPM 会尝试一并解析安装;解析不到则拒绝安装。适用于创建聚合包(如wordpress-mariadb-apache依赖 wordpress、mariadb、apache)。
  • optional:逗号分隔的相关可选包列表,安装时仅作信息提示。
  • recommended:逗号分隔的推荐可选包列表,安装时仅作信息提示。
  • files:显式指定打包文件清单,按声明顺序添加;也可用类型|文件名前缀给文件打类型标签:
files: - _pillar - FORMULA - _runners - d|mymodule/index.rst - r|README.rst

可用文件类型标签(定义于 salt/spm/init.py):c配置文件、d文档文件、g幽灵文件(内容不打包进 payload)、l许可文件、rreadme 文件、sSLS 文件、mSalt 模块。其中c/d/g/l/r五类默认安装到/usr/share/salt/spm/(可通过spm_share_dir配置修改);sm目前被忽略,保留供未来使用。

pre / post 状态钩子

FORMULA 可声明pre_local_statepre_tgt_statepost_local_statepost_tgt_state四类钩子,分别在安装前/安装后执行 Salt 状态(local在运行spm的本机以salt-call --local语义执行;tgtsalt命令语义对远程目标下发,要求本机为 Master)。这些状态以文本形式声明(需在>折叠标记后编写),并会先经渲染引擎处理,因此可直接在状态内使用 Jinja 引用 FORMULA 变量,例如:

pre_tgt_state: tgt: '*' data: > echo {{ name }} > /tmp/spmtest: cmd: - run

tgt钩子可用tgt_type指定匹配类型(默认glob)。渲染器默认jinja|yaml,可在 FORMULA 中用renderer字段覆盖(实现见 salt/spm/init.py 的_render方法)。

包类型约定

SPM 依据包名后缀区分类型(见 doc/topics/spm/config.rst):

  • -formula(最常见,无后缀也按此处理):多数文件安装到/srv/spm/salt/pillar.example会重命名为<包名>.sls并放入 pillar 目录(默认/srv/spm/pillar/)。
  • -reactor:文件安装到/srv/spm/reactor/
  • -conf:Salt 自身的配置文件,安装到/etc/salt/目录;其他软件的配置请用-formula类型的状态来管理。

配套知识:仓库配置与安装流程

配置 SPM 仓库

在 Salt Master 上,每个仓库在/etc/salt/spm.repos.d/spm.repo文件中配置(该配置也会读取/etc/salt/spm.repos主文件及其.d目录下所有*.repo,见 salt/spm/init.py):

my_repo: url: https://spm.example.com/
  • URL 支持httphttpsftpfile四种协议,例如url: file:///srv/spm_build
  • 需要 HTTP/HTTPS Basic 认证时可追加usernamepassword字段(源码_query_http要求二者同时提供,缺密码会报错)。官方提醒:该文件含认证凭据,至少应设置0640权限以防未授权访问。
  • 仓库的enabled: false可临时停用某个仓库。

更新元数据与安装

配置完成后,先拉取元数据:

spm update_repo

每个仓库的元数据缓存文件会出现在/var/cache/salt/spm下——官方提示,若新增仓库后spm install看不到包,可先检查此路径确认仓库元数据是否已成功下载。

随后即可安装:

spm install apache

将安装目录加入 file_roots

SPM 包默认安装到/srv/spm/salt(以及/srv/spm/pillar等目录),这些路径需要手动加入 Salt Master 的file_roots才能被 minion 使用:

file_roots: base: - /srv/salt - /srv/spm/salt

修改后重启 salt-master 服务生效。若安装的包包含 Pillar 数据,还需在 pillar Top file 中把对应 pillar 定向到目标 minion。

卸载

spm remove apache

如上文所述,被修改过的文件不会被删除,空目录也会被清理。

配套知识:SPM 配置项与底层机制

SPM 的配置可在 Master 配置文件或 SPM 自己的配置文件(默认/etc/salt/spm)中设置,spm文件优先。核心配置项及其默认值(源码位于 salt/config/init.py):

配置项默认值说明
spm_logfile/var/log/salt/spmSPM 日志文件位置。
spm_repos_config/etc/salt/spm.repos仓库配置主文件,同时存在对应的.d目录(/etc/salt/spm.repos.d/)。
spm_cache_dir/var/cache/salt/spm仓库元数据与下载的包文件缓存目录;包数据库packages.db也在此。
spm_db/var/cache/salt/spm/packages.db包数据库路径,记录已安装包、所属文件及文件元数据。
spm_build_dir/srv/spm_buildspm build输出目录。
spm_build_exclude['CVS', '.hg', '.git', '.svn']构建时排除的文件列表(需以列表形式配置,如- .git- .svn)。
spm_repo_dupsignore仓库中存在重复包版本时的处理策略(ignore/archive/delete)。
spm_share_dir/usr/share/salt/spmc/d/g/l/r类型标签文件的默认安装目录。
formula_path/pillar_path/reactor_path见 syspaths分别对应 formula、pillar、reactor 三类包的安装根目录。

可插拔的存储后端

SPM 的两个存储环节均设计为可插拔模块(loader 机制):

  • 包数据库:默认使用sqlite3驱动(spm_db_provider,实现于 salt/spm/pkgdb/sqlite3.py),因为 SQLite 内置于 Python,无需外部依赖。
  • 包文件安装:默认使用local模块(spm_files_provider,实现于 salt/spm/pkgfiles/local.py),将文件应用到本机文件系统。

SPMClient 在初始化时通过salt.loader.pkgdb()salt.loader.pkgfiles()加载对应模块(salt/spm/init.py)。此外,包格式统一为 BZ2 压缩 tarball,元数据与配置文件统一使用 YAML,全部依赖内置于 Python 标准库。

实战示例:完整走通「构建 → 建仓 → 安装 → 查询 → 卸载」

假设你在/srv/formulas/apache-formula/下有一个公式,且已写好FORMULA文件(含name: apacheversion: 201506release: 2等必填字段):

# 1. 构建 .spm 包(输出到默认构建目录 /srv/spm_build/) spm build /srv/formulas/apache-formula # 生成 /srv/spm_build/apache-201506-2.spm # 2. 用该目录作为仓库,生成元数据(每次新增/更新包后重跑) spm create_repo /srv/spm_build # 生成 /srv/spm_build/SPM-METADATA # 3. 在 Salt Master 上配置仓库 /etc/salt/spm.repos.d/spm.repo: # my_repo: # url: file:///srv/spm_build # 然后刷新元数据 spm update_repo # 4. 安装包 spm install apache # 5. 查询 spm info apache # 查看包元信息 spm files apache # 列出包拥有的文件 spm list packages # 列出已安装的所有包 # 6. 也可以不经仓库直接安装本地包文件 spm local install /srv/spm_build/apache-201506-2.spm # 7. 卸载(被修改过的文件会保留) spm remove apache

最后别忘了把/srv/spm/salt加入file_roots并重启 salt-master,否则 minion 无法通过文件服务器获取到 formula。

参考链接

  • CLI 参考:spm命令官方文档(doc/ref/cli/spm.rst)
  • SPM 总览与打包/仓库/安装专题:doc/topics/spm/index.rst、doc/topics/spm/spm_formula.rst、doc/topics/spm/repo.rst、doc/topics/spm/master.rst、doc/topics/spm/config.rst
  • 核心实现:salt/spm/init.py(SPMClient 与全部子命令逻辑)、salt/cli/spm.py(CLI 入口)
  • 存储后端:salt/spm/pkgdb/sqlite3.py、salt/spm/pkgfiles/local.py
  • 默认配置:salt/config/init.py(DEFAULT_SPM_OPTS
  • 运维
  • 配置管理
  • 后端

【免费下载链接】salt

Software to automate the management and configuration of infrastructure and applications at scale.

项目地址:https://gitcode.com/gh_mirrors/sa/salt
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/23 3:48:47

CTF入门三个月实战路线图:从零基础到独立完赛

1. 先定个现实的目标&#xff1a;三个月后你该会什么&#xff0c;不该会什么1.1 三个月的目标不是“拿奖”&#xff0c;而是“独立完赛”CTF&#xff08;Capture The Flag&#xff0c;夺旗赛&#xff09;这几年在网络安全圈子里出现的频率越来越高&#xff0c;很多高校战队、安…

作者头像 李华
网站建设 2026/9/23 3:44:34

拼多多订单同步ERP全流程:API接入、发货回传与异常处理指南

前两天一个做家居百货的朋友问我&#xff1a;拼多多订单同步到ERP系统到底怎么搞&#xff1f;他现在每天下午五点半准时坐在电脑前&#xff0c;登录拼多多商家后台&#xff0c;把当天的新订单一条条复制到Excel&#xff0c;再手动安排打单发货。赶上活动日订单从两三百跳到两三…

作者头像 李华
网站建设 2026/9/23 3:41:03

AIML聊天机器人项目全解析:Tornado后端与前端交互实现

简介&#xff1a;资源提供了一份基于Python与AIML库实现人机对话的技术教程PDF&#xff0c;面向有一定Python基础、正在入门人工智能对话系统的开发者和学生。教程从AIML问答逻辑讲起&#xff0c;说明Richard Wallace设计的A.L.I.C.E.知识库如何工作&#xff0c;并逐步展示如何…

作者头像 李华
网站建设 2026/9/23 3:39:14

JSP+Access手机销售系统毕设实战:环境搭建、数据库落地与避坑指南

简介&#xff1a;这份资源是面向Java Web初学者与课程设计学习者的完整项目资料包&#xff0c;围绕基于JSP与Access数据库的手机销售系统展开&#xff0c;可用于毕业设计参考、课程实践或自学练手。压缩包共2.26MB&#xff0c;内含项目报告、详细设计说明书、需求说明书、数据库…

作者头像 李华
网站建设 2026/9/23 3:38:03

YOLOv5数据集格式详解:从图片到可训练数据的完整流程

简介&#xff1a;针对目标检测算法训练与农业害虫识别应用&#xff0c;该数据集提供YOLOV5标准目录格式的柑橘害虫图像&#xff0c;涵盖苍蝇、木虱两个类别&#xff0c;可直接用于模型训练与精度验证&#xff0c;解决害虫数据标注分散、格式转换繁琐的常见问题。全部图像为1000…

作者头像 李华