Ansible部署Spring Boot项目

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

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可以看到更详细的信息。


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

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

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

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

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

最后

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、简介 在Linux自动化运维中,常见的自动化运维工具可分为需要安装终端的puppet、func和不需要安装终端...
    小尛酒窝阅读 3,043评论 0 6
  • 1)安装2)常用模块3)inventory4)playbook(role\tag\template)5) yaml...
    秦记阅读 4,598评论 2 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,641评论 19 139
  • 安装ansible 1.yum安装:RHEL(Centos)7版本: 2.Apt(Ubuntu)安装方式: 3.h...
    爱吃土豆的程序猿阅读 11,223评论 0 12
  • ansible介绍ansible常用模块使用playbooktemplates,模板条件测试和循环迭代roles,...
    哈喽别样阅读 1,490评论 0 3

友情链接更多精彩内容