从零开始使用 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 应用的自动化部署!


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


相关推荐
大土豆的bug记录4 小时前
鸿蒙进行视频上传,使用 request.uploadFile方法
开发语言·前端·华为·arkts·鸿蒙·arkui
maybe02094 小时前
前端表格数据导出Excel文件方法,列自适应宽度、增加合计、自定义文件名称
前端·javascript·excel·js·大前端
HBR666_4 小时前
菜单(路由)权限&按钮权限&路由进度条
前端·vue
A-Kamen5 小时前
深入理解 HTML5 Web Workers:提升网页性能的关键技术解析
前端·html·html5
锋小张6 小时前
a-date-picker 格式化日期格式 YYYY-MM-DD HH:mm:ss
前端·javascript·vue.js
鱼樱前端7 小时前
前端模块化开发标准全面解析--ESM获得绝杀
前端·javascript
yanlele7 小时前
前端面试第 75 期 - 前端质量问题专题(11 道题)
前端·javascript·面试
前端小白۞8 小时前
el-date-picker时间范围 编辑回显后不能修改问题
前端·vue.js·elementui
拉不动的猪8 小时前
刷刷题44(uniapp-中级)
前端·javascript·面试
云观秋毫8 小时前
试试智能体工作流,自动化搞定运维故障排查
运维·数据库·自动化