Ansible部署LNMP环境,多服务器一键搭建
如果你手头有多台服务器需要部署 LNMP(Linux + Nginx + MySQL + PHP)环境,逐台登录执行命令不仅慢,还容易因为操作不一致导致环境差异。
用 Ansible 写一个 Playbook,就能在多台机器上一次性完成安装和配置,适合刚接触自动化运维、需要批量建站或做测试集群的用户。
动手前的环境准备
开始之前,你需要准备一台控制机(安装 Ansible)和若干台目标服务器,目标服务器系统建议为 CentOS 7/8 或 Ubuntu 20.04 以上。
控制机到所有目标服务器必须能通过 SSH 登录,并且最好配置好密钥免密,否则 Ansible 每次执行都要输密码,批量操作会很麻烦。
在控制机执行以下命令安装 Ansible:
# CentOS / RHEL
yum install -y epel-release && yum install -y ansible
# Ubuntu / Debian
apt update && apt install -y ansible
安装完成后用 ansible --version 确认版本。
接着配置免密登录,假设目标服务器 IP 为 192.168.1.101、192.168.1.102:
ssh-keygen -t rsa -b 2048
ssh-copy-id root@192.168.1.101
ssh-copy-id root@192.168.1.102
执行 ssh root@192.168.1.101 能直接进入而不提示密码,就说明免密配置成功。
这一步是后续一键搭建的基础,跳过它后面会频繁报权限错误。
编写 Inventory 定义服务器清单
Inventory 文件用来告诉 Ansible 要管理哪些机器。
在控制机创建 /etc/ansible/hosts 或项目目录下的 hosts 文件,内容如下:
[lnmp]
192.168.1.101
192.168.1.102
[lnmp:vars]
ansible_ssh_user=root
ansible_python_interpreter=/usr/bin/python3
如果目标服务器默认 Python 路径不是 /usr/bin/python3,可以用 ansible lnmp -m ping 测试连通性。
看到 pong 说明 Ansible 能正常连上所有目标机;
如果返回 UNREACHABLE,优先检查 SSH 端口、防火墙和免密是否生效。
用 Playbook 一键安装 LNMP
创建一个 lnmp.yml 文件,把安装任务按顺序写进去。
下面以 CentOS 系为例,使用 yum 模块安装 Nginx、MySQL 和 PHP:
---
- name: 批量部署 LNMP 环境
hosts: lnmp
become: yes
tasks:
- name: 安装 Nginx
yum:
name: nginx
state: present
- name: 安装 MySQL 服务端
yum:
name: mysql-server
state: present
- name: 安装 PHP 及常用扩展
yum:
name: "{{ item }}"
state: present
loop:
- php
- php-fpm
- php-mysqlnd
- name: 启动并设置开机自启
service:
name: "{{ item }}"
state: started
enabled: yes
loop:
- nginx
- mysqld
- php-fpm
保存后执行:
ansible-playbook -i hosts lnmp.yml
正常情况下你会看到每个任务显示 ok 或 changed。
如果某台机器报 Failed to connect,说明 Inventory 里的地址或 SSH 配置有问题;
如果安装阶段报 No package matching,多半是目标机的软件源里没有对应包名,Ubuntu 系统需要把 yum 换成 apt 模块并调整包名。
容易踩坑的几个地方
软件包名称因系统而异。 CentOS 的 MySQL 包名通常为 mysql-server,Ubuntu 则需要 mysql-server 配合 apt 模块;
PHP 扩展名也略有差别。
建议先在单台机器上手动确认包名,再写进 Playbook。
首次连接会提示指纹确认。 可以在控制机的 /etc/ansible/ansible.cfg 中设置 host_key_checking = False,
或在 ansible.cfg 里配置 ssh_args,
避免每台新机器都卡在 yes/no 确认上。
服务名不一定叫 mysqld。 部分系统上 MySQL 服务名为 mysql,
启动失败时用 systemctl status mysql 查看实际名称,
再修改 Playbook 中的 name 字段。
不要忽略防火墙。 安装完成后如果外部访问不了,需要在目标机放行 80、3306 等端口,或临时关闭防火墙做测试,验证通过后再按需开放。
验证部署结果
Playbook 执行完毕后,用一条命令批量检查服务状态:
ansible lnmp -m shell -a "systemctl is-active nginx mysqld php-fpm"
每台机器都返回 active 就说明服务已运行。
再访问任意一台服务器的 IP,如果能看到 Nginx 默认欢迎页,LNMP 中的 Web 服务已生效。
想进一步确认 PHP 解析,可以在站点目录放一个 info.php 写入 ,浏览器访问能看到 PHP 信息页,说明 Nginx 和 PHP-FPM 已正确联动。
php phpinfo(); ?
>
MySQL 方面,登录任意一台目标机执行 mysql -uroot -p 能进入数据库,就表示数据库服务正常。
如果连接被拒绝,检查 mysqld 是否真的启动,以及 root 用户是否需要设置初始密码。
几个常被问到的问题
Playbook 能重复执行吗? 可以。
上面用到的 yum、service 模块本身具备幂等性,重复运行不会重复安装,已启动的服务也不会被反复重启,适合日常维护。
想换成 Ubuntu 服务器怎么办? 把任务里的 yum 模块替换为 apt,
并更新包名,
例如 apt:,
name=nginx state=present
同时确认目标机已执行过 apt update。
如何只对某一台机器执行? 可以在命令中加 --limit 参数,
例如 ansible-playbook -i hosts lnmp.yml --limit 192.168.1.101,
方便先在一台机器上验证再全量推送。
Ansible 部署 LNMP 环境的核心思路就是:先保证 SSH 通、Inventory 对,再用 Playbook 描述安装和启动顺序,最后通过服务状态和访问页面确认结果。
把这三步跑通,多服务器一键搭建就不再需要逐台敲命令了。