1. 使用Ansible Playbook部署Nginx Web服务器
任务目标
编写一个Ansible Playbook,在目标主机上完成Nginx的安装、启动、开机自启配置,并验证服务处于运行状态。本案例面向RHEL/CentOS系列(使用yum/dnf)与Debian/Ubuntu系列(使用apt)两种常见环境,通过变量区分包管理器行为。
环境依赖
- 控制节点:已安装Ansible 2.9+,可通过
ansible --version确认。 - 目标主机:可访问的Linux主机,控制节点已配置SSH密钥免密登录。
- Inventory文件:定义目标主机分组,例如
web组。
Playbook实现
创建文件deploy_nginx.yml,内容如下。该Playbook通过ansible_os_family自动识别系统发行版,选择对应的包管理器执行安装,并确保Nginx服务启动且开机自启。
---
- name: Deploy Nginx web server
hosts: web
become: yes
vars:
nginx_package: "{{ 'nginx' if ansible_os_family == 'Debian' else 'nginx' }}"
nginx_service: nginx
tasks:
- name: Install Nginx (Debian/Ubuntu)
apt:
name: "{{ nginx_package }}"
state: present
update_cache: yes
when: ansible_os_family == "Debian"
- name: Install Nginx (RedHat/CentOS)
yum:
name: "{{ nginx_package }}"
state: present
when: ansible_os_family == "RedHat"
- name: Start Nginx and enable on boot
service:
name: "{{ nginx_service }}"
state: started
enabled: yes
- name: Verify Nginx is running
command: systemctl is-active nginx
register: nginx_status
changed_when: false
failed_when: nginx_status.stdout != "active"
- name: Display Nginx status
debug:
msg: "Nginx service status: {{ nginx_status.stdout }}"
运行方法
- 确保Inventory文件(如
hosts.ini)中包含目标主机:
[web]
192.168.1.10
192.168.1.11
- 执行Playbook:
ansible-playbook -i hosts.ini deploy_nginx.yml
验证与判定标准
- 执行结果:所有task显示为
ok或changed,无failed。 - 服务状态:最后一个task的debug输出显示
Nginx service status: active。 - 开机自启:在目标主机上执行
systemctl is-enabled nginx,预期输出enabled。 - HTTP访问:在浏览器或curl访问
http://<目标主机IP>,返回Nginx默认欢迎页(HTTP 200)。
常见问题
- 包管理器报错:若目标主机为Fedora或RHEL 9+,
yum命令仍可用(符号链接至dnf),无需修改;若为openSUSE,需额外添加zypper分支。 - 端口未开放:若目标主机启用了firewalld,需额外添加firewalld规则放行80端口,本案例未包含该操作以保持最小闭环。
- 权限不足:
become: yes要求执行用户具有sudo权限,否则会报权限错误。