Ansible Playbook 示例:安装并配置 Nginx
以下是一个完整的 Ansible Playbook,用于在目标主机上安装 Nginx,并配置一个简单的静态网站。
---
- name: Install and Configure Nginx
hosts: web_servers # 目标主机组(在 inventory 文件中定义)
become: yes # 使用 sudo 权限执行任务
vars:
nginx_port: 80 # 定义变量:Nginx 监听端口
web_root: /var/www/html # 网站根目录
tasks:
# 1. 安装 Nginx
- name: Install Nginx
apt: # 如果是 CentOS/RHEL,改为 `yum` 模块
name: nginx
state: present
update_cache: yes # 更新 apt 缓存(类似 apt update)
when: ansible_os_family == 'Debian' # 仅适用于 Debian/Ubuntu
- name: Install Nginx (for RedHat)
yum:
name: nginx
state: present
when: ansible_os_family == 'RedHat' # 仅适用于 CentOS/RHEL
# 2. 创建网站根目录
- name: Create web root directory
file:
path: "{{ web_root }}"
state: directory
mode: '0755' # 设置目录权限
# 3. 部署静态网页(示例)
- name: Copy index.html
copy:
content: |
<html>
<body>
<h1>Welcome to Ansible-Managed Nginx!</h1>
</body>
</html>
dest: "{{ web_root }}/index.html"
mode: '0644' # 设置文件权限
# 4. 配置 Nginx(使用模板)
- name: Configure Nginx
template:
src: nginx.conf.j2 # Jinja2 模板文件
dest: /etc/nginx/nginx.conf
mode: '0644'
notify: Restart Nginx # 触发 Handler(配置文件变更后重启 Nginx)
# 5. 启动并启用 Nginx 服务
- name: Ensure Nginx is running and enabled
service:
name: nginx
state: started
enabled: yes # 开机自启
handlers:
# 定义 Handler:当 Nginx 配置变更时触发重启
- name: Restart Nginx
service:
name: nginx
state: restarted关键代码解析
1. Playbook 结构
hosts: web_servers
指定目标主机组(需在inventory文件中定义,例如[web_servers])。become: yes
使用sudo权限执行任务(等同于ansible-playbook -b)。
2. 变量定义(vars)
nginx_port和web_root是自定义变量,可以在 Playbook 中复用,方便后续修改。
3. 任务分解(tasks)
- 任务1:安装 Nginx
- 使用
apt(Debian/Ubuntu)或yum(CentOS/RHEL)模块安装 Nginx。 when条件判断操作系统类型,实现多平台兼容。
- 使用
- 任务2:创建网站目录
- 使用
file模块创建目录,并设置权限为755。
- 使用
- 任务3:部署静态网页
- 使用
copy模块直接生成一个简单的index.html文件。
- 使用
- 任务4:配置 Nginx
- 使用
template模块动态生成配置文件(需提前准备nginx.conf.j2模板文件)。
- 使用
- 任务5:启动服务
- 使用
service模块启动 Nginx 并设置开机自启。
- 使用
4. Handler(handlers)
Restart Nginx
当 Nginx 配置文件变更时(由template任务触发notify),自动重启服务。
注意:Handler 只在任务实际变更时触发,不会重复执行。
配套文件:nginx.conf.j2(Jinja2 模板)
创建一个模板文件 nginx.conf.j2,内容如下(动态插入变量 nginx_port 和 web_root):
user www-data;
worker_processes auto;
events {
worker_connections 1024;
}
http {
server {
listen {{ nginx_port }}; # 使用变量
root {{ web_root }}; # 使用变量
location / {
index index.html;
}
}
}如何使用这个 Playbook?
准备 Inventory 文件
创建inventory.ini,定义目标主机:[web_servers] server1 ansible_host=192.168.1.100 server2 ansible_host=192.168.1.101运行 Playbook
ansible-playbook -i inventory.ini deploy_nginx.yml验证结果
访问http://目标服务器IP,看到 “Welcome to Ansible-Managed Nginx!” 即表示成功。
面试加分点
- 模块化设计:将配置(如端口、路径)抽离为变量,便于维护。
- 多平台支持:通过
when条件适配不同 Linux 发行版。 - 幂等性:Ansible 任务天然支持幂等(多次执行不会重复变更)。
- Handler 机制:优雅处理服务重启,避免不必要的操作。
如果需要更复杂的配置(如 HTTPS、负载均衡),可以扩展模板文件和 Playbook 任务。
作者:liupeng 创建时间:2023-09-22 08:35
最后编辑:严锋 更新时间:2025-11-04 14:01
最后编辑:严锋 更新时间:2025-11-04 14:01