基础语法结构
name: 部署nginx配置并自动重启hosts: webtasks:任务1推送nginx配置文件name: 分发nginx.confcopy:src: ./files/nginx.confdest: /etc/nginx/nginx.confowner: rootgroup: rootmode: ‘0644’配置文件发生变更时通知名为 restart nginx 的handlernotify: restart nginx任务2推送站点配置name: 分发站点vhost配置copy:src: ./files/site.confdest: /etc/nginx/conf.d/site.confnotify: restart nginx触发器定义区域和tasks同级handlers:name: restart nginxservice:name: nginxstate: restarted执行逻辑两个 copy 任务只要任意一个文件发生修改changed所有 tasks 跑完后仅执行一次 restart nginx。回到顶部handler示例多个task同时触发handler会发生什么编写playbook文件rootmaster:/data00/ansible# cat handler1.yamlname: handler使用hosts: estasks:name: copy test1文件copy:src: /data00/ansible/test1.txtdest: /tmp/test1.txtmode: 600notify: notify handlername: copy test2文件copy:src: /data00/ansible/test2.txtdest: /tmp/test2.txtmode: 600notify: notify handlerhandlers:name: notify handlerdebug:msg: “handler触发了”测试执行发现远端机器被改变handler被触发了但是只执行一次rootmaster:/data00/ansible# ansible-playbook handler1.yamlPLAY [handler使用] ***********************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [10.37.120.9]TASK [copy test1文件] ********************************************************************************************************************************************************************************************changed: [10.37.120.9]TASK [copy test2文件] ********************************************************************************************************************************************************************************************changed: [10.37.120.9]发现这里handler被触发了RUNNING HANDLER [notify handler] *********************************************************************************************************************************************************************************ok: [10.37.120.9] {“msg”: “handler触发了”}PLAY RECAP *******************************************************************************************************************************************************************************************************10.37.120.9 : ok4 changed2 unreachable0 failed0 skipped0 rescued0 ignored0如果再执行一次会发生什么发现handler没有被触发因为文件状态没有被改变rootmaster:/data00/ansible# ansible-playbook handler1.yamlPLAY [handler使用] ***********************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [10.37.120.9]TASK [copy test1文件] ********************************************************************************************************************************************************************************************ok: [10.37.120.9]TASK [copy test2文件] ********************************************************************************************************************************************************************************************ok: [10.37.120.9]PLAY RECAP *******************************************************************************************************************************************************************************************************10.37.120.9 : ok3 changed0 unreachable0 failed0 skipped0 rescued0 ignored0定义多个handler没有被notify会怎么样rootmaster:/data00/ansible# cat handler2.yamlname: handler使用hosts: dbtasks:name: copy test1文件copy:src: /data00/ansible/test1.txtdest: /tmp/test1.txtmode: 600notify: notify handler定义handlerhandlers:name: notify handlerdebug:msg: “handler触发了”name: handler2debug:msg: “handler2触发了”name: handler3debug:msg: “handler3触发了”执行发现只有1个handler被触发了其它的handler并没有被触发rootmaster:/data00/ansible# ansible-playbook handler2.yamlPLAY [handler使用] ***********************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [10.37.99.63]TASK [copy test1文件] ********************************************************************************************************************************************************************************************changed: [10.37.99.63]RUNNING HANDLER [notify handler] *********************************************************************************************************************************************************************************ok: [10.37.99.63] {“msg”: “handler触发了”}PLAY RECAP *******************************************************************************************************************************************************************************************************10.37.99.63 : ok4 changed2 unreachable0 failed0 skipped0 rescued0 ignored0多个handler之间的执行顺序是怎么样的先给结论多个handler之间的执行顺序依赖文件中定义的先后顺序不依赖notify的顺序。可以看下面的案例编写playbook文件rootmaster:/data00/ansible# cat handler3.yamlname: handler使用hosts: dbtasks:name: copy test1文件copy:src: /data00/ansible/test1.txtdest: /tmp/test1.txtmode: 600notify: handler3name: copy test2文件copy:src: /data00/ansible/test2.txtdest: /tmp/test2.txtmode: 600notify: handler2handlers:name: notify handlerdebug:msg: “handler触发了”name: handler2debug:msg: “handler2触发了”name: handler3debug:msg: “handler3触发了”执行发现上文先notify的handle3然后notify的handler2。但是下面执行的handler2然后执行的handler3rootmaster:/data00/ansible# ansible-playbook handler3.yamlPLAY [handler使用] ***********************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [10.37.99.63]TASK [copy test1文件] ********************************************************************************************************************************************************************************************changed: [10.37.99.63]TASK [copy test2文件] ********************************************************************************************************************************************************************************************changed: [10.37.99.63]先执行的handler2RUNNING HANDLER [handler2] ***************************************************************************************************************************************************************************************ok: [10.37.99.63] {“msg”: “handler2触发了”}再执行handler3RUNNING HANDLER [handler3] ***************************************************************************************************************************************************************************************ok: [10.37.99.63] {“msg”: “handler3触发了”}一次性notify多个handler编写playbook文件rootmaster:/data00/ansible# cat handler4.yamlname: handler使用hosts: dbtasks:name: copy test1文件copy:src: /data00/ansible/test1.txtdest: /tmp/test1.txtmode: 600一次性notify多个handlernotify:handler3handler2notify handlerhandlers:name: notify handlerdebug:msg: “handler触发了”name: handler2debug:msg: “handler2触发了”name: handler3debug:msg: “handler3触发了”执行这里发现不依赖notify的定义顺序只依赖handlers定义的先后顺序rootmaster:/data00/ansible# ansible-playbook handler4.yamlPLAY [handler使用] ***********************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [10.37.99.63]TASK [copy test1文件] ********************************************************************************************************************************************************************************************changed: [10.37.99.63]RUNNING HANDLER [notify handler] *********************************************************************************************************************************************************************************ok: [10.37.99.63] {“msg”: “handler触发了”}RUNNING HANDLER [handler2] ***************************************************************************************************************************************************************************************ok: [10.37.99.63] {“msg”: “handler2触发了”}RUNNING HANDLER [handler3] ***************************************************************************************************************************************************************************************ok: [10.37.99.63] {“msg”: “handler3触发了”}PLAY RECAP *******************************************************************************************************************************************************************************************************10.37.99.63 : ok5 changed1 unreachable0 failed0 skipped0 rescued0 ignored0handler 链式触发handler 内部 notify编写playbook文件rootmaster:/data00/ansible# cat handler5.yamlname: handler使用hosts: dbtasks:name: copy test1文件copy:src: /data00/ansible/test1.txtdest: /tmp/test1.txtmode: 600notify:handler3handlers:name: notify handlerdebug:msg: “handler触发了”name: handler2shell:cmd: “echo handler2”notify: notify handlername: handler3shell:cmd: “echo handler3”notify: handler2执行rootmaster:/data00/ansible# ansible-playbook handler5.yamlPLAY [handler使用] ***********************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [10.37.99.63]TASK [copy test1文件] ********************************************************************************************************************************************************************************************changed: [10.37.99.63]RUNNING HANDLER [handler3] ***************************************************************************************************************************************************************************************changed: [10.37.99.63]RUNNING HANDLER [handler2] ***************************************************************************************************************************************************************************************changed: [10.37.99.63]PLAY RECAP *******************************************************************************************************************************************************************************************************10.37.99.63 : ok4 changed3 unreachable0 failed0 skipped0 rescued0 ignored0强制立即执行 handler默认 handler 在所有 task 末尾执行若需要中途立刻触发使用 meta 模块编写playbook文件rootmaster:/data00/ansible# cat handler6.yamlname: handler使用hosts: dbtasks:name: copy test1文件copy:src: /data00/ansible/test1.txtdest: /tmp/test1.txtmode: 600notify: handler3立刻执行上面触发的handlermeta: flush_handlersname: copy test2文件copy:src: /data00/ansible/test2.txtdest: /tmp/test2.txtmode: 600notify: notify handlerhandlers:name: notify handlerdebug:msg: “handler触发了”name: handler2debug:msg: “handler2触发了”name: handler3debug:msg: “handler3触发了”执行rootmaster:/data00/ansible# ansible-playbook handler6.yamlPLAY [handler使用] ***********************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [10.37.99.63]TASK [copy test1文件] ********************************************************************************************************************************************************************************************changed: [10.37.99.63]TASK [meta] ******************************************************************************************************************************************************************************************************RUNNING HANDLER [handler3] ***************************************************************************************************************************************************************************************ok: [10.37.99.63] {“msg”: “handler3触发了”}TASK [copy test2文件] ********************************************************************************************************************************************************************************************changed: [10.37.99.63]RUNNING HANDLER [notify handler] *********************************************************************************************************************************************************************************ok: [10.37.99.63] {“msg”: “handler触发了”}PLAY RECAP *******************************************************************************************************************************************************************************************************10.37.99.63 : ok5 changed2 unreachable0 failed0 skipped0

