Ansible Roles 拆分实战:将 LAMP 部署拆分为 Apache/MySQL/PHP 角色,提高复用性
·
Ansible Roles 拆分实战:LAMP 部署优化
将 LAMP(Linux + Apache + MySQL + PHP)部署拆分为独立角色,可显著提升代码复用性和可维护性。以下是实战步骤:
1. 创建角色目录结构
使用 ansible-galaxy 初始化角色骨架:
ansible-galaxy init roles/apache
ansible-galaxy init roles/mysql
ansible-galaxy init roles/php
生成标准结构:
roles/
├── apache/
│ ├── tasks/
│ ├── handlers/
│ ├── templates/
│ └── defaults/
├── mysql/ # 同上
└── php/ # 同上
2. 编写独立角色
(1)Apache 角色 (roles/apache/tasks/main.yml)
- name: Install Apache
apt:
name: apache2
state: present
- name: Enable mod_rewrite
apache2_module:
name: rewrite
state: present
notify: restart apache
- name: Deploy virtual host config
template:
src: vhost.conf.j2
dest: /etc/apache2/sites-available/{{ domain }}.conf
notify: restart apache
(2)MySQL 角色 (roles/mysql/tasks/main.yml)
- name: Install MySQL Server
apt:
name: mysql-server
state: present
- name: Secure MySQL installation
community.mysql.mysql_secure_installation:
login_password: "{{ mysql_root_password }}"
encrypt: yes
- name: Create application database
community.mysql.mysql_db:
name: "{{ app_db_name }}"
state: present
(3)PHP 角色 (roles/php/tasks/main.yml)
- name: Install PHP and extensions
apt:
name: "{{ item }}"
state: present
loop:
- php
- php-mysql
- libapache2-mod-php
- name: Update PHP configuration
template:
src: php.ini.j2
dest: /etc/php/{{ php_version }}/apache2/php.ini
notify: restart apache
3. 定义角色变量
(1)全局变量 (group_vars/all.yml)
domain: myapp.example.com
app_db_name: application_db
php_version: 8.1
(2)敏感变量加密
使用 ansible-vault 加密密码:
ansible-vault create secrets.yml
# 内容示例:
mysql_root_password: "{{ vaulted_password }}"
4. 主 Playbook 整合 (lamp.yml)
- hosts: webservers
become: yes
vars_files:
- secrets.yml
roles:
- role: apache
- role: mysql
- role: php
5. 关键优化点
-
依赖管理
- 在
roles/mysql/meta/main.yml中声明依赖:dependencies: - role: php when: "'webservers' in group_names"
- 在
-
条件触发
通过when实现动态控制:- name: Install PHP-FPM (for Nginx) apt: name: php-fpm when: "'nginx' in group_names" -
跨平台支持
使用变量适配不同系统:- name: Install Apache package: name: "{{ 'httpd' if ansible_os_family == 'RedHat' else 'apache2' }}"
6. 执行部署
ansible-playbook -i inventory lamp.yml --ask-vault-pass
优势总结
| 场景 | 传统 Playbook | 角色拆分后 |
|---|---|---|
| 仅部署 Apache | 需注释无关任务 | 直接调用 apache 角色 |
| 更新 PHP 配置 | 需定位代码位置 | 修改 roles/php 即可 |
| 复用数据库部署 | 需复制粘贴代码 | 直接调用 mysql 角色 |
通过角色拆分,可实现:
- ✅ 单组件独立升级
- ✅ 跨项目无缝复用
- ✅ 团队协作更高效
- ✅ 错误隔离更明确
更多推荐

所有评论(0)