完整教程:Ansible Playbook

news/2025/10/1 13:18:15/文章来源:https://www.cnblogs.com/wzzkaifa/p/19122380

一、Ansible Playbook 核心基础

Playbook 是 Ansible 的自动化脚本文件,基于 YAML 格式,用于批量执行任务。其核心价值是将 “零散命令” 组织成 “可复用、可维护的自动化流程”。

1. Playbook 核心结构

一个完整的 Playbook 由多个Play组成,每个Play包含以下关键部分:

组成部分作用说明
Tasks核心执行单元,每个任务调用一个 Ansible 模块(如pingyum),按顺序执行
Variables存储动态数据,让 Playbook 更灵活(如定义软件名、端口号)
Templates基于 Jinja2 模板生成动态配置文件(如 Apache 的httpd.conf
Handlers响应任务变更的 “触发器”(如配置文件修改后重启服务),仅在任务状态为changed时执行
Roles将任务、变量、模板等按功能拆分,实现模块化复用(如 “Web 服务角色”“数据库角色”)
2. 基础 Playbook 示例(含核心语法)
---  # YAML文件标识(可省略)
- name: 部署Web服务  # Play名称(便于识别,可省略)hosts: webservers  # 目标主机组(来自/etc/ansible/hosts)remote_user: root  # 远程执行用户gather_facts: false  # 关闭facts信息收集(加快执行速度,可省略)tasks:  # 任务列表# 任务1:测试主机连通性- name: 测试Ping连通性ping:  # 调用ping模块(无参数)# 任务2:关闭防火墙(忽略执行错误)- name: 停止firewalld服务service: name=firewalld state=stopped  # 模块参数用key=value格式ignore_errors: True  # 忽略任务执行失败(如服务已停止)# 任务3:安装Apache(修改配置后触发Handler)- name: 安装httpdyum: name=httpd state=latest- name: 推送httpd配置文件copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.confnotify: "重启httpd"  # 配置变更时触发同名Handler# 任务4:启动Apache并设为开机自启- name: 启动httpd服务service: name=httpd state=started enabled=truehandlers:  # 触发器列表(仅被notify调用)- name: 重启httpd  # 名称必须与notify完全一致service: name=httpd state=restarted

二、Playbook 关键功能与实操

1. 变量使用(灵活传递数据)

变量可通过 “Play 内定义” 或 “命令行传递”,引用时用{{ 变量名 }}

  • 方式 1:在 Play 内定义变量

    - name: 用变量创建用户和组hosts: dbserversvars:  # 定义变量groupname: mysqlusername: nginxtasks:- name: 创建mysql组group: name={{ groupname }} gid=306- name: 创建nginx用户user: name={{ username }} group={{ groupname }}
  • 方式 2:命令行传递变量(优先级更高)

    ansible-playbook test.yaml -e "username=testuser"  # -e参数指定变量
2. 条件判断(when 指令)

通过when指定 “任务执行的条件”,条件为true时才执行任务,变量无需加{{ }}

- name: 仅特定IP主机执行关机hosts: alltasks:- name: 重启主机command: /sbin/shutdown -r nowwhen: ansible_default_ipv4.address == "192.168.10.14"  # 条件:IP匹配
3. 迭代(循环执行任务)

通过loop(推荐)或with_items实现 “重复执行同一任务”,支持列表、字典格式。

- name: 循环创建目录和用户hosts: dbserverstasks:# 1. 循环创建目录(列表格式)- name: 创建/tmp/test1、/tmp/test2file: path={{ item }} state=directoryloop:  # 等同于with_items- /tmp/test1- /tmp/test2# 2. 循环创建用户(字典格式)- name: 创建test1、test2用户并指定组user: name={{ item.name }} groups={{ item.groups }}loop:- { name: "test1", groups: "wheel" }- { name: "test2", groups: "root" }
4. Templates 模块(动态生成配置)

基于 Jinja2 模板(后缀.j2)生成配置文件,支持嵌入变量。

  • 步骤 1:创建 Jinja2 模板(/opt/httpd.conf.j2)

    Listen {{ http_port }}  # 嵌入变量
    ServerName {{ server_name }}
    DocumentRoot "{{ root_dir }}"
  • 步骤 2:在 Playbook 中使用 Templates 模块

    - name: 动态生成httpd配置hosts: webserverstasks:- name: 推送模板并生成配置template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.confnotify: 重启httpd  # 配置变更时触发重启
  • 步骤 3:在主机清单中定义变量(/etc/ansible/hosts)

    [webservers]
    192.168.10.14 http_port=80 server_name=www.test.com root_dir=/var/www/html
5. Tags 模块(指定执行特定任务)

给任务打 “标签”,执行 Playbook 时通过--tags只运行指定标签的任务,特殊标签always表示 “始终执行”。

- name: 带标签的任务示例hosts: webserverstasks:- name: 复制hosts文件copy: src=/etc/hosts dest=/opt/hoststags: only  # 标签:only- name: 创建测试文件file: path=/opt/test.txt state=touchtags: always  # 标签:始终执行
  • 执行命令
    ansible-playbook test.yaml --tags="only"  # 仅执行标签为only的任务(always任务也会执行)

三、Roles 模块(模块化管理)

Roles 是 Playbook 的 “模块化方案”,将任务、变量、模板等按 “功能” 拆分(如 Web 角色、数据库角色),便于复用和维护。

1. Roles 目录结构(固定格式)

每个角色需按以下目录存放,未用到的目录可省略:

/etc/ansible/roles/  # 默认Roles目录
├── httpd/  # Web服务角色
│   ├── files/  # 存储copy/script模块用到的静态文件
│   ├── templates/  # 存储Jinja2模板文件
│   ├── tasks/  # 任务列表(必须有main.yml)
│   ├── handlers/  # 触发器(必须有main.yml)
│   ├── vars/  # 角色变量(必须有main.yml)
│   ├── defaults/  # 默认变量(优先级最低,必须有main.yml)
│   └── meta/  # 角色依赖、作者等信息(必须有main.yml)
└── mysql/  # 数据库服务角色(结构同上)
2. Roles 实操步骤(以部署 LAMP 为例)
步骤 1:创建 Roles 目录结构
# 创建httpd、mysql、php角色目录
mkdir -p /etc/ansible/roles/{httpd,mysql,php}/{files,templates,tasks,handlers,vars,defaults,meta}
# 创建各角色的main.yml文件(固定文件名)
touch /etc/ansible/roles/{httpd,mysql,php}/{tasks,vars,handlers,defaults,meta}/main.yml
步骤 2:编写各角色的任务与变量
  • httpd 角色(安装并启动 Apache)

    # /etc/ansible/roles/httpd/tasks/main.yml
    - name: 安装httpdyum: name={{ pkg }} state=latest
    - name: 启动httpd并设为开机自启service: name={{ svc }} state=started enabled=true
    # /etc/ansible/roles/httpd/vars/main.yml(角色变量)
    pkg: httpd
    svc: httpd
  • mysql 角色(安装并启动 MariaDB)

    # /etc/ansible/roles/mysql/tasks/main.yml
    - name: 安装MariaDByum: name={{ pkg }} state=latest
    - name: 启动MariaDBservice: name={{ svc }} state=started enabled=true
    # /etc/ansible/roles/mysql/vars/main.yml
    pkg:- mariadb- mariadb-server
    svc: mariadb
步骤 3:编写总 Playbook(调用 Roles)

创建site.yml,按主机组分配角色:

# /etc/ansible/site.yml
---
- name: 给Web服务器部署LAMPhosts: webserversremote_user: rootroles:  # 调用角色(按顺序执行)- httpd- mysql- php
步骤 4:执行 Roles
cd /etc/ansible
ansible-playbook site.yml  # 执行总Playbook

四、Playbook 常用命令

命令用途命令示例
运行 Playbookansible-playbook test.yaml
检查语法错误ansible-playbook test.yaml --syntax-check
查看任务列表ansible-playbook test.yaml --list-task
查看目标主机ansible-playbook test.yaml --list-hosts
从指定任务开始执行ansible-playbook test.yaml --start-at-task='安装httpd'
输入 SSH 密码执行ansible-playbook test.yaml -k
输入 sudo 密码执行ansible-playbook test.yaml -K

扩展

在 Ansible 中,组嵌套(Group Nesting) 是指在主机清单(Inventory)中,将一个组作为另一个组的成员,形成层级关系的组织方式。通过组嵌套,可以更灵活地管理不同层级、不同功能的主机集合,简化 Playbook 中目标主机的指定。

组嵌套的核心作用
  1. 层级化管理主机:将主机按 “父组 - 子组” 的逻辑分类(如按业务线→部门→功能划分)。
  2. 简化目标指定:执行任务时,指定父组即可对其包含的所有子组主机生效,无需逐个列出。
示例(主机清单 hosts 文件)
# 定义子组(具体功能组)
[webservers]
192.168.10.11
192.168.10.12
[dbservers]
192.168.10.21
192.168.10.22
# 定义父组(嵌套子组),使用 :children 标识
[prod:children]  # prod组包含以下子组
webservers       # 嵌套webservers子组
dbservers        # 嵌套dbservers子组
[all_servers:children]  # 更大的父组,可包含多个子组/父组
prod
testservers  # 假设还有testservers子组
使用场景
  • 执行命令时,指定父组 prod 即可操作其包含的所有子组主机:
    ansible prod -m ping  # 对webservers和dbservers的所有主机执行ping测试
  • Playbook 中指定父组作为目标:
    - name: 部署生产环境所有服务hosts: prod  # 涵盖webservers和dbserverstasks: ...

通过组嵌套,能有效减少重复配置,尤其适合主机数量多、分类复杂的场景(如多环境、多业务线的企业级部署)。

在 Ansible 中,Handlers(处理器) 是一种特殊的任务,它不会主动执行,而是被其他任务通过 notify 指令触发触发,通常用于响应配置变更后的操作(如服务重启、进程重载等)。它的核心价值是:仅在相关任务产生 “变更” 时才执行,避免无意义的重复操作(例如配置文件未修改时,无需重启服务)。

Handlers 的核心特性
  1. 被动触发:Handlers 定义的任务不会默认执行,必须被其他任务的 notify 指令调用。
  2. 条件执行:只有当触发它的任务执行状态为 changed(配置有实际变更)时,Handlers 才会执行。
  3. 合并执行:多个任务触发同一个 Handler 时,Handler 只会在当前 Play 的所有普通任务执行完毕后运行一次(避免重复操作)。
Handlers 的基本用法
定义 Handlers

Handlers 通常在 Playbook 的 handlers 区块中定义,语法与普通任务完全一致(调用 Ansible 模块),但必须指定唯一的 name(用于被 notify 匹配)。

触发 Handlers

在普通任务中通过 notify: "Handler名称" 指令触发,名称必须与 Handlers 中定义的 name 完全一致(区分大小写)。

notify:notify 是 Ansible 中连接 “任务变更” 与 “后续响应操作” 的桥梁

示例:配置文件变更后重启服务
---
- name: 部署Nginx并自动重启hosts: webserverstasks:# 任务1:安装Nginx(无变更时不会触发Handler)- name: 安装Nginxyum: name=nginx state=latest# 任务2:推送Nginx配置文件(配置变更时触发Handler)- name: 复制Nginx配置文件copy:src: /opt/nginx.confdest: /etc/nginx/nginx.confnotify: "重启Nginx服务"  # 配置变更时触发同名Handler# 任务3:启动Nginx(首次执行时启动,后续不重复操作)- name: 确保Nginx服务启动service: name=nginx state=started# 定义Handlers(触发后执行的任务)handlers:- name: 重启Nginx服务  # 名称必须与notify完全匹配service: name=nginx state=restarted

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/923878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费招聘的网站自己的网站什么做优化

我的施工之路Python 绘图入门这是施工系列第18篇,同时也进入到一个新的阶段:Python绘图篇。作为绘图模块的第一篇,与大家一起过过最基本的Python绘图原理。掌握基本的绘图原理很有必要,各个常用绘图库的原理基本都是相通的。所以了…

做企业云网站的企业邮箱丰都网站建设公司

Web页面中的特殊效果,如菜单效果,对话框效果都需要通过定位属性来实现。定位样式position属性可以控制元素的定位类型position属性值可以为sataic、fixed、absolute、relativeposition属性的语法结构- position:value;定位属性static默认值。没有定位&am…

深圳做分销网站的公司大学生心里健康网站设计与建设

深入理解Linux守护进程Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户。提供这些服务的程序是由运行在后台的守护进程(daemons)来执行的。守护进程是生存期长的…

完整教程:Word和WPS文字中的自动编号和文字间距过大怎么办?

完整教程:Word和WPS文字中的自动编号和文字间距过大怎么办?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

没有网站怎样做外贸wordpress文章换行符

前面我们看到的代码都是顺序执行的,也就是先执行第一条语句,然后是第二条、第三条……一直到最后一条语句,这称为顺序结构。 但是对于很多情况,顺序结构的代码是远远不够的,这时我们就要使用判断语句即if else语句。 …

珠海哪里学网站开发拓者设计吧官网app

计算机专业毕业后大致的工作方向是软、硬、网、图 四大类 尤其以软件、网络为现今的首选 从岗位上分,又可以分为技术道路、营销道路两大方向 if 你选择作技术,then 从现在开始,牢记: 天道酬勤!!&#xff…

制作网站首先做的工作重庆网站排名优化教程

系统配置:Windows XP 32位R 3.1.1一、安装RMySQL:1,安装RTools并配置环境变量:我的电脑——属性——高级——环境变量,在系统变量一栏中选择PATH,点击编辑,在后面添加RTools的路径(如:D:\Rtools\bin;D:\Rtools\gcc-4.6.3\bin;D:\R…

做网站需要购买服务器吗wordpress 果酱小程序

13 集合 实现方法时,不同的数据结构会导致性能有很大差异。 13.1 集合接口 Java集合类库将接口(interface)与实现(implementation)分离。 可以使用接口类型存放集合的应用,一旦改变了想法,可…

NOIP2025模拟赛28

T1 T2 T3 T4\(\color{#52C41A} 普及+/提高\) \(\color {#3498DB} 提高+/省选-\) \(\color {#3498DB} 提高+/省选-\) \(\color{#9D3DCF} 省选/NOI-\)参赛网址:https://oj.33dai.cn/d/TYOI/contest/68a2efb9c5d9c2f14c2…

markdown笔记文件批量打上时间戳

解决了给一个文件夹(包含子文件夹)下的所有.md文件在最前面添加时间戳。 例如`Typora 笔记迁移 Obsidian 图片链接处理.md`修改为`20251001-Typora 笔记迁移 Obsidian 图片链接处理` 打上时间戳的笔记能够更好配合笔…

微服务调整中心高可用设计:从踩坑到落地的实战指南(二)

微服务调整中心高可用设计:从踩坑到落地的实战指南(二)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

NOIP2025模拟赛30

T1 T2 T3 T4\(\color{#52C41A} 普及+/提高\) \(\color{#52C41A} 普及+/提高\) \(\color{#9D3DCF} 省选/NOI-\) \(\color{#9D3DCF} 省选/NOI-\)参赛网址:https://oj.33dai.cn/d/TYOI/contest/68abe2d6c5d9c2f14c2cd7d2…

制作一个网站的全过程wordpress 手机 图片不显示

入门数字设计的时候,跨时钟域的数据处理是绕不开的课题,特别是多比特数据跨时钟域时,都会采用异步FIFO的方法。 异步FIFO中涉及较多的考点这里记录几个以供大家参考。 1. 异步FIFO的空满判断分别在哪个域? 根据异步FIFO的结构&…

dede采集规则下载网站爱给网官网免费素材

https://github.com/yechens/NL2SQL Text2SQL 语义解析数据集、解决方案、paper资源整合项目

图文讲解k8s中Service、Selector、EndpointSlice的运行原理 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

怎么做义工网站去河南省住房和城乡建设厅网站查

下载ssh https://github.com/PowerShell/Win32-OpenSSH/releases 然后把它放入 C:\Program Files 中 添加环境变量 高级系统设置-》高级-》环境变量-》 是用户变量 不是系统变量 选择 path- 然后点击编辑,然后新建, 把刚才的地址放进去 C:\Program F…

2025西安品牌新房,西安刚需新房,陕西优质新房住宅推荐,地建嘉信臻境,超2000㎡高端会所,满足多元化生活需求

2025西安品质新房推荐:地建嘉信臻境,开启理想人居新篇章 在西安这座充满活力与机遇的城市,寻找一处理想的新房成为许多人的梦想。今天,为大家推荐一个备受瞩目的项目——地建嘉信臻境,它将为您带来前所未有的居住…

公司网站主页设计网络销售怎么做才能做好

思科设备参考:路由引入实验(思科) 技术简介 路由引入技术在网络通信中起着重要的作用,能够实现不同路由协议之间的路由传递,并在路由引入时部署路由控制,实现路径或策略的控制 实验目的 不同的路由协议之…

2025年未央区高端楼盘,西咸新区品质楼盘,西安高新品牌楼盘住宅口碑推荐,地建嘉信臻境周边配套丰富,教育医疗商业齐全

地建嘉信臻境:沣东文商板块的品质之选 地建嘉信臻境项目由拥有二十余年地产开发经验的团队运营,作为地建嘉信深耕陕西6年、布局6城8盘的第八座作品,以国企担当为依托,致力于革新沣东区域的生活范本。项目位于沣东文…