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的一些小经验,希望能帮到大家。

目录
相关文章
|
14天前
|
Java Linux
Springboot 解决linux服务器下获取不到项目Resources下资源
Springboot 解决linux服务器下获取不到项目Resources下资源
|
22天前
|
Java API Spring
SpringBoot项目调用HTTP接口5种方式你了解多少?
SpringBoot项目调用HTTP接口5种方式你了解多少?
71 2
|
22天前
|
前端开发 JavaScript Java
6个SpringBoot 项目拿来就可以学习项目经验接私活
6个SpringBoot 项目拿来就可以学习项目经验接私活
33 0
|
26天前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
40 0
|
1月前
|
前端开发 Java 关系型数据库
SpringBoot+MyBatis 天猫商城项目
SpringBoot+MyBatis 天猫商城项目
54 1
|
25天前
|
Java Maven 微服务
springboot项目开启远程调试-jar包
springboot项目开启远程调试-jar包
19 0
|
1月前
|
SpringCloudAlibaba Java 持续交付
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
142 0
|
5天前
|
安全 Java 应用服务中间件
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
19 0
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
|
7天前
|
XML Java C++
【Spring系列】Sping VS Sping Boot区别与联系
【4月更文挑战第2天】Spring系列第一课:Spring Boot 能力介绍及简单实践
30 0
【Spring系列】Sping VS Sping Boot区别与联系
|
11天前
|
JSON 前端开发 Java
统一异常处理:让Spring Boot项目异常更优雅
统一异常处理:让Spring Boot项目异常更优雅
23 1