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. 关键优化点
  1. 依赖管理

    • roles/mysql/meta/main.yml 中声明依赖:
      dependencies:
        - role: php
          when: "'webservers' in group_names"
      

  2. 条件触发
    通过 when 实现动态控制:

    - name: Install PHP-FPM (for Nginx)
      apt: name: php-fpm
      when: "'nginx' in group_names"
    

  3. 跨平台支持
    使用变量适配不同系统:

    - 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 角色

通过角色拆分,可实现:

  • ✅ 单组件独立升级
  • ✅ 跨项目无缝复用
  • ✅ 团队协作更高效
  • ✅ 错误隔离更明确
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