也許Ansible能給你的便捷部署帶來一些靈感。

image.png
有時,我們的基礎設施并不是那么的完善,也許不想搭建Gitlab,Jenkins,就是想寫一個項目,然后部署到服務器,需要簡單,快速,那么Ansible基本就足夠了。這篇文章主要給大家演示一個Ansible部署的案例。
playbook邏輯
首先理清楚整個playbook的內(nèi)容
- 獲取本地jar包的名稱
- 上傳至服務器jar包,jar包最好后綴帶有版本信息,maven打包的時候可以指定
- 停止原有的服務
- 檢測原有的服務是否停止,如果未停止,強行殺死..
- 運行新的jar包
因為項目相對簡單,對高可用性要求的不是那么的強烈,如果想要服務不停止運行的話,可以部署集群,兩個實例,一直保持其中一個處于運行狀態(tài),可以基本實現(xiàn)服務一直運行。簡單起見,我們以單實例來演示。
playbook編寫
- 寫playbook的元數(shù)據(jù),有關playbook的語法等等,這就不多說了。參考這篇文章:http://www.itdecent.cn/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
# 發(fā)送停止運行信號
- 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運行的變量,變量的結(jié)果在運行的時候加上-v可以看到,-vvv可以看到更詳細的信息。
image.png
ignore_errors: yes,忽略腳本運行的錯誤,默認情況下,運行失敗腳本會停止的,加上這個關鍵字,即使出現(xiàn)錯誤,照常運行。
tags: 使用tags可以為每個任務指定標簽,這樣我們就不用每次都把所有的任務都執(zhí)行完畢了。可以指定多個tag
wait_for模塊,這個模塊可以讓我們等待特定的條件然后繼續(xù)執(zhí)行接下來的腳本,挺好用的,感興趣的可以研究下。
以上的腳本其余部分,都是ansible的正常模塊,可以使用
ansible-doc 模塊名 #查看模塊的具體用法
最后
ansible在自動化上還是有很大的功用的,以上只是個人在使用ansible的一些小經(jīng)驗,希望能幫到大家。
