Fleet 4.54.0 深度解析:通过标签排除精准定向主机、可配置的脚本执行超时与 arm64 支持
【免费下载链接】fleetOpen device management项目地址: https://gitcode.com/GitHub_Trending/fl/fleet
Fleet 4.54.0(2024 年 7 月发布)聚焦于提升设备管理的精细化与自动化运维能力:新增基于标签排除(label exclusion)的主机定向能力,让管理员可以精确地把某个配置、策略或软件部署排除到特定标签组的主机之外;同时将远程脚本执行超时从固定值改为可通过 agent options 配置(默认 300 秒、最大 18000 秒),配合fleetctl run-script的轮询机制,为 Homebrew、Installomator、Chocolatey 等长耗时软件部署脚本留出充足执行窗口。本文以该版本发布说明为骨架,结合仓库源码与配置文档,逐项讲解新能力的用法、配置方法与底层实现。
版本亮点概览
Fleet 4.54.0 的核心变化集中在两大块:
- 标签排除(label exclusion):在面向主机管理配置描述文件(configuration profiles)时,新增
labels_exclude_any定向语义,配合原有的labels_include_all、labels_include_any,实现"排除命中指定标签的主机"的精准控制。 - 远程脚本执行超时可配置:新增
script_execution_timeoutagent option,默认 300 秒、上限 18000 秒(5 小时),用于支撑更长的软件部署与日志收集工作流。
此外该版本还包含 iOS/iPadOS 内置手动标签、SCEP 证书续期、fleetctl多项 CLI 改进以及大量 bug 修复。发布说明全文可参见 articles/fleet-4.54.0.md,完整的改动列表见仓库根目录的 CHANGELOG.md。
标签排除:更精细的主机定向能力
为什么需要"排除"语义
在 4.54.0 之前,向主机定向下发配置时只能采用"包含"语义:指定标签,只有命中这些标签的主机才会收到配置。但在真实 IT 场景中,管理员更常遇到的是"除了某批设备之外,其余设备都要下发"的反向需求。
发布说明给出的典型场景是会议室电脑(conference room computers):一家公司希望给绝大多数设备下发某个特定配置(例如新的网络代理设置或屏幕超时策略),但会议室里的共享电脑不应受影响。此时"排除"语义比维护一份"包含名单"简单得多——管理员只需要创建一个"会议室电脑"标签,然后在配置下发时排除该标签即可,无需随着新设备加入而持续维护包含名单。
三种定向模式的语义
根据 docs/Configuration/yaml-files.md 中configuration_profiles一节的说明,4.54.0 起每个配置描述文件(macOS/iOS/iPadOS 的 .mobileconfig/.json,Windows 的 .xml)都可以指定以下三种定向字段之一:
| 字段 | 语义 | 说明 |
|---|---|---|
labels_include_all | 主机必须拥有全部列出的标签 | 原有labels字段的别名,用于精准圈定 |
labels_include_any | 主机拥有任一列出的标签 | 命中任意一个即可 |
labels_exclude_any | 主机不拥有任何列出的标签 | 4.54.0 新增,用于排除 |
约束:三个字段互斥,只能指定其中一个;如果都不指定,则面向全部主机(all hosts are targeted)。
源码中的实现
在 server/fleet/apple_mdm.go 中,MDMAppleConfigProfile结构体同时承载三个定向字段:
LabelsIncludeAll []ConfigurationProfileLabel `db:"-" json:"labels_include_all,omitempty"` LabelsIncludeAny []ConfigurationProfileLabel `db:"-" json:"labels_include_any,omitempty"` LabelsExcludeAny []ConfigurationProfileLabel `db:"-" json:"labels_exclude_any,omitempty"`标签与配置描述文件之间是多对多关系,由ConfigurationProfileLabel表示,其中Exclude bool与RequireAll bool两个字段(server/fleet/apple_mdm.go)在数据库层面记录"该标签是包含还是排除"以及"是否要求全部命中",用于在同一个表中表达三种定向模式。
发布说明还提到 4.54.0 加入了数据库迁移,为 MDM 配置描述文件(以及 DDM declarations)关联的标签新增exclude列;profile reconciliation 逻辑也同步更新以处理新的 "exclude any" 标签——也就是说,主机收到配置的判定、以及配置被移除/更新的对账流程都会把排除标签纳入计算。
在 GitOps 与 YAML 文件中使用
通过fleetctl gitops或fleetctl apply应用 GitOps 配置时,可以在configuration_profiles条目中直接声明排除标签。参考 docs/Configuration/yaml-files.md 中软件包部分的写法(同一语法也适用于 profiles),一个典型的 GitOps 片段如下:
# lib/software/santa.package.yml - url: https://github.com/example/santa/releases/download/2026.2/santa-2026.2.pkg install_script: path: ../lib/software/santa-install-script.sh self_service: true labels_exclude_any: - IT test team # 属于 "IT test team" 标签的主机不会被安装 - url: https://github.com/example/santa/releases/download/2026.4/santa-2026.4.pkg install_script: path: ../lib/software/santa-install-script.sh categories: - "💻 Productivity" labels_include_all: - IT test team # 只面向 "IT test team" 标签的主机对于配置描述文件,语法类似:
mdm: apple_settings: configuration_profiles: - path: ../lib/macos/profiles/conference-room.mobileconfig labels_exclude_any: - conference-roomAPI 层面,向主机下发 profiles 的请求体同样支持这三个字段(labels_include_all、labels_include_any、labels_exclude_any数组,内容为标签名),详见 docs/Contributing/reference/api-for-contributors.md;labels旧字段被保留为labels_include_all的别名,保证向后兼容。UI 上则新增了"上传自定义 profile 时按 include all / exclude any 标签定向主机"的能力。
可配置的脚本执行超时:面向长耗时运维任务
默认值与上限
4.54.0 将远程脚本执行超时从固定值改为可配置。在 server/fleet/agent_options.go 中:
const maxAgentScriptExecutionTimeout = 18000 type AgentOptions struct { // ScriptExecutionTimeout is the maximum time in seconds that a script can run. ScriptExecutionTimeout int `json:"script_execution_timeout,omitempty"` ... }- 默认值:
300秒(5 分钟) - 最大值:
18000秒(5 小时)
校验逻辑位于ValidateJSONAgentOptions(server/fleet/agent_options.go):当配置值超过上限时会直接报错,提示'script_execution_timeout' value exceeds limit. Maximum value is 18000,防止误配置导致不可预期的行为。
配置方法
通过 agent options 在全局或团队层面设置超时(docs/Configuration/agent-configuration.md):
agent_options: script_execution_timeout: 600 # 单位:秒,此处为 10 分钟发布说明指出,这一扩展使得管理员可以执行更长、更复杂的脚本而不被打断,典型场景包括:
- 通过Homebrew、Installomator、Chocolatey等包管理器部署大型软件更新;
- 大规模日志收集操作;
- 双向数据传输类工作流(需要长时间保持脚本进程存活)。
fleetctl run-script 的轮询机制
脚本超时上限提高后,一次fleetctl调用的等待时长可能远超从前。为此 4.54.0 让fleetctl在运行run-script时改用轮询机制(polling):不再单次长连接等待结果,而是周期性查询脚本执行状态,从而适应更长的脚本超时值,避免客户端连接在超时前被切断。同时脚本详情弹窗在脚本超时时的错误提示也改为展示动态的超时上限值(而非写死的旧值)。
配套的脚本权限收紧
与"更长超时"配套的是更严格的执行权限。4.54.0 更新了脚本运行权限:只有 Admin 和 Maintainer 角色可以运行任意脚本或保存的脚本,Observer 与 Observer+ 不再具备该能力。UI 上对 Global/Team Observer 及其以上角色隐藏了主机详情页的 "Run script" 操作,Query 删除复选框对团队 Observer 隐藏,Observer/Observer+ 也不再被允许下载软件安装器。这些改动共同收敛了高权限操作面,避免超长脚本执行能力被低权限角色滥用。
端点运维(Endpoint Operations)相关改进
fleetctl gitops支持团队重命名:用 YAML 配置应用团队变更时,如果配置文件与之前同名,团队名称会被更新。注意:fleetctl gitops需要先在 Fleet/fleetctl 4.54.0 或更高版本上运行过,该能力才可用。fleetctl query --hosts支持主机名、主机 UUID 与硬件序列号:定位目标主机不再局限于单一标识符。- 主机详情页与 API 返回即将到来的维护窗口:如果主机在调度表上有即将到来的 scheduled maintenance window,会在 UI 主机详情页与 API 主机响应中展示。
fleetctl debug connection增强:支持用 fleetctl 可执行文件中内嵌的 certs.pem 测试 TLS 连接,并修复了对带中间证书的服务器 TLS 证书的支持。- 日历事件描述包含主机 display name:维护窗口等日历事件更易识别归属设备。
fleetctl apply增加 .yml/.yaml 文件类型校验:非法的文件扩展名会得到明确报错。- UI 细节:文本被截断时显示 tooltip,未截断的值不显示。
MDM 与设备管理改进
iOS/iPadOS 标签与 OS 版本聚合
- 新增iOS/iPadOS 内置手动标签。升级注意事项:迁移到 4.54.0 之前,请务必删除任何名为 "iOS" 或 "iPadOS" 的已有标签,避免与内置标签冲突。
- 新增iOS/iPadOS OS 版本聚合(aggregation),便于在仪表盘上整体查看移动设备系统分布。
- iOS/iPadOS 自定义 profile 的状态流转从
pending直接进入verified(跳过中间的verifying),缩短配置生效确认链路。
证书与 fleetd 自动安装
- 支持自定义 enrollment profile 的 SCEP 证书续期。
- 主机开启 MDM 时自动安装的
fleetd现在使用最新发布的 fleetd 版本。 - Windows MSI 安装包新增
END_USER_EMAIL与FLEET_DESKTOP参数支持。 - macOS 的
fleetd清理脚本与卸载脚本从 Fleet 运行时都会返回 "completed" 状态,脚本执行状态上报更准确。
API 与 CLI 相关
fleetctl gitops/fleetctl apply支持为自定义设置配置labels_include_all与labels_exclude_any。fleetctl get mdm_commands默认返回 20 行,并支持--host与--type过滤器,显著改善大环境下的响应时间。- API 不再因主机发送了无效 command uuid 的命令响应而返回 500。
- 上传软件安装器的 endpoint 超时提高到 4 分钟。
其他 MDM 修复
- Windows lock 时禁用凭据缓存与重启。
- 修复 macOS declarations 长时间停留在 "to be removed" 状态的问题。
- 修复 Windows MSI 安装器中
installer_utils.ps1 -uninstallOrbit步骤因注册表HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall键中含特殊字符而失败的问题;fleetdWindows 安装器遇到含特殊字符的注册表键时崩溃的问题也已修复。
漏洞管理改进
- 主机详情页的软件表新增"Vulnerable"(存在漏洞)过滤器,快速筛出存在已知漏洞的软件条目。
- 修复Microsoft Office 2024 年 6 月漏洞的漏报(false negative),并新增自定义漏洞匹配能力。
- 修复部分 Windows 应用被错误匹配到 Windows OS 漏洞的问题(组件/产品归属判定更准确)。
其他修复与改进(精选)
- Go 版本升级到 go1.22.4。
- "My device" 页面按优先级只渲染一个 banner。
- 修复 macOS 主机经 MDM 重新注册后
Added to Fleet被错误置为Never的问题。 - 恢复按 passing count 对策略排序的能力。
- 改进判断主机是否通过 MDM 接入 Fleet 的启发式算法:对未发送 Checkout 消息的主机,改用 osquery 数据进行判定。
- 改进
pkg安装器与既有软件的匹配、以及从pkg安装器中提取应用名的准确性。 - 修复导出含逗号字段的 CSV 时渲染异常的问题。
- 修复 "No Team" OS 版本数量显示错误、低磁盘空间主机计数错误等问题。
- 修复脚本详情弹窗在脚本超时时显示过时错误文案的问题(现改为动态超时上限)。
升级建议
升级到 4.54.0 前请特别留意两点:
- 删除名为 "iOS" / "iPadOS" 的既有标签:该版本新增同名内置手动标签,不删除会冲突。
- 团队重命名依赖新版本先运行一次:
fleetctl gitops的团队重命名能力,要求 Fleet/fleetctl 已用 4.54.0 或更新版本运行过一次fleetctl gitops。
完整的逐项改动与升级指引可查阅 articles/fleet-4.54.0.md 及仓库根目录 CHANGELOG.md。关于 agent options 的完整字段说明见 docs/Configuration/agent-configuration.md,GitOps YAML 语法见 docs/Configuration/yaml-files.md。
【免费下载链接】fleetOpen device management项目地址: https://gitcode.com/GitHub_Trending/fl/fleet
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考