R / Richie全部文章 ↑

Linux · 2 分钟阅读

Ansible 实战:部署 LAMP + Keepalived

2026 年视角:Keepalived 仍是双机热备的省心方案;MariaDB 已基本替代 MySQL 默认;LAMP 渐渐被 LNMP 替代,但作为教学项目够用。

目标架构

主机 IP 角色
A 192.168.50.66 Ansible 控制节点 + Keepalived Master
B 192.168.50.110 Keepalived Backup
C 192.168.50.111 Web 1
D 192.168.50.112 Web 2
E 192.168.50.113 Database

准备工作

# 控制节点
yum install -y ansible-core 2.13

# 目录结构
mkdir -p ansible-bbs/{inventory,group_vars,roles}
cd ansible-bbs

Inventory

# inventory/hosts.yml
all:
  children:
    lb:
      hosts:
        192.168.50.66:
        192.168.50.110:
    web:
      hosts:
        192.168.50.111:
        192.168.50.112:
    db:
      hosts:
        192.168.50.113:

公共配置

# group_vars/all.yml
ansible_user: root
ansible_ssh_private_key_file: ~/.ssh/id_rsa
http_port: 80

部署 Playbook

# site.yml
---
- name: 部署负载均衡
  hosts: lb
  become: true
  tasks:
    - name: 安装 keepalived 和 nginx
      ansible.builtin.yum:
        name:
          - keepalived
          - nginx
        state: present

- name: 部署 Web
  hosts: web
  become: true
  tasks:
    - name: 安装 Web 三件套
      ansible.builtin.yum:
        name:
          - httpd
          - php
          - php-mysqlnd
        state: present

- name: 部署数据库
  hosts: db
  become: true
  tasks:
    - name: 安装 MariaDB
      ansible.builtin.yum:
        name: mariadb-server
        state: present

跑起来:

ansible-playbook -i inventory/hosts.yml site.yml

几点工程实践

  • 业务用 Role 组织,别把所有 task 塞一个 file
  • Inventory 用 YAML(inventory/hosts.yml),别用 INI
  • 变量走 group_vars/,环境差异靠 inventory 目录切:inventory/prod/, inventory/staging/
  • 用 --check + --diff 预演;生产用 --limit 灰度

参考