Salt 的 pkgutil 执行模块:基于 OpenCSW 管理 Solaris 软件包全指南

发布时间:2026/9/23 14:03:22
Salt 的 pkgutil 执行模块:基于 OpenCSW 管理 Solaris 软件包全指南 Salt 的 pkgutil 执行模块基于 OpenCSW 管理 Solaris 软件包全指南【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址: https://gitcode.com/gh_mirrors/sa/salt导读本文深入讲解 Salt 中面向 Solaris 操作系统的pkgutil执行模块salt/modules/pkgutil.py。该模块是 Salt 虚拟pkg模块在 Solaris OpenCSW 场景下的具体实现通过调用 OpenCSW 的pkgutil(1)与系统自带的pkginfo(1)完成软件包的刷新、查询、安装、升级与卸载。读完本文你将掌握pkgutil模块的加载条件、全部函数与参数、底层命令映射关系、返回值结构并能直接在 Salt 命令行与 SLS 状态文件中正确使用它管理 Solaris 上的软件包。模块定位pkg 虚拟模块的 Solaris ProviderSalt 的包管理入口是一个名为pkg的虚拟模块用户在命令行或状态文件中写pkg.install、pkg.latest时Salt 的加载器会根据目标系统的特性自动选择真正干活的执行模块。doc/ref/modules/all/salt.modules.pkg.rst 中明确列出pkg虚拟模块由以下模块之一提供其中:py:mod:~salt.modules.pkgutil Solaris-based OSes using OpenCSWs pkgutil(1)也就是说当被管理的主机是基于 Solaris 且使用 OpenCSW 的软件仓库时pkg.xxx系列命令实际由pkgutil模块承接。同属 Solaris 阵营的还有使用pkgadd(1M)的solarispkg模块、使用 IPSpkg(1)的solarisipspkg模块——三者分工不同选择依据是目标主机采用的包工具。加载条件与虚拟名pkgutil模块定义了虚拟名__virtualname__ pkgutil并通过__virtual__()决定是否加载salt/modules/pkgutil.pydef __virtual__(): Set the virtual pkg module if the os is Solaris if __grains__[os_family] Solaris: return __virtualname__ return ( False, The pkgutil execution module cannot be loaded: only available on Solaris systems., )关键点判断依据是 grainos_family Solaris与具体 Solaris 版本无关Solaris 10、11 及 OpenSolaris 衍生系统均适用。当不满足条件时返回(False, 错误说明)模块不会加载此时执行pkg.install会得到类似pkg.install is not available的错误。模块 docstring 特别提醒如果 Salt 没有选择本模块而用了其他模块或报出上述错误可以参考 Salt 文档中的module-provider-override模块提供者覆盖机制在 minion 配置中用providers强制指定pkg由pkgutil提供。底层命令依赖该模块不自行实现包仓库逻辑而是封装了 OpenCSW 环境下的两个外部命令命令用途模块内使用点/opt/csw/bin/pkgutilOpenCSW 包管理工具负责刷新仓库、查询可用/可升级包、安装与升级refresh_db、upgrade_available、list_upgrades、upgrade、latest_version、install、remove/usr/bin/pkginfoSolaris 系统自带命令用于枚举当前已安装的包list_pkgs模块源码对每个函数都给出了对应的底层命令与参数如pkgutil -U、pkgutil -A --parse、pkgutil -yu、pkgutil -yr使用该模块前应确认目标主机已安装 OpenCSW 且/opt/csw/bin下存在pkgutil。仓库数据刷新refresh_dbsalt * pkgutil.refresh_dbrefresh_db 执行/opt/csw/bin/pkgutil -U更新 OpenCSW 仓库数据库返回布尔值表示是否成功def refresh_db(): salt.utils.pkg.clear_rtag(__opts__) return __salt__cmd.retcode 0两个实现细节值得注意通过cmd.retcode判断退出码是否为 0 来确定成功与否调用salt.utils.pkg.clear_rtag(__opts__)清除 Salt 内部的 rtag 标记文件。这是 Salt 包管理体系的通用机制rtag 用于记录最近一次刷新的时间戳避免在同一个 state 运行中多个 state 反复触发仓库刷新。手动调用refresh_db前清除 rtag保证后续pkgstate 中refresh: True的语义仍然成立。在 tests/pytests/unit/modules/test_pkgutil.py 中test_refresh_db同时 mock 了cmd.retcode与clear_rtag来验证这一行为。已安装包清单list_pkgs 与 versionlist_pkgssalt * pkg.list_pkgs salt * pkg.list_pkgs versions_as_listTruelist_pkgs 返回{package_name: version}形式的字典。其数据来源是系统命令/usr/bin/pkginfo -x源码中对此有精妙的解析逻辑salt/modules/pkgutil.py# Package information returned two lines per package. On even-offset # lines, the package name is in the first column. On odd-offset lines, the # package version is in the second column. lines __salt__cmd.run.splitlines() for index, line in enumerate(lines): if index % 2 0: name line.split()[0].strip() if index % 2 1: version_num line.split()[1].strip() __salt__pkg_resource.add_pkg也就是说pkginfo -x每个包输出两行偶数行包名、奇数行版本号模块按行号奇偶配对解析。解析结果通过pkg_resource.add_pkg汇总、pkg_resource.sort_pkglist排序并深拷贝写入__context__[pkg.list_pkgs]缓存。其他行为versions_as_listTrue时返回的每个包版本以列表形式呈现兼容同版本多实例场景removedTrue参数在当前实现中直接返回{}源码注释注明 removed not yet implemented or not applicableuse_context参数控制是否优先读取上下文缓存配合_list_pkgs_from_contextsalt/modules/pkgutil.py避免在同一进程内重复执行pkginfo命令——测试 test_list_pkgs_no_context 专门验证了use_contextFalse时不会调用上下文读取逻辑。versionsalt * pkgutil.version CSWpythonversion 直接委托给pkg_resource.version返回已安装包的版本字符串未安装则返回空字符串。版本查询latest_version 与 upgrade_availablelatest_versionsalt * pkgutil.latest_version CSWpython salt * pkgutil.latest_version package1 package2 package3 ...latest_version 返回指定包当前可安装/可升级的最新版本支持一次传入多个包名返回{name: version}字典只传一个包名时直接返回字符串若包已是最新版本对应返回空字符串refreshTrue默认时先调用refresh_db()底层命令为/opt/csw/bin/pkgutil -a --parse names并对每行输出做健壮性处理ValueError时跳过版本比较使用salt.utils.versions.compare(ver1cver, oper, ver2nver)仅当已装版本低于可用版本时才返回新版本且比较前会去掉version_rev中的修订号split(,)[0]。模块同时提供了一个被标记为废弃的别名# available_version is being deprecated available_version salt.utils.functools.alias_function( latest_version, available_version )salt/modules/pkgutil.py。新代码应使用latest_version。也正因如此API 文档salt.modules.pkgutil.rst通过:exclude-members: available_version排除了该成员的自动文档生成。upgrade_availablesalt * pkgutil.upgrade_available CSWpythonupgrade_available 是轻量级的是否有升级检查执行pkgutil -c --parse --single name取输出第三列out.split()[2]若为SAME或命令无输出返回空字符串无可升级否则返回可用版本号。单元测试 test_upgrade_available 覆盖了SAME、可升级、无输出三种分支。升级管理list_upgrades 与 upgradelist_upgradessalt * pkgutil.list_upgradeslist_upgrades 列出系统上所有可升级的包默认refreshTrue先刷新仓库执行/opt/csw/bin/pkgutil -A --parse逐行按\t切分跳过状态为SAME已最新与not installed未安装的行其余记入upgrades[包名] 版本返回形如{pkg: version}的字典。upgradesalt * pkgutil.upgradeupgrade 升级系统上全部软件包默认先refresh_db()调用list_pkgs()记录升级前的包清单old执行/opt/csw/bin/pkgutil -yu完成全量升级弹出__context__中的pkg.list_pkgs缓存重新调用list_pkgs()得到new通过salt.utils.data.compare_dicts(old, new)返回变更字典结构为{package: {old: old-version, new: new-version}}注意第 4 步的弹缓存再重查是模块内所有变更类操作upgrade、install、remove的统一模式确保返回值反映的是真实变更而非过期缓存。安装installsalt * pkg.install package_name salt * pkg.install SMClgcc346install 使用pkgutil工具安装软件包参数如下参数说明name要安装的包名refresh是否先刷新仓库默认Falseversion指定安装版本与pkgs二选一使用pkgs批量安装列表必须是 Python 列表可混入{name: version}形式的版本约束传入时name会被忽略批量安装示例salt * pkg.install pkgs[foo, bar] salt * pkg.install pkgs[foo, {bar: 1.2.3}]执行流程源码级refreshTrue时先refresh_db()调用pkg_resource.parse_targets(name, pkgs, **kwargs)解析安装目标MinionError会被包装为CommandExecutionError抛出解析为空则直接返回{}若pkgs为None且指定了version且只有单个目标则把版本并入目标{name: version}对每个目标拼接目标串无版本时直接是包名有版本时格式为pkgname-version执行/opt/csw/bin/pkgutil -yu targets...弹缓存、重新list_pkgs()、compare_dicts(old, new)返回变更。源码注释中 Ignore sources argument 表明sources等多余参数会被parse_targets忽略。卸载remove 与 purgesalt * pkg.remove package name salt * pkg.remove package1,package2,package3 salt * pkg.remove pkgs[foo, bar]remove 卸载包及其不再被其他包使用的依赖name为要删除的包名pkgs为批量删除列表传入时name被忽略pkgs选项自版本 0.16.0 起可用先list_pkgs()得到old只对当前确实已安装的目标x in old执行/opt/csw/bin/pkgutil -yr targets...没有已安装目标时直接返回{}同样走弹缓存→重查→compare_dicts流程返回变更字典。purge 与remove完全相同——Solaris 的pkgutil不区分卸载与清除因此purge只是remove的别名式转发return remove(namename, pkgspkgs)二者参数与返回结构一致。与 Salt pkg 状态模块的联动pkgutil模块不只用于命令行它还作为底层支撑服务于pkg状态模块salt/states/pkg.py。状态模块在运行时通过__salt__[pkg.latest_version]如 salt/states/pkg.py、salt/states/pkg.py与__salt__[pkg.list_upgrades]如 salt/states/pkg.py与执行模块协作——这些调用在 Solaris 主机上即落到pkgutil的latest_version/list_upgrades。因此在 SLS 状态文件中可以这样声明式地管理 OpenCSW 包install_opencsw_python: pkg.installed: - name: CSWpython upgrade_all: pkg.uptodate: - refresh: Truepkg.uptodate会在目标主机上调用pkg.list_upgrades后执行升级与命令行salt * pkgutil.upgrade语义一致。注意事项与边界平台限制pkgutil模块仅在os_family Solaris的主机上加载且依赖 OpenCSW 提供的/opt/csw/bin/pkgutil若使用 Solaris 原生pkgadd或 IPS则应分别选择solarispkg/solarisipspkg模块。返回格式所有变更类函数统一返回{pkg: {old: ..., new: ...}}便于状态模块做变更判断。缓存一致性模块通过__context__[pkg.list_pkgs]缓存已装包清单以提升性能所有修改类操作都会主动弹出该缓存保证查询结果始终准确。purge语义purge与remove等价不要期望它会额外删除配置文件。废弃别名available_version已被标记为废弃应统一使用latest_version。版本比较latest_version会剔除修订号再做大小比较避免因1.0,REV2016之类的修订后缀影响结果。参考实现与测试模块实现salt/modules/pkgutil.py单元测试覆盖全部函数tests/pytests/unit/modules/test_pkgutil.py虚拟模块pkg的 provider 说明doc/ref/modules/all/salt.modules.pkg.rst状态层联动salt/states/pkg.pyAPI 文档源文件doc/ref/modules/all/salt.modules.pkgutil.rst对每个函数refresh_db、upgrade_available、list_upgrades、upgrade、list_pkgs、version、latest_version、install、remove、purge单元测试中都有一一对应的测试用例可作为理解边界行为与返回值约定的最直接参考。【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址: https://gitcode.com/gh_mirrors/sa/salt创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询