自动化运维-Ansible触发器与变量
一、Ansible触发器有这样一个场景当nginx配置更新后希望nginx可以自动重载配置如果nginx配置没有做任何变动则不做任何动作。这样的需求我们该如何实现呢在Ansible中提供了一个handlers的“触发器”机制可以用于实现上述需求。handlers任务执行后的条件触发器这是Ansible中最传统、最常用的“触发器”实现。它是一类特殊的任务只有当被其他任务通过notify关键词明确通知时才会在Playbook执行的最后阶段运行。工作流程当一个任务执行并导致系统状态发生改变状态变为changed时它可以使用notify指令去“通知”一个或多个Handler。被通知的Handler会在当前Play的所有任务执行完毕后统一按顺序执行。关键特性条件触发只有任务真正改变了系统状态才会触发通知避免不必要的操作。只执行一次即使在整个Playbook运行期间一个Handler被多个任务多次通知它也只会执行一次。这能有效避免如多次重启服务等问题。典型应用场景最经典的用法是在配置文件被修改后自动重启相关服务以使新配置生效。配置示例以下示例中Write the apache config file任务在更新配置文件后会通过notify触发Restart apache这个Handler来重启服务。tasks:-name:Write the apache config fileansible.builtin.template:src:/srv/httpd.j2dest:/etc/httpd.confnotify:# 任务发生改变时通知名为 Restart apache 的 handler-Restart apachehandlers:# 定义 handler-name:Restart apacheansible.builtin.service:name:httpdstate:restarted默认情况下所有task执行完毕后才会执行各个handler并不是执行完某个task后立即执行对应的handler如果想要在执行完某些task后立即执行对应的handler则需要使用meta模块如下示例所示tasks:-name:Write the apache config fileansible.builtin.template:src:/srv/httpd.j2dest:/etc/httpd.confnotify:# 任务发生改变时通知名为 Restart apache 的 handler-Restart apache-meta:flush_handlershandlers:# 定义 handler-name:Restart apacheansible.builtin.service:name:httpdstate:restarted当配置文件发生改变会通知Restart apache立即执行。二、Ansible变量变量在编程语言中变量是一个可以存储数据的“容器”其值可以被改变和重新赋值。用途为一段数据赋予一个简短、易于记忆的名称便于在代码中重复引用。变量名规则有效的变量名只能包含字母、数字和下划线并且必须以字母开头。在 Ansible 中可以通过以下几种形式传递变量1. Ad-hoc 命令行传递在执行ansible或ansible-playbook命令时可以通过-e参数指定外部变量。-evarvalue这种形式定义的变量拥有最高优先级。如果与其他方式定义的变量名冲突将优先使用此处指定的值。2. 在 Inventory 中定义变量在 Inventory 文件中可以通过以下两种方式定义变量为特定主机定义变量在主机行后直接赋值。IP/HOSTNAME variable_namevalue为组定义变量在组名下使用[groupname:vars]段落。[groupname:vars] variable_namevalue [all:vars] variable_namevalue[all:vars]下定义的变量对所有组都有效。3. 在 Playbook 中定义变量3.1 直接在 Playbook 中定义变量这是最直接的方式适用于变量数量不多、且仅在当前 Playbook 中使用的情况。变量通过vars关键字在 Play 的顶层定义。----hosts:webservervars:-var1_name:hello-var2_name:worldtasks:-name:显示变量值debug:var:var1_name,var2_name说明vars关键字下可以定义一个列表每个列表项都是一个键值对形式的变量。定义的变量在整个 Play即当前hosts作用域内有效可以在后续的所有任务中通过{{ 变量名 }}引用。这种方式简单明了适合定义环境、路径等固定值。3.2 使用 vars_files 引入外部变量文件当变量较多或需要在多个 Playbook 之间复用时可以将变量定义在独立的 YAML 文件中然后通过vars_files关键字引入。文件路径可以是相对路径相对于 Playbook 文件或绝对路径。----name:使用外部变量文件hosts:webservervars_files:-./vars.yaml# 引入当前目录下的 vars.yaml 文件tasks:-debug:msg:变量值{{ var1_name }}, {{ var2_name }}说明vars_files接受一个列表可以同时引入多个变量文件。引入后文件中定义的变量可以在当前 Play 的所有任务中直接使用。这种方式有助于实现配置与逻辑的分离提升 Playbook 的可维护性。4.在Role中定义----hosts:webserverroles:-{role:web,port:80}说明role:web表示调用变量的角色。port:80role可调用的变量和变量的值。5.注册变量将任务执行的结果使用register注册保存到变量供后续任务使用。----hosts:webservertasks:-name:register a variableshell:echo hello worldregister:print_hello-name:show print_hellodebug:msg:{{print_hello.stdout}}以上shell模块执行的命令因为实际上是在被管理节点上执行的所以输出的结果不会在剧本执行过程中输出如果需要使用输出的结果需要将其注册为一个变量。6.系统信息变量系统信息变量:facts默认会执行可在playbook中直接调用。属性:{{ ansible_hostname}}层级属性:{{ ansible_devices.vda.size}}数组: {{ ansible_dns.nameservers[0] }}如果用不到facts建议关闭可以提高剧本执行效率。----hosts:webservergather_facts:no#关闭使用false也可以tasks:-name:Install nginxyum:name:nginxstate:presenttags:install系统信息变量可以通过ansible webserver -m setup 命令查看。----hosts:webservertasks:-name:获取bond0的名称debug:msg:{{ansible_bond0.device}}系统信息变量通过.表示层级关系。7.内置主机变量常用的内置变量:inventory_hostname #清单主机名hostvars #包含被控制主机的所有变量hostvars.node1 #只调用node1主机所有变量hostvars.node1.group_names #显示node1所在的组的名字groups #所有主机以及组信息groups.all #所有被控制主机主机名groups.test01 #显示test01组里的所有主机名groups_names #当前运行任务的主机所在的组的名字hostvars获取当前目标主机主机名----hosts:webservergather_facts:notasks:-debug:msg:{{hostvars}}-debug:msg:{{hostvars[192.168.32.150][inventory_hostname]}}group_names:当前主机所在的组:----hosts:webservertasks:-debug:msg:{{group_names}}groups:资产清单中所有组的列表:----hosts:webservergather_facts:notasks:-debug:msg:{{groups}}本篇文章介绍了触发器以及7种变量的定义与使用方式如果您有疑问欢迎留言交流。

