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

正常情况下你会看到每个任务显示 okchanged
如果某台机器报 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 phpinfo(); ?
>
,浏览器访问能看到 PHP 信息页,说明 Nginx 和 PHP-FPM 已正确联动。

MySQL 方面,登录任意一台目标机执行 mysql -uroot -p 能进入数据库,就表示数据库服务正常。
如果连接被拒绝,检查 mysqld 是否真的启动,以及 root 用户是否需要设置初始密码。

几个常被问到的问题

Playbook 能重复执行吗? 可以。
上面用到的 yumservice 模块本身具备幂等性,重复运行不会重复安装,已启动的服务也不会被反复重启,适合日常维护。

想换成 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 描述安装和启动顺序,最后通过服务状态和访问页面确认结果。
把这三步跑通,多服务器一键搭建就不再需要逐台敲命令了。

分享到:
上一篇
Prometheus采集Nginx状态
下一篇
Shell脚本监控网站http状态码,异常告警
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意