资讯动态

Fleet 维护窗口功能深度解析:把安全更新自动排进用户的日历

发布时间:2026/9/18 11:02:13 来源:尧图企业网站定制
Fleet 维护窗口功能深度解析把安全更新自动排进用户的日历【免费下载链接】fleetOpen device management项目地址: https://gitcode.com/GitHub_Trending/fl/fleet本文基于 Fleet v4.48 引入的maintenance windows维护窗口功能完整讲解其设计思路、端到端工作链路、源码级实现原理与 GitOps 配置方式。读完本文你将掌握如何为 Fleet 接入 Google Calendar、为指定团队的策略开启日历事件自动化并通过事件触发 webhook 让系统更新在用户最空闲的时间自动完成。一、为什么需要维护窗口传统设备管理中操作系统安全更新的推送往往随时发生——用户可能正在演示、开会、写代码屏幕却突然弹出更新提示。Fleet 在 v4.48 中发布的maintenance windows正是对这一痛点的直接回应当 Fleet 需要占用用户的时间时它会像一位得体的同事一样先把这件事放进用户的日历。该功能通过分析用户日历找出设备空闲时段午休、上班前、低活动期等把安全更新安排在最少打扰用户的时间。无论用户身处办公室、出差途中还是远程办公关键会议与核心工作都不会被打断。该功能属于 Fleet 的 Google Calendar 集成值得注意的是与 Fleet 其他依赖声明式设备管理DDM的功能不同本方案仍走传统 MDM 命令通道见官方公告中的说明。二、维护窗口的三项核心能力原公告将其能力概括为三点这也是整套设计要解决的三个问题个性化调度Personalized scheduling更新时机基于用户个人的日历事件来计算只在干扰最小的时间介入。策略失败时Fleet 会在主机用户的日历上创建维护事件事件默认落在业务日而非周末。重新调度弹性Rescheduling flexibility如果计划好的更新因任何原因变得不合时宜用户可以在日历中手动把维护窗口拖到更合适的时间。Fleet 建议在一周内重新安排以确保更新及时完成。增强合规Enhanced compliance自动调度的维护窗口让安全协议合规无需人工干预即可维持确保所有设备持续保持最新状态。三、端到端工作链路从策略失败到日历事件要真正用好这个功能需要理解它的完整数据流。从 server/cron/calendar_cron.go 的实现可以还原出整条链路后台调度器扫描团队cronCalendarEvents每轮读取 AppConfig若未配置任何 Google Calendar 集成则直接跳过len(appConfig.Integrations.GoogleCalendar) 0时返回。随后遍历所有团队仅处理启用了日历事件的团队team.Config.Integrations.GoogleCalendar.Enable为 true见cronCalendarEventsForTeam。取出配置了日历事件的策略通过GetCalendarPolicies(team.ID)拿到团队内开启calendar_events_enabled的策略集合若为空则跳过该团队。按邮箱分组主机通过GetTeamHostsPolicyMembershipResults获取团队内主机的策略通过/失败状态并区分三组全部策略通过的主机若失败事件已存在则删除其日历事件存在失败策略、且关联了邮箱的主机为其创建维护事件存在失败策略但没有关联邮箱的主机仅记录调试日志提示无法关联邮箱。并发处理创建与删除均通过 18 个并发 workercalendarConsumers 18处理每个邮箱只保留 host ID 最小的主机避免重复事件。事件触发 webhook事件时间到达且主机在线时Fleet 会把 webhook 状态置为pending并请求主机重新上报UpdateHostRefetchRequested由 IT 管理员配置的 webhook 去触发脚本或 MDM 命令完成修复。事件时间如何计算事件起始时间的选择逻辑在getPreferredCalendarEventDate与addBusinessDay中默认选取当前日期的下一个业务日跳过周六、周日周五顺延三天。如果首选日期已经结束代码中通过DayEndedError判定则继续顺延到下一个业务日。v4.48 发布说明中描述的每月第三个星期二即这一业务日调度策略下的典型落点。func addBusinessDay(date time.Time) time.Time { nextBusinessDay : 1 switch weekday : date.Weekday(); weekday { case time.Friday: nextBusinessDay 2 case time.Saturday: nextBusinessDay 1 default: // nextBusinessDay is 1 } return date.AddDate(0, 0, nextBusinessDay) }四、配置指南从全局集成到策略级开关维护窗口是分层配置的全局配置 Google Calendar 服务账号 → 团队开启日历事件与 webhook → 具体策略声明开启日历事件。第 1 步全局配置 Google Calendar 集成在组织设置org_settings中配置integrations.google_calendar示例来自 docs/Configuration/yaml-files.mdorg_settings: integrations: google_calendar: - api_key_json: $GOOGLE_CALENDAR_API_KEY_JSON domain: fleetdm.com参数说明api_key_json创建 Google Workspace 服务账号 API key 时下载的 JSON 文件内容默认。Fleet 只使用其中的client_email与private_key两个字段。domain用于识别终端用户工作日历的主域名默认例如fleetdm.com。从源码 server/fleet/integrations.go 的ValidateGoogleCalendarIntegrations可以看到校验规则client_email与private_key为必填且不能为空domain必填同时暂不支持配置超过一个 Google Workspace 服务账号integrating with 1 Google Workspace service account is not yet supported。服务账号需要开启全域委派domain-wide delegationFleet 才能代表组织内的用户操作其日历。第 2 步在团队层级启用日历事件配置位于fleets/fleet-name.ymlFleet 4.53 之前的团队概念在 GitOps 中对应 fleet# fleets/fleet-name.yml settings: integrations: google_calendar: enable_calendar_events: true webhook_url: https://example.com/fleet-webhook对应源码中的团队级结构体TeamGoogleCalendarIntegrationserver/fleet/integrations.gotype TeamGoogleCalendarIntegration struct { Enable bool json:enable_calendar_events WebhookURL string json:webhook_url }enable_calendar_events是否在该 fleet团队启用日历事件默认false。webhook_url维护事件进行期间 Fleet 触发的 webhook 地址默认。IT 管理员应通过该 webhook 触发脚本或 MDM 命令来完成修复发布说明原话。第 3 步在策略上声明日历事件只有带标签指定团队的策略可以开启calendar_events_enabled——文档明确指出该字段只能在 fleet团队的策略上配置且只能配置于 fleet团队层级的 YAMLfleets/fleet-name.yml中。策略示例# fleets/fleet-name.yml policies: - name: macOS - Enable FileVault description: This policy checks if FileVault (disk encryption) is enabled. resolution: As an IT admin, turn on disk encryption in Fleet. query: SELECT 1 FROM filevault_status WHERE status FileVault is On.; platform: darwin critical: false calendar_events_enabled: true当该策略失败时Fleet 便会在对应主机用户的日历上创建一条维护事件当策略重新通过后事件会被自动删除见下文清理机制。五、日历事件里写了什么Fleet 在日历事件中直接提供维护原因的说明让更新过程对终端用户保持透明。事件正文的生成逻辑在 server/service/calendar/calendar.go 的GenerateCalendarEventBody中{组织名} {静态头文本}{主机名}. Please leave your device on and connected to power. bWhy it matters/b {策略描述} bMaintenance required/b {策略 resolution}也就是说事件正文由四部分组成组织名与主机名、设备需保持开机并接通电源的提醒、Why it matters为什么重要——来自策略的description字段、Maintenance required需要维护——来自策略的resolution字段。官方公告称这些说明由 AI 生成但即便未配置 description/resolutionFleet 也会回退到默认描述文本CalendarDefaultDescription/CalendarDefaultResolution保证事件内容永远完整可读。事件内容变更检测为了在策略描述或修复建议发生变化时同步更新已创建的事件Fleet 为事件正文计算了一个签名标签对description resolution做 SHA-256 哈希见getBodyTag与calendar.go中的policy.Tag。后台任务定期比较当前标签与事件中保存的标签若不一致则通过 Google Calendar API 更新事件正文UpdateEventBody确保用户看到的说明始终与最新策略一致。六、事件触发与 webhook 修复闭环维护事件到达预定时间后Fleet 并不会直接执行更新——它触发 webhook把动手的权利交给 IT 的自动化管线脚本或 MDM 命令。事件触发前后有几个关键行为值得注意server/cron/calendar_cron.go在线检查只有主机在线StatusOnline或StatusNew时才会触发 webhook离线主机的修复将顺延。webhook 状态机None → Pending → Sent。事件创建时状态为None触发前置为Pending并请求主机重新上报配置若主机在置为 pending 后离线未归后台任务会跳过该事件等待下一次调度。同一天不重复触发如果 webhook 已在当天发送且策略仍然失败会给予一天的宽限期避免反复打扰。用户改期兼容触发前会重新拉取日历事件GetAndUpdateEvent即使用户手动移动了事件时间Fleet 也会在事件进行时正确触发 webhook。失败可观测日历创建/触发失败时会记录failed_automation_calendar_event活动含状态码与响应体成功创建则记录ran_automation_calendar_event活动方便管理员在活动日志中排查。七、维护与清理机制日历事件不是创建后就不管的。cronCalendarEventsCleanup负责以下几类清理server/cron/calendar_cron.go策略转好即删主机从失败变为全部通过后事件会从用户日历中删除removeCalendarEventsFromPassingHosts。关闭即清空若全局 Google Calendar 配置被移除由于无法再操作远端日历Fleet 至少会清空数据库中的全部日历事件记录。团队级清理某团队关闭了日历事件或团队内不再有开启日历事件的策略则清理该团队的事件。过期事件回收超过 48 小时未更新的事件例如主机被转移到其他团队或全局会被批量删除。删除未来事件时会同步调用 Google Calendar API 删除远端事件并停止对事件变更的监听。调度器本身也有节流设计后台任务约每 5 分钟运行一次但对同一事件的重载检查频率上限为 30 分钟reloadFrequency 30 * time.Minute以减少 Fleet 与日历服务两侧的负载。同时跨多实例部署时通过 Redis 分布式锁LockKeyPrefix/ReservedLockKeyPrefix保证同一事件不会被多个实例重复处理。八、适用前提与注意事项版本前提维护窗口自Fleet v4.48引入配置前请确保 Fleet 服务端不低于该版本。集成前提需要 Google Workspace 服务账号并开启全域委派且一次仅支持一个服务账号client_email、private_key、domain三者缺一不可。层级前提calendar_events_enabled只能配置于团队fleet的策略上全局Unassigned策略无法使用该自动化。修复通道Fleet 本身不执行修复动作webhook 是唯一出口需要自行实现脚本或 MDM 命令的触发端点。技术路线与 Fleet 其他基于 DDM 的功能不同维护窗口目前仍基于传统 MDM 命令实现官方公告注明More to come。九、小结维护窗口把安全更新从一次随时可能打断工作的弹窗变成了一条端到端的自动化流水线策略失败检测 → 业务日调度 → 写入用户日历 → 事件触发 webhook → 脚本/MDM 修复 → 策略转好后自动清理。结合 server/cron/calendar_cron.go 的调度实现、server/service/calendar/calendar.go 的事件内容生成以及 docs/Configuration/yaml-files.md 的分层配置你可以在不打断用户工作流的前提下持续维持设备的安全合规状态。【免费下载链接】fleetOpen device management项目地址: https://gitcode.com/GitHub_Trending/fl/fleet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价