也许Ansible能给你的便捷部署带来一些灵感。
有时,我们的基础设施并不是那么的完善,也许不想搭建Gitlab,Jenkins,就是想写一个项目,然后部署到服务器,需要简单,快速,那么Ansible基本就足够了。这篇文章主要给大家演示一个Ansible部署的案例。
playbook逻辑
首先理清楚整个playbook的内容
- 获取本地jar包的名称
- 上传至服务器jar包,jar包最好后缀带有版本信息,maven打包的时候可以指定
- 停止原有的服务
- 检测原有的服务是否停止,如果未停止,强行杀死..
- 运行新的jar包
因为项目相对简单,对高可用性要求的不是那么的强烈,如果想要服务不停止运行的话,可以部署集群,两个实例,一直保持其中一个处于运行状态,可以基本实现服务一直运行。简单起见,我们以单实例来演示。
playbook编写
- 写playbook的元数据,有关playbook的语法等等,这就不多说了。参考这篇文章:https://www.jianshu.com/p/e513250496ee
---
- hosts: web #定义运行的主机
vars: #设置变量
pwd: /Users/aihe/Desktop/code/api
remote_user: root
gather_facts: no #不收集facts
- 编写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可以看到更详细的信息。
ignore_errors: yes,忽略脚本运行的错误,默认情况下,运行失败脚本会停止的,加上这个关键字,即使出现错误,照常运行。
tags: 使用tags可以为每个任务指定标签,这样我们就不用每次都把所有的任务都执行完毕了。可以指定多个tag
wait_for模块,这个模块可以让我们等待特定的条件然后继续执行接下来的脚本,挺好用的,感兴趣的可以研究下。
以上的脚本其余部分,都是ansible的正常模块,可以使用
ansible-doc 模块名 #查看模块的具体用法
最后
ansible在自动化上还是有很大的功用的,以上只是个人在使用ansible的一些小经验,希望能帮到大家。