相关新闻

Mac 如何免费读写 NTFS 硬盘?Nigate 免费开源工具三步上手全指南

Mac 如何免费读写 NTFS 硬盘?Nigate 免费开源工具三步上手全指南

Mac 如何免费读写 NTFS 硬盘?Nigate 免费开源工具三步上手全指南 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and man…

2026/10/17 5:55:02 阅读更多 →
视频出海精细化升级:帧级对口型技术与商用工具落地能力分析

视频出海精细化升级:帧级对口型技术与商用工具落地能力分析

在视频出海、多语言内容创作、跨境短视频量产领域,单纯的字幕翻译、AI配音早已无法满足传播需求。观众对视频观感的要求持续提升,生硬的口型错位、台词与嘴型脱节、表情与配音不匹配,会直接拉低内容真实感,甚至让海外用户产生明显…

2026/10/17 9:13:45 阅读更多 →
不懂代码也能30分钟搞定OpenCore EFI?我亲测了OpCore-Simplify

不懂代码也能30分钟搞定OpenCore EFI?我亲测了OpCore-Simplify

不懂代码也能30分钟搞定OpenCore EFI?我亲测了OpCore-Simplify 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 上周,朋友把一台…

2026/10/18 2:29:04 阅读更多 →

最新新闻

vLLM推测解码实操:从原理到调优,为大模型推理加速

vLLM推测解码实操:从原理到调优,为大模型推理加速

1. 推测解码到底是什么:从“一个字一个字蹦”到“批量猜测再验证”1.1 为什么大模型推理这么慢:自回归的枷锁用过vLLM做线上推理服务的朋友应该都有体感,大模型生成token的速度,跟它“咬文嚼字”的方式是强绑定的。自回归解码的本…

2026/10/18 22:49:56 阅读更多 →
ZIP格式的学术投稿系统:可审计、可演进的出版数字基建

ZIP格式的学术投稿系统:可审计、可演进的出版数字基建

简介:这是一套基于Java SSM框架(Spring SpringMVC MyBatis)开发的《期刊在线投稿系统》完整源码工程,面向Java Web初学者与中级开发者,解决学术期刊数字化投稿、审稿与稿件管理的实际业务需求。资源包共351个文件&am…

2026/10/18 22:49:56 阅读更多 →
医院分诊管理系统:SSM+Shiro+MyBatis完整工程源码解析

医院分诊管理系统:SSM+Shiro+MyBatis完整工程源码解析

简介:一套基于SSM与MySQL的陆丰市医院分诊管理系统完整源码,面向需要学习Java Web项目开发或毕业设计的高校学生、初级程序员及医疗信息化爱好者。系统覆盖医生线上分诊叫号、患者信息在线编辑与统计、科室管理等核心功能,并附带系统管理与系…

2026/10/18 22:49:56 阅读更多 →
什么是CC恒流充电?为什么电池测试经常使用恒流?

什么是CC恒流充电?为什么电池测试经常使用恒流?

CC是电池测试中非常常见的缩写。英文是:Constant Current中文就是:恒流。所谓恒流,就是在规定阶段内,让电流尽可能保持在目标值附近。一、为什么需要恒流?因为测试需要可重复。假设我们希望比较两颗电池。第一颗用10A测…

2026/10/18 22:49:56 阅读更多 →
基于SDN的DDoS检测与防御实战:OpenFlow与REST API攻防框架

基于SDN的DDoS检测与防御实战:OpenFlow与REST API攻防框架

简介:一份基于SDN架构的DDoS攻击检测与防御系统完整源码包,面向计算机、信息安全、大数据、人工智能等专业的学生与开发人员,适用于课程大作业、期末项目、毕业设计及初期科研立项演示。项目代码已完成功能验证,包含控制器模块、检…

2026/10/18 22:49:56 阅读更多 →
十月AI前端面试:告别老实打法,掌握流式交互与状态管理

十月AI前端面试:告别老实打法,掌握流式交互与状态管理

1. 十月求职季的AI前端面试现状拆解十月这个时间节点,在招聘市场里向来是个微妙的存在。一边是秋招进入中后段,补录和急招的岗位开始释放;另一边是不少团队在年中调整后重新梳理HC,赶在年底前把人头落定。AI前端这个方向&#xff…

2026/10/18 22:48: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 阅读更多 →

周新闻

基于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/18 12:16:16 阅读更多 →