相关新闻

Unipacker高级配置指南:自定义YARA规则和打包器签名

Unipacker高级配置指南:自定义YARA规则和打包器签名

Unipacker高级配置指南:自定义YARA规则和打包器签名 【免费下载链接】unipacker Automatic and platform-independent unpacker for Windows binaries based on emulation 项目地址: https://gitcode.com/gh_mirrors/un/unipacker 欢迎来到Unipacker高级配置…

2026/10/16 0:47:43 阅读更多 →
dbKoda开发模式详解:从源码构建到自定义插件的完整开发指南

dbKoda开发模式详解:从源码构建到自定义插件的完整开发指南

dbKoda开发模式详解:从源码构建到自定义插件的完整开发指南 【免费下载链接】dbkoda State of the art MongoDB IDE 项目地址: https://gitcode.com/gh_mirrors/db/dbkoda 想要深入了解dbKoda这个现代化的MongoDB IDE吗?这篇完整的开发指南将带您…

2026/10/17 21:55:36 阅读更多 →
交互式用够了?用 Agent SDK 把 Claude 塞进 Python Web 服务

交互式用够了?用 Agent SDK 把 Claude 塞进 Python Web 服务

CLI调用Claude做产品级服务?我试过,翻车了 去年我接过一个活,把Claude Code CLI包成HTTP接口给上层业务调用,subprocess起进程、stdin塞prompt、stdout收文本,简单粗暴。第一周跑得欢,第二周产品提需求&…

