Ansible Playbook编写详细教程
1. Ansible Playbook简介
Ansible Playbook是自动化任务的核心组件,使用YAML格式编写,用于定义配置管理、应用部署、任务编排等操作。Playbook通过模块化的方式描述系统状态和任务执行顺序,具有幂等性(多次执行结果一致)的特点。
2. Playbook基础结构
Playbook的基本组成
Hosts: 定义目标主机组
Tasks: 要执行的具体任务列表
Variables: 自定义变量(可选)
Handlers: 任务触发器(可选)
示例基础结构
---
- name: Playbook名称
hosts: 目标主机组
vars:
variable_name: value
tasks:
- name: 任务描述
module_name:
parameter1: value1
parameter2: value2
handlers:
- name: 处理器名称
module_name:
parameter: value
3. 编写第一个Playbook
创建inventory文件
# inventory.ini
[webservers]
192.168.1.10
192.168.1.11
[database]
192.168.1.20
编写基础Playbook
---
- name: 配置Nginx服务器
hosts: webservers
become: yes
tasks:
- name: 安装Nginx
apt:
name: nginx
state: present
update_cache: yes
- name: 启动Nginx服务
service:
name: nginx
state: started
enabled: yes
执行命令
ansible-playbook -i inventory.ini nginx_setup.yml
4. 使用变量
定义变量方式
在Playbook中直接定义
在单独的变量文件中定义
通过命令行传递变量
变量文件示例
# vars/nginx_vars.yml
nginx_port: 8080
nginx_root: "/var/www/html"
使用变量
---
- name: 配置Nginx
hosts: webservers
vars_files:
- vars/nginx_vars.yml
tasks:
- name: 配置Nginx端口
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: 重启Nginx
handlers:
- name: 重启Nginx
service:
name: nginx
state: restarted
5. 条件判断与循环
条件判断示例
tasks:
- name: 安装Apache (仅限Ubuntu)
apt:
name: apache2
state: present
when: ansible_distribution == "Ubuntu"
循环示例
tasks:
- name: 创建多个用户
user:
name: "{{ item }}"
state: present
loop:
- user1
- user2
- user3
复杂循环
tasks:
- name: 安装多个包
apt:
name: "{{ item.name }}"
state: "{{ item.state }}"
loop:
- { name: 'nginx', state: 'present' }
- { name: 'mysql-server', state: 'latest' }
6. 模板与文件处理
Jinja2模板示例
# templates/nginx.conf.j2
server {
listen {{ nginx_port }};
root {{ nginx_root }};
location / {
index index.html;
}
}
文件复制与权限设置
tasks:
- name: 复制配置文件
copy:
src: files/app.conf
dest: /etc/app/app.conf
owner: root
group: root
mode: '0644'
- name: 创建目录
file:
path: /var/www/myapp
state: directory
mode: '0755'
7. 错误处理
忽略错误
tasks:
- name: 尝试删除文件
file:
path: /tmp/nonexistent
state: absent
ignore_errors: yes
失败处理
tasks:
- name: 关键服务检查
command: /usr/bin/systemctl is-active critical-service
register: service_status
failed_when: service_status.rc != 0
重试机制
tasks:
- name: 重试下载文件
get_url:
url: "http://example.com/file.zip"
dest: "/tmp/file.zip"
retries: 3
delay: 10
until: download_result is succeeded
8. 高级技巧
角色组织结构
roles/
└── nginx/
├── tasks/
│ └── main.yml
├── handlers/
│ └── main.yml
├── templates/
│ └── nginx.conf.j2
├── vars/
│ └── main.yml
└── defaults/
└── main.yml
使用角色
---
- name: 配置Web服务器
hosts: webservers
roles:
- { role: nginx, nginx_port: 8080 }
- common
动态包含任务
tasks:
- include_tasks: tasks/setup_{{ ansible_os_family }}.yml
9. 调试与测试
语法检查
ansible-playbook --syntax-check playbook.yml
测试模式(不执行修改)
ansible-playbook --check playbook.yml
详细输出
ansible-playbook -v playbook.yml
ansible-playbook -vvvv playbook.yml # 超详细输出
10. 总结
通过本教程,我们系统学习了Ansible Playbook的核心概念和编写技巧:
掌握了Playbook的基本结构与YAML语法
学会了使用变量、条件判断和循环实现动态配置
理解了模板系统如何实现配置文件管理
掌握了错误处理机制提高任务可靠性
了解了角色组织方式实现代码复用
学习了调试与测试方法保障自动化质量
Ansible Playbook的强大之处在于其声明式语法和模块化设计,能够以可读性高、可维护性强的方式管理复杂系统。建议从简单任务开始实践,逐步构建企业级自动化体系。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。





