从零开始使用 Ansible 自动化部署 SpringBoot Web 应用(含 MySQL、Redis、Vue、Nginx)
文章目录
- 1. 安装 Ansible
- 2. 创建 Ansible Playbook
- 3. MySQL 自动化部署
- 4. Redis 自动化部署
- 5. Spring Boot 后端部署
- 6. Vue 前端部署
- 7. Nginx 配置
- 8. 运行 Ansible Playbook
- 9. 验证部署
- 10. 总结
本教程使用 Ansible 实现全栈应用的自动化部署,包括:
- 后端:Spring Boot(运行在 Tomcat 或 jar 方式)
- 数据库:MySQL
- 缓存:Redis
- 前端:Vue.js(部署在 Nginx)
- 代理:Nginx(反向代理 Vue 和 Spring Boot)
1. 安装 Ansible
在 Ansible 控制节点(本地机器或 CI/CD 服务器)上安装:(本文以Centos为例)
# CentOS/RHEL
sudo yum install epel-release --allowerasing -y
sudo yum install ansible -y
确保 Ansible 已正确安装,先检查 Ansible 是否安装:
rpm -qa | grep ansible
如果没有输出,说明 ansible 没有安装,请执行以下命令安装它。
检查 ansible 是否在 PATH 里,如果安装了 ansible,但仍然提示 command not found,执行:
which ansible
如果没有输出,可能 PATH 没有包含 ansible,可以尝试:
export PATH=$PATH:/usr/local/bin:/usr/bin:/usr/sbin
source ~/.bashrc
然后再尝试:
ansible --version
配置 Ansible Hosts
编辑 /etc/ansible/hosts 添加你的目标服务器:
vim /etc/ansible/hosts
[web]
47.92.101.102 ansible_user=root ansible_ssh_private_key_file=~/.ssh/id_rsa
测试连接:
ansible all -m ping
2. 创建 Ansible Playbook
创建 目录结构:
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)
- 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)
- 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
复制
编辑
- 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)
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)
- 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
复制
编辑
- 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
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
复制
编辑
- hosts: web
become: yes
roles:
- mysql
- redis
- springboot
- vue
- nginx
执行 Ansible Playbook
ansible-playbook site.yml
9. 验证部署
📌 检查各个服务状态
# 检查 MySQL
systemctl status mysql
# 检查 Redis
systemctl status redis-server
# 检查 Spring Boot 应用
systemctl status myapp
# 检查 Nginx
systemctl status nginx
📌 访问 Web 应用
- 前端:http://服务器IP/
- 后端 API:http://服务器IP/api/
10. 总结
✅ 自动化部署:MySQL、Redis、Spring Boot、Vue、Nginx
✅ 可扩展:支持多服务器部署
✅ 持续集成:可与 Jenkins、GitLab CI 结合
✅ 一键部署:ansible-playbook site.yml 即可完成部署
🎯 这样就实现了 全栈 SpringBoot Web 应用的自动化部署!
一个人可以走的很快,但一群人才能走的更远