新闻详情

新闻详情

首页 / 资讯中心 / 详情

Salt 状态管理实战:使用 schedule 状态模块托管 minion 端定时任务

发布时间:2026/9/25 13:57:29来源:尧图网络
Salt 状态管理实战:使用 schedule 状态模块托管 minion 端定时任务
运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载导读本文围绕 Salt 的 schedule 状态模块salt.states.schedule展开讲解如何在状态文件中以声明式方式创建、修改、删除、启用和禁用 minion 端的定时调度任务Scheduled Jobs。读完本文后你将掌握schedule.present、schedule.absent、schedule.enabled、schedule.disabled四个状态函数的完整用法、全部参数语义并了解它们与底层schedule执行模块、minion 事件系统之间的调用关系能够直接把定时任务纳入 Salt 的自动化管理体系。schedule 状态模块是什么在 Salt 中minion 内置了一个调度器scheduler可以让指定函数按固定间隔、特定时间点或 cron 表达式周期性地在 minion 本机执行。这些任务通常定义在 minion 配置或 pillar 中而 schedule 状态模块 提供了一套状态层的接口使你能在普通的 SLS 状态文件中管理调度任务将其与其他状态统一纳入 Salt 的声明式编排体系。模块提供四个状态函数状态函数作用schedule.present确保某个调度任务存在于 minion 的调度表中不存在则新增已存在但配置不一致则修改schedule.absent确保某个调度任务从调度表中删除schedule.enabled确保某个调度任务处于启用状态schedule.disabled确保某个调度任务处于禁用状态从实现上看这四个函数都依赖执行模块 salt/modules/schedule.py 提供的schedule.list、schedule.add、schedule.modify、schedule.delete、schedule.enable_job、schedule.disable_job等底层函数并通过 minion 的事件总线manage_schedule事件完成实际调度表变更。schedule.present定义与确保调度任务schedule.present(name, **kwargs)是核心状态函数保证名为name的调度任务处于期望状态。其工作流程如下对应 schedule.py 中的 present 实现调用schedule.list(show_allTrue, return_yamlFalse, offline...)获取当前调度表快照若任务尚不存在则调用schedule.add新增若任务已存在则先调用schedule.build_schedule_item根据本次参数构建期望项与当前项逐字段比较完全一致则返回Job {name} in correct state幂等无变更不一致则调用schedule.modify更新在testTrue试运行模式下所有变更仅做预演不实际生效。基础示例按固定间隔执行job3: schedule.present: - function: test.ping - seconds: 3600 - splay: 10以上配置将test.ping命令每隔 3600 秒1 小时执行一次并把执行时间在 010 秒之间随机抖动splay。splay 区间抖动示例job2: schedule.present: - function: test.ping - seconds: 15 - splay: start: 10 end: 20此例中test.ping每 15 秒执行一次执行时刻在 1020 秒之间随机偏移。splay既可以是单个秒数值也可以是含start/end的字典区间源码中 build_schedule_item 对此做了专门处理保证区间内的start/end顺序。按具体时刻执行whenjob1: schedule.present: - function: state.sls - job_args: - httpd - job_kwargs: test: True - when: - Monday 5:00pm - Tuesday 3:00pm - Wednesday 5:00pm - Thursday 3:00pm - Friday 5:00pm该示例在每周一、周三、周五下午 5 点和周二、周四下午 3 点执行state.sls httpd testTrue。when使用 dateutil 格式的时间字符串要求 minion 上安装 python-dateutil模块在构建任务时会逐个调用dateutil_parser.parse校验时间字符串合法性解析失败会直接报错见 build_schedule_item 中的 when 校验。使用 cron 表达式job1: schedule.present: - function: state.sls - job_args: - httpd - job_kwargs: test: True - cron: */5 * * * *调度任务也可以直接使用标准 crontab 格式。本例表示每 5 分钟运行一次state.sls httpd testTrue要求 minion 上安装 python-croniter。组合 returner 回传执行结果job1: schedule.present: - function: state.sls - job_args: - httpd - job_kwargs: test: True - when: - Monday 5:00pm - Tuesday 3:00pm - Wednesday 5:00pm - Thursday 3:00pm - Friday 5:00pm - returner: xmpp - return_config: xmpp_state_run - return_kwargs: recipient: userdomain.com该示例在同样的时间点执行state.sls httpd testTrue并使用 xmpp returner 将任务执行结果回传回传时使用xmpp_state_run配置节中的替代配置项并通过return_kwargs覆盖单个配置收件人。skip_during_range避开特定时间段job1: schedule.present: - function: state.sls - job_args: - httpd - job_kwargs: test: True - hours: 1 - skip_during_range: start: 2pm end: 3pm - run_after_skip_range: True该示例让任务每小时运行一次但避开下午 2 点至 3 点的时间段run_after_skip_range: True表示跳过区间结束后立即补跑一次。skip_during_range同样要求 python-dateutil。present 完整参数详解schedule.present支持的参数如下均为**kwargs透传给执行模块完整声明见 schedule.py 的 present 文档字符串参数类型/默认值说明namestring必填调度任务的唯一名称即调度表中的键名seconds/minutes/hours/daysint固定时间间隔任务经过指定时长后执行一次whenstring 或 list在指定时刻执行使用 dateutil 格式需 python-dateutilcronstring使用 crontab 格式指定执行时刻需 python-croniterrun_on_startboolminion 启动时是否立即执行否则首次会跳过等下一个调度周期functionstring调度任务要执行的函数名必填job_argslist传给函数的定位参数job_kwargsdict传给函数的关键字参数maxrunningint同一任务最多允许同时运行 N 个副本防止任务重叠jid_includebool默认 True是否将任务纳入 job cache任务缓存splayint 或 dict执行时刻的随机抖动可为秒数或{start, end}区间rangedict仅在该时间范围内执行需 python-dateutiloncestring在指定日期只执行一次once_fmtstringonce的日期格式默认 ISO 8601可覆盖enabledbool默认 True任务是否启用return_jobbool任务完成后是否向 master 回传执行信息metadatadict关联到任务的元数据不参与执行可用于与return_job组合检索任务returnerstring用于回传任务结果的 returner 名称return_configstringreturner 使用的替代配置节return_kwargsdict覆盖单个 returner 配置项persistbool默认 True变更是否持久化保存到 minion 配置文件skip_during_rangedict在指定时间区间内不执行{start, end}需 python-dateutilrun_after_skip_rangebool跳过区间结束后是否立即补跑offlineboolminion 未运行时也把任务写入调度versionadded 3006.3 引入几个值得注意的实现细节时间参数互斥校验seconds/minutes/hours/days不能与when或cron混用when与cron也不能同时使用。schedule.add、schedule.modify、schedule.build_schedule_item三处均有此校验冲突时会直接返回result: False并给出明确报错见 build_schedule_item 的冲突检查。job_args/job_kwargs类型校验job_args必须是 list、job_kwargs必须是 dict否则构建任务会失败见 build_schedule_item。默认值注入maxrunning默认 1、enabled默认 True、jid_include默认 True。state 层比较新旧配置时也会为期望项补上缺失的enabled字段后再比较避免误判见 present 的实现。offline模式当 minion 进程未运行时schedule.add/schedule.modify不再通过事件总线触发而是直接把合并后的调度表写入_schedule.conf文件由_get_schedule_config_file生成位于 minion 配置目录下见 list_ 与 add 的 offline 分支 与 add 的 offline 写文件逻辑。schedule.absent移除调度任务schedule.absent(name, **kwargs)用于确保某任务不在调度表中cleanup-job: schedule.absent: - name: job1若任务存在调用schedule.delete删除返回Removed job {name} from schedulechanges中记录移除结果若任务本就不存在返回Job {name} not present in schedule视为成功幂等testTrue模式下仅预演删除persist参数默认 True决定删除操作是否持久化——为 False 时任务只从运行中的调度表移除minion 重启后仍会从保存的配置中恢复同样支持offlineTrue在 minion 未运行时直接改写_schedule.conf见 absent 实现。schedule.enabled 与 schedule.disabled启停任务这两个状态函数分别调用schedule.enable_job和schedule.disable_job用于在不删除任务的前提下启停任务适合临时维护场景pause-backup: schedule.disabled: - name: nightly-backup resume-backup: schedule.enabled: - name: nightly-backup任务存在时正常启停并返回对应 comment任务不存在则返回Job {name} not present in scheduletestTrue时仅预演persist决定变更是否保存见 enabled 实现 与 disabled 实现。与执行模块及事件系统的联动原理状态函数本身不做调度而是把参数透传给 salt/modules/schedule.py 的执行函数。在线模式下执行函数通过event.fire(data, manage_schedule)向 minion 事件总线发送manage_schedule事件minion 调度器进程收到后执行真实变更再通过minion_schedule_add_complete、minion_schedule_modify_complete、minion_schedule_enabled_job_complete等标签回发完成事件执行函数等待事件返回后确认结果例如 enable_job 的事件往返。在testTrue试运行模式下状态层会把test参数注入kwargs透传下去使执行模块返回would be added / would be modified / would be deleted等预演信息而不做真实变更。测试验证仓库中针对本状态模块的单元测试位于 tests/pytests/unit/states/test_schedule.py覆盖了以下关键行为新增任务调度表为空时调用schedule.add返回Adding new job job1 to schedule无变化幂等任务已存在且期望配置一致时返回Job job1 in correct state修改任务任务已存在但when等字段变化时调用schedule.modifychanges中给出 old/new 完整对比test 模式testTrue时只预演comment 变为would be added / would be modified / would be deleted删除任务存在时调用schedule.delete不存在时返回Job job1 not present in scheduleoffline 模式offlineTrue时直接写入_schedule.conf且不触发事件总线调用测试中断言event.call_count 0。这些测试同时佐证了状态层对test、offline、persist等分支的处理逻辑与上述说明一致。使用建议将调度任务定义放进状态文件后可通过salt minion* state.apply schedule批量下发任务会同时持久化到 minion 配置目录下的_schedule.conf需要快速查看 minion 当前调度表时可结合执行模块命令salt * schedule.list show_allTrue对比状态管理结果涉及when、range、skip_during_range时务必确认 minion 已安装 python-dateutil涉及cron时确认已安装 python-croniter否则任务构建会直接报错需要立刻执行一次某调度任务时可使用执行模块的salt * schedule.run_job job1forceTrue可强制执行被禁用的任务见 run_job 实现。综上salt.states.schedule把 minion 端定时任务的增删改查启停全部收敛为声明式状态配合事件系统与配置文件持久化机制让定时任务的管理和审计与 Salt 的其他基础设施管理保持同一套自动化流程。赞分享运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载相关推荐Salt 状态模块 at用 at.present / at.absent / at.watch 管理一次性定时任务Salt 状态模块 at用 at.present / at.absent / at.watch 管理一次性定时任务 导读 本文围绕 Salt 状态模块 sal运维配置管理后端Salt Proxy Minion 状态管理实战用 salt_proxy.configure_proxy 在 minion 上部署与运行 salt-proxySalt Proxy Minion 状态管理实战用 salt_proxy.configure_proxy 在 minion 上部署与运行 salt proxy运维配置管理后端Salt 状态模块指南使用 salt.states.environ 管理 Minion 进程环境变量Salt 状态模块指南使用 salt.states.environ 管理 Minion 进程环境变量 导读 environ 是 Salt 中专门用于管理「当前运维配置管理后端上一篇WarcraftHelper魔兽争霸3终极兼容性增强插件完整使用指南下一篇Sunshine完全指南5步打造你的终极家庭游戏串流中心创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

