自动化运维-从零开始编写ansible剧本(一) 从零开始编写Asible剧本在日常运维中我们经常需要在大量服务器上执行重复性任务——比如安装软件、修改配置、重启服务。Ansible 提供了两种执行方式Ad-Hoc 命令和Playbook剧本。Ad-Hoc 适合临时性的快速操作而 Playbook 则将经常执行的任务写入一个文件随时按“剧本”执行适合周期性、复杂的自动化场景。本文将从 Ansible Playbook 的基本概念讲起深入 YAML 语法、Playbook 结构并通过实战示例带你快速上手。一、Playbook 概述1.1 什么是 Ad-Hoc 命令Ad-Hoc 命令是 Ansible 提供的命令行执行方式用于远程管理其他主机。它的特点是直接在终端输入格式为ansible 主机组 -m 模块 -a 参数适合执行临时性、简单的任务比如测试连通性、批量执行一条 Shell 命令# 测试所有主机的连通性ansible all-mping# 在所有主机上创建 /tmp/test.txt 文件ansible all-mfile-apath/tmp/test.txt statetouch更多Ad-hoc命令的用法可参考另一篇文章自动化运维-ansible常用模块详解1.2 什么是 PlaybookPlaybook 中文译为“剧本”它把经常需要执行的多个任务按顺序写入一个 YAML 格式的文件中。剧本写好之后我们随时可以根据剧本执行相关任务而无需重复手动输入多条命令。Playbook 与 Ad-Hoc 的核心区别特性Ad-Hoc 命令Playbook任务数量只能执行单一任务可包含多个任务按顺序执行持久性无法保存复用可持久保存版本管理条件控制不支持支持条件判断when、循环loop触发器不支持支持 handlers仅在变更时触发适用场景临时、一次性操作周期性、复杂的自动化运维总结Ad-Hoc 是“一次性命令”Playbook 是“标准化剧本”适合重复执行的复杂任务。二、YAML 详解Playbook 采用YAML格式编写。YAML 是一种可读性极高的数据序列化语言它以数据为中心重点描述数据之间的关系非常适合作为配置文件格式。2.1 YAML 的基本规则注释使用#表示注释注释内容不会被执行。文档开始一般建议以---作为文档的开始标记非强制但推荐。键值对使用key: value表示冒号后面必须有一个空格。数组列表使用短横线-表示列表项横线后面也要加空格。缩进使用两个或以上空格表示层级相同层级的缩进必须对齐不能使用 Tab 键。大小写敏感YAML 区分大小写。文件扩展名通常为.yaml或.yml。跨行文本如果需要跨行可以使用折叠为一行或|保留换行符。2.2 YAML 数据样例键值对字典name:张三age:28job:开发工程师数组列表fruits:-Apple-Banana-Orange嵌套结构层级关系通过缩进表示company:name:极客科技departments:-研发部-运维部address:city:北京district:海淀跨行文本description:这是一段很长的描述 会被折叠成一行。preserve:|这是第二段 换行符会被保留。三、Playbook 语法格式一个 Playbook 文件中可以包含一个或多个 Play每个 Play 通常包含以下核心组成部分3.1 基本结构----hosts:目标主机# 指定要执行的主机或主机组remote_user:用户名# 远程执行任务的用户可选vars:# 变量定义可选var_name:valuetasks:# 任务列表核心-name:任务描述模块名:参数:值handlers:# 触发器可选-name:触发器名称模块名:参数:值roles:# 角色高级用法可选-role_name注意列表项前需要加短横线-而列表项的参数前则不需要加短横线。3.2 各组成部分说明hosts必须字段指定要操作的主机可以是 IP、主机名或 Inventory 中定义的主机组如webservers、all。remote_user可选指定远程执行用户默认为当前用户。vars定义变量在 Playbook 中可以使用{{ var_name }}引用。tasks核心任务列表每个任务调用一个 Ansible 模块如yum、copy、service任务按从上到下的顺序执行。handlers定义触发器被notify调用。仅在任务产生变更时才会执行通常用于重启服务。roles通过角色方式组织 Playbook实现代码复用本文暂不展开。3.3 如何运行 Playbook使用ansible-playbook命令执行# 正常执行ansible-playbook playbook.yml# 剧本语法检查没有报错则无语法错误ansible-playbook playbook.yml --syntax-check# 检查语法模拟执行不真正变更ansible-playbook--checkplaybook.yml# 指定额外的变量ansible-playbook playbook.yml-eversion1.0四、简单示例使用ansible playbook部署 Nginx假设我们要在webserver组的全部主机上安装并启动 NginxPlaybook 可以这样写----name:在 Web 服务器上安装并启动 Nginxhosts:webservertasks:-name:安装 Nginxyum:name:nginxstate:present-name:启动 Nginx 并设置开机自启service:name:nginxstate:startedenabled:yes执行ansible-playbook nginx_deploy.yml五、编写高质量 Playbook 的最佳实践给每个 Play 和 Task 起清晰的名字执行时会显示名字方便调试和日志追踪。保持幂等性好的 Playbook 多次运行结果应一致不会因为重复执行而意外改变系统状态。善用变量和模板将可变参数提取为变量使用 Jinja2 模板生成配置文件提高复用性。合理使用 handlers只在必要时如配置变更触发重启避免无效操作。使用--check模式进行测试重大变更前先执行ansible-playbook --check预演确保结果符合预期。缩进统一用空格不用 TabYAML 严格要求建议编辑器设置“用空格替代 Tab”。将 Playbook 纳入版本控制使用 Git 管理 Playbook记录每一次变更便于团队协作和回溯。结语从 Ad-Hoc 命令到 Playbook是从“随意敲命令”到“标准化自动化”的蜕变。Playbook 把繁琐的运维操作变成可读、可复用、可追溯的代码极大提升了运维效率和可靠性。本文从 Ansible Playbook 的基本概念出发详细介绍了 YAML 格式规范、Playbook 的组成结构并通过实际例子演示了如何编写和使用。下一节将介绍ansible 常用模块的playbook使用方法如果你有疑问欢迎留言交流。