Ansible Playbook 入门指南:从基础到实战
文章目录
- [Ansible Playbook 入门指南:从基础到实战](#Ansible Playbook 入门指南:从基础到实战)
-
- [一、Playbook 基本结构](#一、Playbook 基本结构)
- [二、Playbook 运行与常用参数](#二、Playbook 运行与常用参数)
- 三、核心功能详解
-
- [1. 变量与引用](#1. 变量与引用)
- [2. 条件判断(when)](#2. 条件判断(when))
- [3. 迭代(loop/with_items)](#3. 迭代(loop/with_items))
- [4. 模板(Templates)](#4. 模板(Templates))
- [5. 标签(Tags)](#5. 标签(Tags))
- [四、Roles 模块化组织](#四、Roles 模块化组织)
-
- [使用 Roles 的步骤:](#使用 Roles 的步骤:)
- 五、总结
Ansible 作为一款强大的自动化运维工具,其核心功能之一便是通过 Playbook 实现任务的批量自动化执行。本文将从 Playbook 的基本结构讲起,逐步深入到变量、条件判断、迭代等高级用法,最后介绍 Roles 模块的使用,帮助你快速掌握 Playbook 的编写与应用。
一、Playbook 基本结构
Ansible Playbook 是一个 YAML 格式的文件,由多个 Play 组成,每个 Play 针对指定主机组执行一系列任务。其核心组成部分包括:
- Tasks:任务列表,每个任务调用 Ansible 模块执行具体操作
- Variables:变量定义,提升 Playbook 的灵活性
- Templates:基于 Jinja2 模板动态生成配置文件
- Handlers:响应任务状态变化的触发操作(如服务重启)
- Roles:模块化组织任务、变量等资源,便于复用
一个简单的 Playbook 示例:
yaml
---
- name: 部署 Web 服务
hosts: webservers # 目标主机组
remote_user: root # 执行用户
tasks:
- name: 测试主机连通性
ping:
- name: 安装 httpd
yum: name=httpd state=latest
- name: 启动 httpd 服务
service: name=httpd state=started enabled=true
handlers:
- name: 重启 httpd
service: name=httpd state=restarted
二、Playbook 运行与常用参数
编写完成后,通过 ansible-playbook
命令运行 Playbook,常用参数如下:
bash
# 基本运行
ansible-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 密码或 sudo 密码
ansible-playbook test.yaml -k # SSH 密码
ansible-playbook test.yaml -K # sudo 密码
三、核心功能详解
1. 变量与引用
变量可通过 vars
关键字定义,或通过命令行 -e
参数传递,使用 {``{ 变量名 }}
引用:
yaml
- name: 创建用户和组
hosts: dbservers
vars:
groupname: mysql
username: nginx
tasks:
- name: 创建 mysql 组
group: name={{ groupname }} system=yes
- name: 创建 nginx 用户
user: name={{ username }} group={{ groupname }}
命令行传递变量:
bash
ansible-playbook test.yaml -e "username=apache"
2. 条件判断(when)
使用 when
关键字实现条件执行,根据主机信息或变量值决定是否执行任务:
yaml
- hosts: all
tasks:
- name: 仅在 192.168.10.14 执行关机
command: /sbin/shutdown -r now
when: ansible_default_ipv4.address == "192.168.10.14"
3. 迭代(loop/with_items)
通过 loop
或 with_items
实现循环操作,批量处理同类任务:
yaml
- name: 批量创建目录和用户
hosts: dbservers
tasks:
- name: 创建测试目录
file:
path: "{{ item }}"
state: directory
loop:
- /tmp/test1
- /tmp/test2
- name: 创建带组的用户
user: name={{ item.name }} groups={{ item.groups }}
loop:
- { name: 'test1', groups: 'wheel' }
- { name: 'test2', groups: 'root' }
4. 模板(Templates)
利用 Jinja2 模板动态生成配置文件,步骤如下:
- 创建
.j2
模板文件(如httpd.conf.j2
):
ini
Listen {{ http_port }}
ServerName {{ server_name }}
- 在主机清单定义变量:
ini
[webservers]
192.168.10.14 http_port=80 server_name=www.example.com
- 在 Playbook 中使用
template
模块:
yaml
- name: 部署 httpd 配置
template:
src: /opt/httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
notify: 重启 httpd
5. 标签(Tags)
通过 tags
标记任务,实现指定任务的执行:
yaml
- hosts: webservers
tasks:
- name: 复制 hosts 文件
copy: src=/etc/hosts dest=/opt/hosts
tags: only
- name: 创建测试文件
file: path=/opt/test state=touch
tags: always # 始终执行
执行指定标签的任务:
bash
ansible-playbook test.yaml --tags="only"
四、Roles 模块化组织
当 Playbook 变得复杂时,Roles 提供了模块化的组织方式,其目录结构如下:
roles/
├── httpd/
│ ├── files/ # 静态文件
│ ├── templates/ # 模板文件
│ ├── tasks/ # 任务(main.yml 为主入口)
│ ├── handlers/ # 处理器
│ ├── vars/ # 变量
│ ├── defaults/ # 默认变量
│ └── meta/ # 依赖关系
使用 Roles 的步骤:
- 创建 Roles 目录结构(以 httpd 为例):
bash
mkdir -p /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}
touch /etc/ansible/roles/httpd/{tasks,handlers,vars}/main.yml
- 编写任务(
tasks/main.yml
):
yaml
- name: 安装 httpd
yum: name={{ pkg }} state=latest
- name: 启动 httpd
service: name={{ svc }} state=started enabled=true
- 定义变量(
vars/main.yml
):
yaml
pkg: httpd
svc: httpd
- 在 site.yml 中引用 Roles:
yaml
---
- hosts: webservers
roles:
- httpd
- mysql
- 运行 Playbook:
bash
ansible-playbook /etc/ansible/site.yml
五、总结
Ansible Playbook 通过 YAML 格式的结构化配置,实现了运维任务的自动化与可复用。从简单的单任务执行,到利用变量、条件、迭代等功能处理复杂场景,再到通过 Roles 实现模块化管理,Playbook 为自动化运维提供了灵活而强大的支持。掌握 Playbook 的编写技巧,能显著提升运维效率,减少人为操作失误,是 DevOps 实践中的重要工具。