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),仅供参考
企业数字化 ERP 产品动态
相关推荐
南阳咸鸭蛋加工来图加工定制工厂公司有哪些:排名前五企业全景分析 南阳咸鸭蛋加工来图加工定制市场避坑指南:教你快速找到靠谱供应商选择南阳咸鸭蛋加工定制服务时,不少商家都会遇到这些典型问题:
品质不稳定,咸度不均还出油少:市场上多数小加工厂依赖人工腌制,全凭经验把控… · 2026/9/23 14:03:25
SiC MOSFET阈值电压测量指南:JEDEC JEP183A标准与Python实现 简介:这份JEDEC JEP183A:2023标准文档面向从事SiC功率MOSFET器件评估的工程师与研究人员,针对阈值电压(VT)测量中普遍存在的滞后效应问题,给出标准化测量方法与测试前调节指南。内容涵盖测量范围界定、关键… · 2026/9/23 14:03:19
HydratedCubit Brick 完整指南:用 Mason 一键生成可持久化 Cubit 前端 【免费下载链接】bloc A predictable state management library that helps implement the BLoC design pattern 项目地址: https://gitcode.com/gh_mirrors/bl/bloc 点击查看 免费下载 HydratedCubit 是 bloc 状态管理库提供的「可持久化 Cubit」形态&#x… · 2026/9/23 14:03:19
VictoryChart 36.x—37.x 演进全解:从默认轴注入到 React 18 时代的重大变更实录 数据可视化UI组件 【免费下载链接】victory A collection of composable React components for building interactive data visualizations 项目地址: https://gitcode.com/gh_mirrors/vi/victory 点击查看 免费下载 packages/victory-chart/CHANGELOG.md 记录了 V… · 2026/9/23 14:54:03
3步拆解我速购源码:附完整示例与避坑指南 3步拆解我速购源码:附完整示例与避坑指南 学会语法却不知怎么搭项目?这是绝大多数培训班学员卡住的死结。你背熟了API,却面对空白文件发呆。今天咱们直接扒开【我速购】的底层逻辑,用 完整示例… · 2026/9/23 14:54:03
Python本地财务管理系统:SQLite+规则引擎实现个人数据自主 简介:这是一套面向计算机专业本科生与毕业设计初学者的Python个人财务管理系统实战项目,聚焦财务管理场景下的工程化开发实践,融合基础业务逻辑与轻量级AI应用思路。资源共30个文件,包含10个核心Python模块(如账单处理… · 2026/9/23 14:53:55
Akka Streams `Source.single` 操作符完全指南:单元素流的创建、语义与底层实现 后端并发编程异步编程 【免费下载链接】akka-core A platform to build and run apps that are elastic, agile, and resilient. SDK, libraries, and hosted environments. 项目地址: https://gitcode.com/gh_mirrors/ak/akka-core 点击查看 免费下载 导读
Sourc… · 2026/9/23 14:53:55
多线程的应用场景避坑指南:3个真实案例教你读懂源码 多线程的应用场景避坑指南:3个真实案例教你读懂源码 刚拿到手的多线程代码,运行起来就像个黑盒。CPU占用率飙升,结果却算错了,甚至直接死锁卡死。这种“复制粘贴就能跑,换个环境就报错”的噩梦,你是不是也经历过?别慌,今天这篇避坑指南,不背八股… · 2026/9/23 14:53:48
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29