从零开始使用 Ansible 自动化部署 SpringBoot Web 应用(含 MySQL、Redis、Vue、Nginx)

文章目录

    • [1. 安装 Ansible](#1. 安装 Ansible)
    • [2. 创建 Ansible Playbook](#2. 创建 Ansible Playbook)
    • [3. MySQL 自动化部署](#3. MySQL 自动化部署)
    • [4. Redis 自动化部署](#4. Redis 自动化部署)
    • [5. Spring Boot 后端部署](#5. Spring Boot 后端部署)
    • [6. Vue 前端部署](#6. Vue 前端部署)
    • [7. Nginx 配置](#7. Nginx 配置)
    • [8. 运行 Ansible Playbook](#8. 运行 Ansible Playbook)
    • [9. 验证部署](#9. 验证部署)
    • [10. 总结](#10. 总结)

本教程使用 Ansible 实现全栈应用的自动化部署,包括:

  • 后端:Spring Boot(运行在 Tomcat 或 jar 方式)
  • 数据库:MySQL
  • 缓存:Redis
  • 前端:Vue.js(部署在 Nginx)
  • 代理:Nginx(反向代理 Vue 和 Spring Boot)

1. 安装 Ansible

在 Ansible 控制节点(本地机器或 CI/CD 服务器)上安装:(本文以Centos为例)

bash 复制代码
# CentOS/RHEL
sudo yum install epel-release --allowerasing -y
sudo yum install ansible -y

确保 Ansible 已正确安装,先检查 Ansible 是否安装:

bash 复制代码
rpm -qa | grep ansible

如果没有输出,说明 ansible 没有安装,请执行以下命令安装它。

检查 ansible 是否在 PATH 里,如果安装了 ansible,但仍然提示 command not found,执行:

bash 复制代码
which ansible

如果没有输出,可能 PATH 没有包含 ansible,可以尝试:

bash 复制代码
export PATH=$PATH:/usr/local/bin:/usr/bin:/usr/sbin
source ~/.bashrc

然后再尝试:

bash 复制代码
ansible --version

配置 Ansible Hosts

编辑 /etc/ansible/hosts 添加你的目标服务器:

bash 复制代码
vim /etc/ansible/hosts

[web]
47.92.101.102 ansible_user=root ansible_ssh_private_key_file=~/.ssh/id_rsa

测试连接:

bash 复制代码
ansible all -m ping

2. 创建 Ansible Playbook

创建 目录结构:

bash 复制代码
mkdir -p ansible-playbook/{roles/{mysql,redis,springboot,vue,nginx}/tasks,vars,files,templates}
cd ansible-playbook

3. MySQL 自动化部署

MySQL 任务文件(roles/mysql/tasks/main.yml)

yaml 复制代码
- name: 安装 MySQL
  apt:
    name: mysql-server
    state: present
  become: yes

- name: 启动 MySQL 并开机自启
  service:
    name: mysql
    state: started
    enabled: yes

- name: 创建数据库
  mysql_db:
    name: myappdb
    state: present

- name: 创建 MySQL 用户
  mysql_user:
    name: myappuser
    password: mypassword
    priv: 'myappdb.*:ALL'
    state: present

4. Redis 自动化部署

Redis 任务文件(roles/redis/tasks/main.yml)

yaml 复制代码
- name: 安装 Redis
  apt:
    name: redis-server
    state: present
  become: yes

- name: 启动 Redis 并开机自启
  service:
    name: redis-server
    state: started
    enabled: yes

5. Spring Boot 后端部署

Spring Boot 任务文件(roles/springboot/tasks/main.yml)

yaml

复制

编辑

yaml 复制代码
- name: 复制 Spring Boot JAR
  copy:
    src: files/myapp.jar
    dest: /opt/myapp.jar
    owner: root
    group: root
    mode: '0755'

- name: 配置 Spring Boot Systemd 服务
  template:
    src: templates/myapp.service.j2
    dest: /etc/systemd/system/myapp.service

- name: 重新加载 Systemd 并启动服务
  systemd:
    name: myapp
    state: started
    enabled: yes
    daemon_reload: yes

Systemd 服务模板(roles/springboot/templates/myapp.service.j2)

bash 复制代码
Description=Spring Boot Web App
After=network.target

[Service]
User=root
WorkingDirectory=/opt
ExecStart=/usr/bin/java -jar /opt/myapp.jar
SuccessExitStatus=143
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

6. Vue 前端部署

Vue 任务文件(roles/vue/tasks/main.yml)

yaml 复制代码
- name: 安装 Nginx
  apt:
    name: nginx
    state: present
  become: yes

- name: 复制 Vue 项目文件
  copy:
    src: files/dist/
    dest: /var/www/html/
    owner: www-data
    group: www-data
    mode: '0755'

7. Nginx 配置

Nginx 任务文件(roles/nginx/tasks/main.yml)

yaml

复制

编辑

yaml 复制代码
- name: 复制 Nginx 配置文件
  template:
    src: templates/nginx.conf.j2
    dest: /etc/nginx/sites-available/default

- name: 重启 Nginx
  service:
    name: nginx
    state: restarted

Nginx 配置模板(roles/nginx/templates/nginx.conf.j2)

nginx

yaml 复制代码
server {
    listen 80;
    server_name myapp.com;

    location / {
        root /var/www/html;
        index index.html;
        try_files $uri $uri/ /index.html;
    }

    location /api/ {
        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

8. 运行 Ansible Playbook

创建 主 Playbook 文件(site.yml):

yaml

复制

编辑

yaml 复制代码
- hosts: web
  become: yes
  roles:
    - mysql
    - redis
    - springboot
    - vue
    - nginx

执行 Ansible Playbook

bash 复制代码
ansible-playbook site.yml

9. 验证部署

📌 检查各个服务状态

bash 复制代码
# 检查 MySQL
systemctl status mysql

# 检查 Redis
systemctl status redis-server

# 检查 Spring Boot 应用
systemctl status myapp

# 检查 Nginx
systemctl status nginx

📌 访问 Web 应用

10. 总结

✅ 自动化部署:MySQL、Redis、Spring Boot、Vue、Nginx

✅ 可扩展:支持多服务器部署

✅ 持续集成:可与 Jenkins、GitLab CI 结合

✅ 一键部署:ansible-playbook site.yml 即可完成部署

🎯 这样就实现了 全栈 SpringBoot Web 应用的自动化部署!


一个人可以走的很快,但一群人才能走的更远


相关推荐
mldong3 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排4 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
智塑未来4 小时前
自动化立体库工业无线通信:AGV、AMR、RGV、穿梭车、无人叉车、堆垛机全覆盖
运维·自动化
passerby60615 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角6 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!6 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰6 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
志栋智能7 小时前
运维超自动化的变更管理实践
运维·自动化
mayaairi8 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen8 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能