尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

深入解析 Salt 中 SSH 资源的 test 执行模块覆盖:`salt.resources.ssh.modules.test` 与真实的远端连通性检测

发布时间:2026/9/25 17:36:04

资讯中心
01
ARTICLE

深入解析 Salt 中 SSH 资源的 test 执行模块覆盖:`salt.resources.ssh.modules.test` 与真实的远端连通性检测

深入解析 Salt 中 SSH 资源的 test 执行模块覆盖:`salt.resources.ssh.modules.test` 与真实的远端连通性检测
运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载test.ping是 Salt 生态中使用频率最高的连通性探针之一。本文围绕 salt/resources/ssh/modules/test.py 这一针对ssh资源类型Resource Type的执行模块覆盖execution module override讲解它如何通过__resource_funcs__[ssh.ping]()委托机制让test.ping返回的是目标 SSH 主机的真实连通性而非管理 minion 的存活状态并顺带说明 Salt Resources 框架下 per-type 执行模块的加载、优先级与扩展方式。读者读完后既能理解salt -C Tssh:web-01 test.ping的完整执行链路也能掌握为自定义资源类型编写执行模块覆盖的通用模式。一、背景Salt Resources 框架中的执行模块覆盖Salt Resources资源类型框架允许把一个 minion 同时管理多个外部资源——例如通过 SSH 管理的远程 Linux/Unix 主机。框架为每种资源类型维护独立的执行模块加载器per-type loader并通过目录约定实现插槽覆盖资源类型ssh的覆盖模块存放在salt/resources/ssh/modules/目录下文件名去掉.py即对应执行模块的虚拟名slot例如 modules/cmd.py 覆盖cmd、modules/pkg.py 覆盖pkg、modules/state.py 覆盖state、modules/test.py 覆盖test。这一机制在 doc/topics/resources/authoring/execution_modules.rst 中有完整说明当一条 job 被派发到某资源类型时__salt__会先在rtype/modules/中查找找不到的函数才回落到标准的 salt/modules/ 目录。这正是框架设计的核心——为资源类型定制cmd.run、pkg.installed等行为时无需 fork 标准模块也无需触碰__virtual__。二、modules/test.py一行委托直通真实 SSH 连通性salt/resources/ssh/modules/test.py 的源码非常简短但语义关键。它只定义了一个ping()函数def ping(): Return True if the targeted SSH resource is reachable. Delegates to :func:salt.resources.ssh.ping via __resource_funcs__ so the result reflects actual SSH connectivity to the remote host rather than the liveness of the managing minion. CLI Example: salt -C Tssh:web-01 test.ping salt -C Tssh test.ping return __resource_funcs__[ssh.ping]()三个要点值得展开1. 位置即加载门控。该文件位于salt/resources/ssh/modules/这一 per-type 覆盖目录只会被 ssh 资源的加载器发现通过salt.loader._module_dirs中 per-type 的目录前缀注入因此不需要__virtual__或__virtualname__门控。这与salt/modules/test.py中标准test模块的加载方式形成鲜明对比。2. 目录优先级实现影子遮蔽。对派发到 ssh 资源的 job 而言目录顺序优先级使salt.resources.ssh.modules.test遮蔽了标准salt.modules.test模块而管理 minion 自身managing minion的 job 仍使用标准模块。也就是说同一个test.ping调用因目标不同而得到不同的语义。3. 委托而非复制逻辑。ping()通过__resource_funcs__[ssh.ping]()调用连接模块connection module即 salt/resources/ssh/init.py中定义的ping()。真正的连接逻辑只维护在连接模块一处覆盖文件纯粹负责插槽绑定。三、__resource_funcs__dunder连接模块的命名空间入口__resource_funcs__是资源类型执行模块专用的 loader dunder它暴露的是连接模块的函数命名空间按下标rtype.fname索引。在 doc/topics/resources/authoring/execution_modules.rst 中明确说明如果连接模块定义了def ping()覆盖模块内即可用__resource_funcs__[ssh.ping]()调用——这是覆盖模块触达连接模块助手的规范方式。类似的 dunder 还包括__resource__{type: ..., id: ...}始终在执行模块代码中可用__grains__当前资源的 grains由grains()采集而非管理 minion 的 grains__minion__管理 minion 的标准执行模块 loader用于覆盖模块确需访问本机资源的情形__salt__per-resource 合并 loader覆盖槽位 标准模块兜底。modules/test.py顶部的注释还特意强调这些 dunder 由 per-type loader 在运行时注入# pylint: disableundefined-variable因此不能在模块导入期捕获只能在函数体内使用。四、底层实现ssh.ping()如何判定连通性连接模块 salt/resources/ssh/init.py 中的ping()ssh_resource ping()定义如下逻辑def ping(): resource_id _resource_id() try: shell _make_shell(resource_id, cfg_override{timeout: 10}) stdout, _stderr, retcode shell.exec_cmd(echo ping) return retcode 0 and ping in stdout except Exception as exc: log.warning(ssh resource ping() failed for %s: %s, resource_id, exc) return False要点通过_make_shell()构造salt.client.ssh.shell.Shell实例并在本次调用中把连接超时强制设为 10 秒cfg_override{timeout: 10}避免 ping 探测长时间挂起在远端执行echo ping以退出码为 0 且输出包含 ping作为连通性判据——这是对 SSH 会话可用的最小、最可靠验证任何异常连接失败、认证失败、超时都会捕获并返回False。也就是说ssh 资源上的test.ping反映的是SSH 传输层是否健康而不是管理 minion 的进程存活状态。这正是modules/test.py模块 docstring 中强调的语义差异。五、实战用复合定位符-C对 SSH 资源发起 ping根据modules/test.py的 CLI 示例对 ssh 资源执行 ping 的完整命令为salt -C Tssh:web-01 test.ping # 单个 ssh 资源 salt -C Tssh test.ping # 该 minion 管理的全部 ssh 资源其中-C使用复合定位符compound matcherTssh:web-01是资源定位表达式T前缀表示按资源类型type匹配ssh为资源类型web-01为资源 ID即 Pillar 中hosts下的键Tssh则匹配该 minion 下所有 ssh 资源。资源 ID 由连接模块的discover()返回——即 Pillar 中ssh.hosts的键集合详见 salt/resources/ssh/init.py 的discover()。向该 Pillar 键增删主机后执行saltutil.refresh_resources即可热更新 Master 的 Resource Registry无需重启进程。六、连接配置Pillar 中的 ssh 资源声明ssh 资源的连接参数全部来自 Pillar顶层键默认为resources可通过 minion 选项resource_pillar_key覆盖。在 salt/resources/ssh/init.py 的模块 docstring 中给出了完整示例resources: ssh: hosts: web-01: host: 192.168.1.10 user: root priv: /etc/salt/ssh_keys/web-01 web-02: host: 192.168.1.11 user: admin passwd: secretpassword no_host_keys: true每个主机可配置的参数及默认值如下与_make_shell()/_make_single()的 kwargs 一一对应参数说明默认值host远端主机名或 IP必填—userSSH 登录用户rootportSSH 端口22privSSH 私钥文件路径与passwd互斥语义但两者可同时给出设priv时走密钥认证选项串无passwdSSH 密码生产环境建议优先使用密钥认证无priv_passwd私钥保护口令无sudo是否通过 sudo 以 root 执行命令FalsetimeoutSSH 连接超时秒30identities_only传-o IdentitiesOnlyyes防止 SSH agent 提供无关密钥Falseno_host_keys完全关闭主机密钥校验同时置StrictHostKeyCheckingno与UserKnownHostsFile/dev/nullFalseignore_host_keys传-o StrictHostKeyCheckingno但不丢弃 known_hosts 数据库Falseknown_hosts_file该主机的自定义 known_hosts 文件路径无ssh_options原样传给 ssh 二进制的附加-o KeyValue选项列表无keepalive启用 TCP keepaliveTruekeepalive_intervalServerAliveInterval秒Salt opts 或60keepalive_count_maxServerAliveCountMaxSalt opts 或3底层实现细节_shell_opts()会把ignore_host_keys、no_host_keys、known_hosts_file逐主机覆盖到__opts__副本之上Shell是从 opts 字典而非构造 kwargs 读取这些项的并保证_ssh_version始终存在_passwd_opts()以[]下标访问该键缺失会抛KeyError。ssh 版本在资源类型init()时预解析并缓存到__context__[ssh_resource]确保 job 执行期间不跑子进程。七、同类覆盖模块与整体扩展模式modules/test.py不是孤例同一目录下的兄弟模块展示了完整的覆盖谱系modules/cmd.py提供cmd.run、cmd.run_all、cmd.retcode全部委托__resource_funcs__[ssh.cmd_run]。cmd.run返回 stdout 字符串cmd.run_all返回{stdout, stderr, retcode}字典cmd.retcode只返回退出码。这是 SSH 资源执行模块的基础构建块相当于 proxy 模型中__proxy__[ssh_sample.cmd]()的角色。对应 CLIsalt -C Tssh:web-01 cmd.run uptime、salt -C Tssh cmd.run df -h timeout60。modules/pkg.py实现pkg.install、pkg.remove、pkg.version、pkg.list_pkgs根据远端os_familygrain 自动选择apt-getDebian/Ubuntu或yumRedHat/CentOS/Fedora/SUSE并透传timeout。modules/state.py实现state.highstate、state.sls、state.apply在管理 minion 进程内复刻 salt-ssh 的状态执行管线编译 →prep_trans_tar打包 → SCP 传输 tar → 经 salt-thin 执行state.pkg通过__func_alias__将apply_映射为apply。从框架层面看doc/topics/resources/authoring/execution_modules.rst为资源类型新增覆盖模块有三种典型模式只覆盖标准模块中的个别函数——在modules/pkg.py里只写需要的函数其余pkg.*槽位继续由标准模块如salt.modules.aptpkg填充优先级是逐函数的重导出标准模块——用salt.utils.functools.namespaced_function把state.sls等函数复制进覆盖模块 globals使__salt__等 dunder 在调用期解析到 per-resource loadermodules/state.py即官方示例纯委托连接模块——如modules/test.py这样的一行转发连接逻辑集中在__init__.py覆盖文件只做槽位绑定。同时要避免三类常见错误在模块导入期抓取 dunderNamedLoaderContext 代理仅在函数体内有效在覆盖模块中重定义__virtualname__槽位由文件位置决定绕过 loader 直接import salt.modules.cmdmod调用会跳过 dunder 注入与 per-resource 上下文。八、实现证据与测试佐证modules/test.py的存在与语义均有明确源码依据加载门控模块 docstring 明言其位于 per-type 覆盖目录只会被 ssh 资源加载器发现经由_module_dirs的 per-type 前缀因此无需__virtual__门控派发到 ssh 资源的 job 中标准salt.modules.test被目录顺序优先级隐藏管理 minion 的 job 继续使用标准模块委托语义ping()一行代码直接转发__resource_funcs__[ssh.ping]()底层连通性判定ssh.ping()在 salt/resources/ssh/init.py 中通过Shell.exec_cmd(echo ping)与 10 秒调用级超时实现文档注册该模块被登记在 doc/ref/resources/all/index.rst 的资源类型子模块目录树中与salt.resources.ssh.modules.cmd、pkg、state并列对应的 API 参考页为 doc/ref/resources/all/salt.resources.ssh.modules.test.rst。仓库内针对 SSH 资源的集成测试tests/pytests/integration/resources_ssh/ 与 tests/pytests/unit/resources/test_ssh_resource.py覆盖了资源注册、连接参数解析等链路可作为进一步阅读与验证的入口。需要说明的是ssh 资源类型的完整运行依赖 minion 上存在ssh二进制连接模块通过salt.utils.path.which(ssh)做加载门控本文所述机制均以当前仓库源码为基准。小结salt.resources.ssh.modules.test是理解 Salt Resources 执行模块覆盖机制的最小、最完整的标本一个文件、一个函数、一行委托背后却是目录位置 加载门控、目录优先级 槽位遮蔽、__resource_funcs__ 连接模块命名空间三大框架设计。掌握了它你就能以此为模板为自己的资源类型快速定制test、cmd、pkg、state乃至任意执行模块的远端语义。赞分享运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载相关推荐Salt 资源框架中的 dummy 类型执行模块覆盖深入解析 salt.resources.dummy.modules.testSalt 资源框架中的 dummy 类型执行模块覆盖深入解析 salt.resources.dummy.modules.test salt.resources运维配置管理后端Salt SSH 资源执行模块 cmd无代理远程命令执行的源码级解析Salt SSH 资源执行模块 cmd无代理远程命令执行的源码级解析 导读 本文聚焦 salt.resources.ssh.modules.cmd 执行模块运维配置管理后端Salt 代理 Minion 的 SSH 服务执行模块salt.modules.ssh_service深度解析Salt 代理 Minion 的 SSH 服务执行模块salt.modules.ssh_service深度解析 导读 salt.modules.ssh_se运维配置管理后端上一篇基于 Python Gen AI SDK 与原生 JavaScript 构建 Gemini Live 实时多模态语音应用plain-js-python-sdk-demo-app 全解析下一篇Bokeh 入门第一步用 Python 绘制交互式折线图figure / show 完整实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。