当前位置: 首页 > news >正文

完整教程:Ansible Playbook

一、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.jsqmd.com/news/6784/

相关文章:

  • 完整教程:Word和WPS文字中的自动编号和文字间距过大怎么办?
  • NOIP2025模拟赛28
  • markdown笔记文件批量打上时间戳
  • 微服务调整中心高可用设计:从踩坑到落地的实战指南(二)
  • 十月数据结构题没做
  • NOIP2025模拟赛30
  • 图文讲解k8s中Service、Selector、EndpointSlice的运行原理 - 详解
  • 2025西安品牌新房,西安刚需新房,陕西优质新房住宅推荐,地建嘉信臻境,超2000㎡高端会所,满足多元化生活需求
  • 2025年未央区高端楼盘,西咸新区品质楼盘,西安高新品牌楼盘住宅口碑推荐,地建嘉信臻境周边配套丰富,教育医疗商业齐全
  • copyparty.exe 怎么用?局域网文件共享工具安装与运行教程
  • 2025西安高端新房,西安优质新房,西安品牌新房住宅推荐,地建嘉信臻境,沣东文商板块门户,享双地铁便利
  • 2025年西安洋房楼盘,陕西优质楼盘,西咸新区现房楼盘住宅口碑推荐,地建嘉信臻境超2000㎡高端会所,功能多样
  • Python 闭包的应用场景与实战案例
  • STM32 智能垃圾桶项目笔记(二):超声波测距功能实现 - 指南
  • 通过配置 GitLab 自动触发项目自动化构建与部署 - 指南
  • 双网卡服务器校园网访问故障排查与解决​ - 教程
  • US$9 TF Card 4GB Flash Memory Card Can Work on Ksuite
  • 详细介绍:MySQL备份策略核心知识点总结
  • input() 函数
  • 近期
  • Playwright MCP 的使用与调试技巧
  • 详细介绍:手把手教你用 ESP32 接入 OneNet 平台(MQTT 方式)
  • 完整教程:Python学习历程——组织结构(包含for、if、while等等)
  • Nginx 反向代理、负载均衡与 Keepalived 高可用 - 实践
  • 文件上传攻击全面指南:从侦察到防御
  • 2025年陕西洋房楼盘,西安城西品质楼盘,沣东品牌楼盘住宅口碑推荐,地建嘉信臻境户型多元布局,满足全周期生活需求
  • asus nuc15 pro ultra7 255H 外接 fevm 雷电5显卡坞 BIOS设置
  • P11529 [THUPC 2025 初赛] 辞甲猾扎
  • 2025年陕西品牌楼盘,西安城西优质楼盘,西咸新区核心楼盘住宅口碑推荐,地建嘉信臻境距吾悦广场一路之隔,商业配套完善
  • ARC113E Rvom and Rsrev