多通道波分复用器技术拆解:原理、关键参数与部署排障 2026/9/25 14:34:54

多通道波分复用器技术拆解:原理、关键参数与部署排障

1. 从一根光纤到多通道:波分复用到底在解决什么问题1.1 先理解“一根光纤能传多少”这件事做光通信的人对“光纤资源不够用”这句话应该都不陌生。早年组网,业务扩容最常见的做法是加纤、加设备,运营商和大型企业机房里的ODF架(光…

阅读更多 →
ChatGPT Shortcut 浏览器扩展安装与使用指南:把 AiShort 提示词库直接嵌入 ChatGPT/Gemini/Claude 侧边栏 2026/9/25 14:34:54

ChatGPT Shortcut 浏览器扩展安装与使用指南:把 AiShort 提示词库直接嵌入 ChatGPT/Gemini/Claude 侧边栏

AI 应用提示工程人工智能前端 【免费下载链接】ChatGPT-Shortcut Stop writing prompts from scratch — a searchable prompt library for ChatGPT, Claude, Gemini and Cursor Русский 한국어 العربية हिन्दी ไทย | 别再从头写提示词&…

阅读更多 →
OpenChamber 1.13.3 发布解读:Git 提交 SSH 签名、Agent 采样参数与全端体验修复 2026/9/25 14:34:54

OpenChamber 1.13.3 发布解读:Git 提交 SSH 签名、Agent 采样参数与全端体验修复

AI Agent人工智能代码智能体交互助手 【免费下载链接】openchamber Agentic Development Environment based on OpenCode AI agent 项目地址: https://gitcode.com/gh_mirrors/op/openchamber 点击查看 免费下载 本篇文章围绕 OpenChamber 1.13.3 版本(…

阅读更多 →
通信型CRM如何重塑客户跟进流程:坐席工作台与客户时间线实践复盘 2026/9/25 14:34:54

通信型CRM如何重塑客户跟进流程:坐席工作台与客户时间线实践复盘

做客服团队管理这几年,我一直有个执念:客户跟进的上下文绝对不能断。2024年下半年,我们整个客服和销售运营从“微信Excel传统呼叫平台”的混合方案,迁移到了DeskcommCRM,到现在跑了快九个月。整个过程从选型到落地&…

阅读更多 →
深入理解printk:内核日志级别、缓冲机制与调试实战 2026/9/25 14:34:47

深入理解printk:内核日志级别、缓冲机制与调试实战

第一次写内核模块时,我对着屏幕里的黑框敲了半天,printk("hello, kernel\n")编进模块,插入内核,结果终端上一个字都没蹦出来。转而敲dmesg | tail,那条消息才懒洋洋地躺在最后一行。那会儿我才意识到&#x…

阅读更多 →
生产级AI Agent记忆系统设计:DDD分层、SSE流式输出与HITL实战 2026/9/25 14:34:27

生产级AI Agent记忆系统设计:DDD分层、SSE流式输出与HITL实战

1. 为什么"记忆"才是生产级 Agent 和玩具 Demo 的分水岭我接触过不少团队做 AI Agent,Demo 阶段都很惊艳:接个大模型,挂几个工具,跑通一个"查天气订机票"的流程,演示效果拉满。但一上生产就露馅—…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