Ansible roles使用 :安装nginx与php
Linux命令
Ansible roles使用 :安装nginx与php
2025-03-12 00:08
? 模块化部署利器:从零构建高可维护的Web服务 通过Ansible Roles实现服务部署,可显著提升配置管理的效率和可复用性。本文以CentOS 7系统为例,手把手演示如何用Roles架构部署Nginx与PHP环境,并解析关键配置技巧与避坑指南。
Ansible Roles实战:CentOS 7部署Nginx+PHP全流程解析
? 模块化部署利器:从零构建高可维护的Web服务
通过Ansible Roles实现服务部署,可显著提升配置管理的效率和可复用性。本文以CentOS 7系统为例,手把手演示如何用Roles架构部署Nginx与PHP环境,并解析关键配置技巧与避坑指南。
一、项目结构规划:标准目录解析
ansible-project/
├── inventory/ # 主机清单目录
│ └── hosts # 目标主机定义文件
├── roles/ # 角色目录
│ ├── nginx/ # Nginx角色
│ │ ├── tasks/ # 任务定义
│ │ │ └── main.yml
│ │ └── templates/ # 配置模板
│ │ └── nginx.conf.j2
│ └── php/ # PHP角色
│ └── tasks/
│ └── main.yml
└── site.yml # 主Playbook
❗ 核心逻辑:
- roles/:每个子目录代表一个独立功能模块
- templates/:使用Jinja2模板动态生成配置文件
- site.yml:编排角色执行顺序
二、关键文件配置详解
1. 主机清单(inventory/hosts)
[web_servers]
server1 ansible_host=192.168.1.100 ansible_user=root
参数说明:
web_servers
:主机组名称ansible_host
:目标服务器IPansible_user
:SSH连接用户(建议使用SSH密钥认证)
2. Nginx角色任务(roles/nginx/tasks/main.yml)
- name: 安装Nginx
yum:
name: nginx
state: present
notify: restart nginx # 触发handler
- name: 启用并启动Nginx服务
service:
name: nginx
state: started
enabled: yes
- name: 分发Nginx配置
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: restart nginx
技术要点:
- 使用
notify
实现配置变更后自动重启服务 template
模块支持变量替换(如{{ php_fpm_socket }}
)
3. PHP角色任务(roles/php/tasks/main.yml)
- name: 安装PHP基础包
yum:
name: php
state: present
- name: 安装PHP扩展
yum:
name: "{{ item }}"
state: present
loop:
- php-fpm
- php-mysqlnd
- php-gd
- php-opcache
- name: 配置PHP-FPM
template:
src: www.conf.j2
dest: /etc/php-fpm.d/www.conf
notify: restart php-fpm
- name: 启动PHP-FPM
service:
name: php-fpm
state: started
enabled: yes
❗ 优化建议:
- 将扩展列表定义为变量(如
php_extensions
),提升灵活性 - 使用
meta: flush_handlers
强制立即执行handler
三、配置模板与变量管理
1. Nginx模板(roles/nginx/templates/nginx.conf.j2)
server {
listen 80;
server_name {{ domain_name }};
root /var/www/html;
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
变量注入:
- 在
group_vars/all.yml
中定义domain_name: example.com
2. 变量分层定义
group_vars/
└── web_servers.yml # 主机组级别变量
host_vars/
└── server1.yml # 主机级别变量
最佳实践:
- 敏感数据(如密码)存储在
ansible-vault
加密文件中
四、执行部署与调试技巧
1. 运行Playbook
ansible-playbook -i inventory/hosts site.yml -K
参数解析:
-K
:询问SSH密码或sudo密码-v
:增加输出详细级别(调试时使用)
2. 常见问题排查
问题现象:Nginx配置错误导致服务启动失败解决步骤:
- 手动验证配置语法:
ansible web_servers -a "nginx -t"
- 查看日志:
journalctl -u nginx --since "5 minutes ago"
问题现象:PHP-FPM与Nginx权限冲突
解决方案:
确保 /run/php-fpm/www.sock
的所属用户与Nginx工作进程一致:
# roles/php/templates/www.conf.j2
listen.owner = nginx
listen.group = nginx
五、扩展优化:生产环境建议
1. 安全加固
- 配置防火墙规则:
- firewalld: service: http state: enabled permanent: yes immediate: yes
- 禁用PHP危险函数:
label :
- Ansible
- roles
- nginx
- php