2026/10/16 1:02:41 阅读更多 →

最新新闻

Flink核心机制:Window、State与Checkpoint的协同解析

Flink核心机制:Window、State与Checkpoint的协同解析

做流计算这几年,几乎每次面试或者带新人,我都会被问到Flink的Window、State、Checkpoint。很多朋友一开始觉得这三个概念是孤立的:Window是做聚合的,State是存数据的,Checkpoint是容错的。但实际上,这三者在…

2026/10/18 11:34:06 阅读更多 →
基于Spring Boot的私人云网盘系统设计与实战解析

基于Spring Boot的私人云网盘系统设计与实战解析

我最早做这个“基于Spring Boot的私人云网盘系统”,动机非常朴素:公有网盘用久了,总是被各种限制搞得心烦——下载一多就开始限速,稍微私密一点的文件也不敢放。后来索性在团队里自己搭了一个用Spring Boot写的私人云网盘&#xf…

2026/10/18 11:34:06 阅读更多 →
FastAPI集成SQLAlchemy:从CRUD到生产级数据库持久化实践

FastAPI集成SQLAlchemy:从CRUD到生产级数据库持久化实践

终于写到第5部分了。前四部分我们把FastAPI的路由、参数校验、请求体、响应模型、中间件和异常处理都过了一遍,单看接口已经能跑得像模像样。但做过真实项目的人都知道,这还只是“玩具级”的后端。原因很简单:数据一重启就丢,接口…

2026/10/18 11:34:06 阅读更多 →
医疗知识图谱问答系统:实体链接+多跳推理+可解释查询

医疗知识图谱问答系统:实体链接+多跳推理+可解释查询

简介:这是一套基于Python实现的医疗知识图谱自动问答系统源码,面向人工智能、自然语言处理与智慧医疗方向的学习者和开发者,旨在解决医疗领域专业问题的语义理解与精准检索难题。资源包含26个文件,涵盖8个Python核心模块&#xff…

2026/10/18 11:34:06 阅读更多 →
AI抢不走你的饭碗?从恐惧到指挥的实战指南

AI抢不走你的饭碗?从恐惧到指挥的实战指南

我认识张伟,不是那个全国人民都认识的张伟,是我前同事。上个月他给我打电话,语气里全是惊恐:“兄弟,AI要抢我饭碗了,给我出出主意。”事情很老套。他们部门接到新要求,所有项目周报、数据分析、…

2026/10/18 11:34:06 阅读更多 →
从零训练小型语言模型:数据、模型、训练与踩坑全流程

从零训练小型语言模型:数据、模型、训练与踩坑全流程

最近刚把一门深度学习课程的作业一完整跑通,主题是Training,也就是从头训练一个小型语言模型。先说结论:这件事没有想象中那么玄,但也没有网上教程写得那么轻松。你会在数据预处理、模型初始化、训练循环、评测生成这几个环节里反…

2026/10/18 11:33:06 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →