- 运维
- 配置管理
- 后端
【免费下载链接】salt
Software to automate the management and configuration of infrastructure and applications at scale.
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)维护了一个命令分发表:install、local、remove、build、update_repo、create_repo、files、info、list等命令都会被路由到对应的_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)大致如下:
- 依赖检查:对目标包调用
_check_all_deps递归解析dependencies(必需)、optional(可选)和recommended(推荐)依赖,并打印可选/推荐依赖信息;必需依赖若在仓库中不可得,会直接拒绝安装。 - 确认提示:非
-y模式下打印待安装包列表并请求确认。 - 下载:遍历仓库元数据,根据版本号(version)与发布号(release)选出最新版本,下载到
spm_cache_dir下的对应缓存目录(支持file://本地复制与 http(s) 下载,http(s) 仓库可配置 Basic Auth 用户名/密码)。 - 安装:解包 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生成)包括:Name、Version、Release、Install Date、Supported OSes(os)、Supported OS families(os_family)、Dependencies、OS Dependencies、OS Family Dependencies、Summary、Description。这些信息均来自包的 FORMULA 文件定义;若包未安装,会抛出SPMPackageError("package ... not installed")。
files:列出已安装包的文件清单
列出某个已安装包所拥有的全部文件,必须指定包名:
spm files apache该命令查询包数据库(默认 SQLite 库/var/cache/salt/spm/packages.db)中该包的list_files记录并逐行输出。加--verbose时可同时输出每条记录的全部字段(文件路径与摘要等,逗号分隔)。
local:直接操作本地包文件
在本地包文件上执行上述部分操作(install、files、info;不支持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.spmspm 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 info与local files直接读取包文件内的 FORMULA 与成员列表,无需安装。
build:从 FORMULA 目录构建包
从包含FORMULA文件的目录构建一个.spm包,必须指定系统上一个有效的本地目录路径:
spm build /path/to/saltstack-formulas/apache-formula构建逻辑(salt/spm/init.py)要点:
- 目标目录下必须存在
FORMULA文件,且其中必须定义name、version、release、summary、description五个必填字段,否则抛出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。 - 若同一包存在多个版本/发布,只保留最新版本(比较
version与release),旧文件的处理策略由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.rst、LICENSE)不会安装,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配置修改);s与m目前被忽略,保留供未来使用。
pre / post 状态钩子
FORMULA 可声明pre_local_state、pre_tgt_state、post_local_state、post_tgt_state四类钩子,分别在安装前/安装后执行 Salt 状态(local在运行spm的本机以salt-call --local语义执行;tgt以salt命令语义对远程目标下发,要求本机为 Master)。这些状态以文本形式声明(需在>折叠标记后编写),并会先经渲染引擎处理,因此可直接在状态内使用 Jinja 引用 FORMULA 变量,例如:
pre_tgt_state: tgt: '*' data: > echo {{ name }} > /tmp/spmtest: cmd: - runtgt钩子可用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 支持
http、https、ftp、file四种协议,例如url: file:///srv/spm_build。 - 需要 HTTP/HTTPS Basic 认证时可追加
username与password字段(源码_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/spm | SPM 日志文件位置。 |
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_build | spm build输出目录。 |
spm_build_exclude | ['CVS', '.hg', '.git', '.svn'] | 构建时排除的文件列表(需以列表形式配置,如- .git、- .svn)。 |
spm_repo_dups | ignore | 仓库中存在重复包版本时的处理策略(ignore/archive/delete)。 |
spm_share_dir | /usr/share/salt/spm | c/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: apache、version: 201506、release: 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.
相关推荐
Chocolatey包管理实战:从安装到卸载的完整流程
Chocolatey包管理实战:从安装到卸载的完整流程 Chocolatey是Windows平台上最受欢迎的包管理器,被誉为"Windows的apt get"。
开发工具运维React Native IAP安全最佳实践:如何确保支付数据的安全性和合规性
React Native IAP安全最佳实践:如何确保支付数据的安全性和合规性 React Native IAP(In App Purchase)作为一款强大的
Omarchy 软件包管理实战:从菜单与 `omarchy pkg` CLI 安装、检索到卸载官方仓库与 AUR 软件
Omarchy 软件包管理实战:从菜单与 omarchy pkg CLI 安装、检索到卸载官方仓库与 AUR 软件 本篇指南围绕 manual/29 other
操作系统开发工具AI 应用CLI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考