Ansible自动化部署Web与数据库环境的核心是通过Inventory、Playbook、Roles和Templates分层设计实现一致性与可控性:先用Inventory按功能分组并注入变量,再用Roles模块化封装Nginx、PHP、MySQL等组件任务,通过Playbook编排执行顺序与跨组件协作,最后借助Vault加密、幂等模块、check/diff预演及自动备份保障安全与可靠性。

用 Ansible 自动化部署 Web 服务与数据库环境,核心在于把重复性配置固化为可复用、可验证的代码。它不是简单地“一键安装”,而是通过分层设计(Inventory + Playbook + Roles + Templates)实现环境一致、变更可控、扩展灵活。
明确角色划分与主机清单
先理清服务拓扑:Web 服务(Nginx + PHP)、数据库(MySQL/MariaDB)通常分离部署。Ansible 依靠 Inventory 文件定义这层逻辑关系:
- 在 inventory.ini 或 inventory.yml 中按功能分组,例如:
[webservers]
192.168.1.20
192.168.1.21
[dbservers]
192.168.1.30 - 支持变量注入,比如为数据库组统一设置 ansible_user: root,或为不同环境指定 env: prod
- 避免硬编码 IP,推荐用主机名 + DNS/hosts 文件配合,提升可读性和迁移性
用 Roles 组织模块化任务
把 Nginx、PHP、MySQL 等组件拆成独立 Role,每个 Role 封装自己的 tasks、templates、handlers 和 vars:
- 创建标准结构:roles/nginx/tasks/main.yml 写安装、配置、启动逻辑;roles/nginx/templates/nginx.conf.j2 用 Jinja2 模板动态填入 server_name、upstream 地址等
- MySQL Role 中,tasks/main.yml 可依次执行:解压二进制包 → 初始化数据目录 → 启动 mysqld → 执行 mysql_secure_installation 类似操作(用 community.mysql.mysql_secure_install 模块)
- Web Role 中,PHP 配置可通过 template 模块写入 www.conf,并用 Handler 在配置变更后自动 reload php-fpm
Playbook 编排跨组件协作
主 Playbook(如 site.yml)负责串联各 Role,并控制执行顺序和条件:
- 先对所有节点运行 common Role(基础系统设置、时区、防火墙、YUM 源)
- 再对 dbservers 组运行 mysql Role,完成后触发 handler 启动服务
- 最后对 webservers 组运行 nginx 和 php Role,并在 Nginx 配置中引用数据库地址(通过 hostvars['database'] 动态获取)
- 用 when: 条件判断跳过某些步骤,例如仅在 env == 'prod' 时启用慢查询日志
保障安全与幂等性
自动化不是“越快越好”,而是“每次结果都可靠”:
- 数据库密码不写死在 Playbook 中,改用 vars_prompt 交互输入,或从 Ansible Vault 加密文件读取
- 所有模块默认具备幂等性(如 yum: name=httpd state=present 多次执行无副作用),但 shell 命令需自行加 creates= 或 removes= 判断
- 上线前用 --check 模式预演变更,用 --diff 查看配置文件差异,降低误操作风险
- 备份关键步骤:部署前自动备份旧 Nginx 配置、MySQL 数据目录(用 shell + archive 模块组合)

















