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