尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

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

Salt 包管理器 spm 命令完全指南:从包构建、仓库管理到安装卸载的 CLI 实战 运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载spmSalt 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 ...)。全局选项Optionsspm支持以下通用命令行选项选项说明-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才会继续。子命令详解Commandsupdate_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 OSesos、Supported OS familiesos_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 压缩的 tarballtarfile.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.rstname: 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.pyc配置文件、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/。-confSalt 自身的配置文件安装到/etc/salt/目录其他软件的配置请用-formula类型的状态来管理。配套知识仓库配置与安装流程配置 SPM 仓库在 Salt Master 上每个仓库在/etc/salt/spm.repos.d/spm.repo文件中配置该配置也会读取/etc/salt/spm.repos主文件及其.d目录下所有*.repo见 salt/spm/init.pymy_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_rootsSPM 包默认安装到/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: 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.rstSPM 总览与打包/仓库/安装专题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.pySPMClient 与全部子命令逻辑、salt/cli/spm.pyCLI 入口存储后端salt/spm/pkgdb/sqlite3.py、salt/spm/pkgfiles/local.py默认配置salt/config/init.pyDEFAULT_SPM_OPTS赞分享运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载相关推荐Chocolatey包管理实战从安装到卸载的完整流程Chocolatey包管理实战从安装到卸载的完整流程 Chocolatey是Windows平台上最受欢迎的包管理器被誉为Windows的apt get。开发工具运维React Native IAP安全最佳实践如何确保支付数据的安全性和合规性React Native IAP安全最佳实践如何确保支付数据的安全性和合规性 React Native IAPIn App Purchase作为一款强大的Omarchy 软件包管理实战从菜单与 omarchy pkg CLI 安装、检索到卸载官方仓库与 AUR 软件Omarchy 软件包管理实战从菜单与 omarchy pkg CLI 安装、检索到卸载官方仓库与 AUR 软件 本篇指南围绕 manual/29 other操作系统开发工具AI 应用CLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表