目录
[1 YAML基础概念](#1 YAML基础概念)
[1.1 什么是YAML?](#1.1 什么是YAML?)
[1.2 YAML与Ansible的关系](#1.2 YAML与Ansible的关系)
[2 YAML基本语法结构](#2 YAML基本语法结构)
[2.1 文档结构](#2.1 文档结构)
[2.2 键值对(Mappings)](#2.2 键值对(Mappings))
[2.3 列表(Sequences)](#2.3 列表(Sequences))
[2.4 复合结构](#2.4 复合结构)
[3 YAML在Ansible中的特殊用法](#3 YAML在Ansible中的特殊用法)
[3.1 多行字符串处理](#3.1 多行字符串处理)
[3.2 变量嵌入](#3.2 变量嵌入)
[3.3 锚点与引用](#3.3 锚点与引用)
[4 Ansible Playbook中的YAML模式](#4 Ansible Playbook中的YAML模式)
[4.1 Playbook基本结构](#4.1 Playbook基本结构)
[4.2 任务执行的YAML表示](#4.2 任务执行的YAML表示)
[4.3 条件与循环的YAML写法](#4.3 条件与循环的YAML写法)
[5 YAML高级特性在Ansible中的应用](#5 YAML高级特性在Ansible中的应用)
[5.1 复杂变量结构](#5.1 复杂变量结构)
[5.2 模板引擎集成](#5.2 模板引擎集成)
[5.3 动态内容生成](#5.3 动态内容生成)
[6 YAML编写实践建议](#6 YAML编写实践建议)
[6.1 格式规范](#6.1 格式规范)
[6.2 可读性优化](#6.2 可读性优化)
[6.3 验证与调试](#6.3 验证与调试)
[7 常见YAML陷阱与解决方案](#7 常见YAML陷阱与解决方案)
[7.1 缩进错误](#7.1 缩进错误)
[7.2 布尔值解析](#7.2 布尔值解析)
[7.3 特殊字符处理](#7.3 特殊字符处理)
[8 Ansible YAML案例示例](#8 Ansible YAML案例示例)
[8.1 多环境配置管理](#8.1 多环境配置管理)
[8.2 复杂任务编排](#8.2 复杂任务编排)
[8.3 Role中的YAML使用](#8.3 Role中的YAML使用)
[9 总结](#9 总结)
1 YAML基础概念
1.1 什么是YAML?
YAML(YAML Ain't Markup Language)是一种人类可读的数据序列化标准,广泛用于配置文件和数据交换。在Ansible生态中,YAML是Playbook的编写语言,因其简洁性和可读性而成为自动化运维的理想选择。
YAML核心特点:
- 可读性强:使用缩进和自然语言风格的结构
- 兼容性好:与JSON完全兼容,可以转换为JSON
- 表达丰富:支持复杂数据结构
- 跨语言:几乎所有编程语言都有YAML解析器
1.2 YAML与Ansible的关系
在Ansible中,几乎所有的配置文件都使用YAML格式:
- Playbook文件(.yml/.yaml)
- Inventory文件
- 变量定义文件
- Role定义文件
2 YAML基本语法结构
2.1 文档结构
-
YAML文档以 --- 开头,可选的以 ... 结束:
这是一个YAML文档
document: content
...
2.2 键值对(Mappings)
-
基本键值对结构:
key: value
-
嵌套结构:
parent:
child1: value1
child2: value2
2.3 列表(Sequences)
-
使用短横线 - 表示列表项:
fruits:
- Apple
- Orange
- Banana
2.4 复合结构
-
YAML支持复杂的嵌套结构:
servers:
- name: web01
ip: 192.168.1.10
ports:
- 80
- 443
- name: db01
ip: 192.168.1.20
ports:
- 3306
3 YAML在Ansible中的特殊用法
3.1 多行字符串处理
-
折叠风格(>):将多行合并为单行,保留换行符为空格
description: >
This is a long
description that
will be folded -
字面风格(|):保留所有换行符
script: |
#!/bin/bash
echo "Hello"
echo "World"
3.2 变量嵌入
-
在Ansible中,使用 {{ }} 嵌入变量:
message: "Hello {{ username }}"
3.3 锚点与引用
-
使用 & 定义锚点, * 引用锚点:
defaults: &defaults
port: 80
timeout: 30server1:
<<: *defaults
host: server1.example.comserver2:
<<: *defaults
host: server2.example.com
4 Ansible Playbook中的YAML模式
4.1 Playbook基本结构
---
- name: Play名称
hosts: target_hosts
vars:
variable1: value1
tasks:
- name: 任务描述
module:
parameter1: value1
parameter2: value2
4.2 任务执行的YAML表示

流程说明:
- 定义Play作用的主机组(hosts)
- 设置变量(vars)
- 按顺序执行任务列表(tasks)
- 每个任务调用特定模块(module)并传递参数(parameters)
4.3 条件与循环的YAML写法
-
条件判断:
tasks:
- name: 仅Ubuntu安装
apt:
name: nginx
when: ansible_os_family == "Debian" -
循环:
tasks:
- name: 添加多个用户
user:
name: "{{ item }}"
state: present
loop:
- user1
- user2
- user3
5 YAML高级特性在Ansible中的应用
5.1 复杂变量结构
network_config:
interfaces:
- name: eth0
ip: 192.168.10.10
netmask: 255.255.255.0
- name: eth1
ip: 10.0.0.10
netmask: 255.0.0.0
5.2 模板引擎集成
-
YAML与Jinja2模板引擎结合:
template: "{{ lookup('file', '/templates/' + os_type + '.j2') }}"
5.3 动态内容生成
users: "{{ query('inventory_hostnames', 'web*') | map('extract', hostvars, 'user') | list }}"
6 YAML编写实践建议
6.1 格式规范
- 缩进:使用2个空格(Ansible官方推荐)
- 字符串引号:仅在必要时使用引号
- 行长度:建议不超过80个字符
- 注释:使用#,与内容保持相同缩进
6.2 可读性优化
-
不好的写法:
- name: 安装包
apt: name={{item}} state=present
with_items: [pkg1,pkg2,pkg3]
- name: 安装包
-
好的写法:
- name: 安装包
apt:
name: "{{ item }}"
state: present
loop:- pkg1
- pkg2
- pkg3
- name: 安装包
6.3 验证与调试
-
语法验证:
ansible-playbook --syntax-check playbook.yml
- YAML解析工具 :
- yamllint
- python -c 'import yaml, sys; yaml.safe_load(sys.stdin)' < file.yml
- VSCode插件 :
- YAML by Red Hat
- Ansible Extension
7 常见YAML陷阱与解决方案
7.1 缩进错误
-
问题:
tasks:
- name: 错误示例
debug: # 缩进不一致
msg: "Hello"
- name: 错误示例
-
解决:统一使用2个空格缩进
7.2 布尔值解析
-
问题:
enabled: yes # 可能被解析为字符串
-
解决:
enabled: true # 显式布尔值
7.3 特殊字符处理
-
问题:
message: This is a string: with colon
-
解决:
message: "This is a string: with colon" # 使用引号
8 Ansible YAML案例示例
8.1 多环境配置管理
---
# production.yml
- name: 生产环境配置
hosts: prod
vars:
db_host: db.prod.example.com
cache_size: 2048
tasks:
- name: 部署配置
template:
src: templates/config.j2
dest: /etc/app/config.ini
8.2 复杂任务编排
---
- name: 数据库备份与轮转
hosts: dbservers
tasks:
- name: 检查磁盘空间
command: df -h
register: disk_space
- name: 执行备份
command: mysqldump -u root db > /backups/db-{{ ansible_date_time.date }}.sql
when: "'/backups' in disk_space.stdout"
- name: 清理旧备份
find:
paths: /backups
patterns: "db-*.sql"
age: "7d"
register: old_backups
- name: 删除旧备份
file:
path: "{{ item.path }}"
state: absent
loop: "{{ old_backups.files }}"
8.3 Role中的YAML使用
-
roles/webserver/tasks/main.yml:
-
name: 安装Nginx
apt:
name: nginx
state: present -
name: 配置Nginx
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: 重启Nginx
-
9 总结
通过本文,我们学习了解了:
- YAML基础语法:键值对、列表、复合结构等核心概念
- Ansible特有用例:多行字符串、变量嵌入、锚点引用等
- Playbook结构:Play、Task、Handler的YAML表示方法
- 高级特性:复杂变量、模板集成、动态内容生成
- 最佳实践:格式规范、可读性优化、验证调试方法
- 常见问题:缩进错误、布尔值解析、特殊字符处理
- 实战案例:多环境配置、复杂任务编排、Role应用
YAML作为Ansible Playbook的基础,其正确使用直接关系到自动化运维的效果。掌握YAML语法不仅能编写出更优雅的Playbook,还能避免许多常见的配置错误。