Ansible部署Spring Boot项目

简介: 也许Ansible能给你的便捷部署带来一些灵感。image.png有时,我们的基础设施并不是那么的完善,也许不想搭建Gitlab,Jenkins,就是想写一个项目,然后部署到服务器,需要简单,快速,那么Ansible基本就足够了。

也许Ansible能给你的便捷部署带来一些灵感。

img_a01396cd65e7a1cfb0902a08156de64c.png
image.png

有时,我们的基础设施并不是那么的完善,也许不想搭建Gitlab,Jenkins,就是想写一个项目,然后部署到服务器,需要简单,快速,那么Ansible基本就足够了。这篇文章主要给大家演示一个Ansible部署的案例。

playbook逻辑

首先理清楚整个playbook的内容

  1. 获取本地jar包的名称
  2. 上传至服务器jar包,jar包最好后缀带有版本信息,maven打包的时候可以指定
  3. 停止原有的服务
  4. 检测原有的服务是否停止,如果未停止,强行杀死..
  5. 运行新的jar包

因为项目相对简单,对高可用性要求的不是那么的强烈,如果想要服务不停止运行的话,可以部署集群,两个实例,一直保持其中一个处于运行状态,可以基本实现服务一直运行。简单起见,我们以单实例来演示。

playbook编写

  1. 写playbook的元数据,有关playbook的语法等等,这就不多说了。参考这篇文章:https://www.jianshu.com/p/e513250496ee
---
- hosts: web   #定义运行的主机
  vars: #设置变量
    pwd: /Users/aihe/Desktop/code/api

  remote_user: root 
  gather_facts: no  #不收集facts
  1. 编写tasks
  tasks:
  # 获取本地打包好的文件名
  - name: get local file name
    local_action: shell ls {{ pwd }}/target/*.jar
    register: file_name
    tags: test

 # 上传jar包到服务器
  - name: upload jar file to server
    tags:
     - upload
     - test
    copy:
     src: "{{ file_name.stdout }}"
     dest: /home/
    when: file_name.stdout != ""

# 获取上次jar包运行的pid
  - name: get pid of api
    tags:
     - test
    shell: "ps -ef | grep -v grep | grep api | awk '{print $2}'"
    register: running_processes

# 发送停止运行信号
  - name: Kill running processes
    shell: "kill {{ item }}"
    tags:
     - test1
    with_items: "{{ running_processes.stdout_lines }}"

# 等待60s钟,确认获取的到的pid是否都停止运行
  - wait_for:
      path: "/proc/{{ item }}/status"
      state: absent
      timeout: 60
    tags:
     - test
    with_items: "{{ running_processes.stdout_lines }}"
    ignore_errors: yes
    register: killed_processes
# 强制杀死,未停止运行的进程
  - name: Force kill stuck processes
    shell: "kill -9 {{ item }}"
    with_items: "{{ killed_processes.results | select('failed') | map(attribute='item') | list }}"

# 启动新的jar包
  - name: start wechat-api
    shell: "nohup java -jar /home/{{ file_name.stdout }} &"
    tags: start

关于playbook的一些知识点

直接贴上面的yml脚本可能部分读者无法理解。再此解释一下

  • local_action模块用来运行本地的命令,语法为
  - name: 任务名称
    local_action:
      module: mail # ansible模块名,这里以mail为例,上面我们用的是shell,或command模块
      #以下为模块的关键字
      subject: "Summary Mail"
      to: "{{ mail_recipient }}"
      body: "{{ mail_body }}"
    run_once: True
  • register可以注册每一步task运行的变量,变量的结果在运行的时候加上-v可以看到,-vvv可以看到更详细的信息。


    img_1d53b29ae2127b3aafabb51e1a2fdc01.png
    image.png
  • ignore_errors: yes,忽略脚本运行的错误,默认情况下,运行失败脚本会停止的,加上这个关键字,即使出现错误,照常运行。

  • tags: 使用tags可以为每个任务指定标签,这样我们就不用每次都把所有的任务都执行完毕了。可以指定多个tag

  • wait_for模块,这个模块可以让我们等待特定的条件然后继续执行接下来的脚本,挺好用的,感兴趣的可以研究下。

以上的脚本其余部分,都是ansible的正常模块,可以使用

ansible-doc 模块名 #查看模块的具体用法

最后

ansible在自动化上还是有很大的功用的,以上只是个人在使用ansible的一些小经验,希望能帮到大家。

相关文章
|
2月前
|
Java 应用服务中间件 Maven
如何将 Spring Boot 应用程序部署为 WAR?
如何将 Spring Boot 应用程序部署为 WAR?
138 1
|
12天前
|
存储 JSON 前端开发
【Spring项目】表白墙,留言板项目的实现
本文主要介绍了表白墙项目的实现,包含前端和后端代码,以及测试
|
12天前
|
JSON 前端开发 Java
|
12天前
|
缓存 前端开发 Java
【Spring】——SpringBoot项目创建
SpringBoot项目创建,SpringBootApplication启动类,target文件,web服务器,tomcat,访问服务器
|
1月前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
36 6
|
1月前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
58 5
|
1月前
|
缓存 监控 Java
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
43 5
|
1月前
|
Java 应用服务中间件 Docker
将基于 Spring 的 WAR 应用程序部署到 Docker:详尽指南
将基于 Spring 的 WAR 应用程序部署到 Docker:详尽指南
38 2
|
2月前
|
Java Linux Docker
什么是 Docker?如何将 Spring Boot 应用程序部署到 Docker?
什么是 Docker?如何将 Spring Boot 应用程序部署到 Docker?
55 3
|
2月前
|
运维 应用服务中间件 Linux
自动化运维的利器:Ansible在配置管理中的应用
【10月更文挑战第39天】本文旨在通过深入浅出的方式,向读者展示如何利用Ansible这一强大的自动化工具来优化日常的运维工作。我们将从基础概念讲起,逐步深入到实战操作,不仅涵盖Ansible的核心功能,还会分享一些高级技巧和最佳实践。无论你是初学者还是有经验的运维人员,这篇文章都会为你提供有价值的信息,帮助你提升工作效率。