也許Ansible能給你的便捷部署帶來(lái)一些靈感。
有時(shí)裕偿,我們的基礎(chǔ)設(shè)施并不是那么的完善洞慎,也許不想搭建Gitlab,Jenkins嘿棘,就是想寫(xiě)一個(gè)項(xiàng)目劲腿,然后部署到服務(wù)器,需要簡(jiǎn)單鸟妙,快速焦人,那么Ansible基本就足夠了。這篇文章主要給大家演示一個(gè)Ansible部署的案例重父。
playbook邏輯
首先理清楚整個(gè)playbook的內(nèi)容
- 獲取本地jar包的名稱(chēng)
- 上傳至服務(wù)器jar包花椭,jar包最好后綴帶有版本信息,maven打包的時(shí)候可以指定
- 停止原有的服務(wù)
- 檢測(cè)原有的服務(wù)是否停止房午,如果未停止矿辽,強(qiáng)行殺死..
- 運(yùn)行新的jar包
因?yàn)轫?xiàng)目相對(duì)簡(jiǎn)單,對(duì)高可用性要求的不是那么的強(qiáng)烈郭厌,如果想要服務(wù)不停止運(yùn)行的話袋倔,可以部署集群,兩個(gè)實(shí)例折柠,一直保持其中一個(gè)處于運(yùn)行狀態(tài)奕污,可以基本實(shí)現(xiàn)服務(wù)一直運(yùn)行。簡(jiǎn)單起見(jiàn)液走,我們以單實(shí)例來(lái)演示碳默。
playbook編寫(xiě)
- 寫(xiě)playbook的元數(shù)據(jù),有關(guān)playbook的語(yǔ)法等等缘眶,這就不多說(shuō)了嘱根。參考這篇文章:http://www.reibang.com/p/e513250496ee
---
- hosts: web #定義運(yùn)行的主機(jī)
vars: #設(shè)置變量
pwd: /Users/aihe/Desktop/code/api
remote_user: root
gather_facts: no #不收集facts
- 編寫(xiě)tasks
tasks:
# 獲取本地打包好的文件名
- name: get local file name
local_action: shell ls {{ pwd }}/target/*.jar
register: file_name
tags: test
# 上傳jar包到服務(wù)器
- name: upload jar file to server
tags:
- upload
- test
copy:
src: "{{ file_name.stdout }}"
dest: /home/
when: file_name.stdout != ""
# 獲取上次jar包運(yùn)行的pid
- name: get pid of api
tags:
- test
shell: "ps -ef | grep -v grep | grep api | awk '{print $2}'"
register: running_processes
# 發(fā)送停止運(yùn)行信號(hào)
- name: Kill running processes
shell: "kill {{ item }}"
tags:
- test1
with_items: "{{ running_processes.stdout_lines }}"
# 等待60s鐘,確認(rèn)獲取的到的pid是否都停止運(yùn)行
- wait_for:
path: "/proc/{{ item }}/status"
state: absent
timeout: 60
tags:
- test
with_items: "{{ running_processes.stdout_lines }}"
ignore_errors: yes
register: killed_processes
# 強(qiáng)制殺死巷懈,未停止運(yùn)行的進(jìn)程
- name: Force kill stuck processes
shell: "kill -9 {{ item }}"
with_items: "{{ killed_processes.results | select('failed') | map(attribute='item') | list }}"
# 啟動(dòng)新的jar包
- name: start wechat-api
shell: "nohup java -jar /home/{{ file_name.stdout }} &"
tags: start
關(guān)于playbook的一些知識(shí)點(diǎn)
直接貼上面的yml腳本可能部分讀者無(wú)法理解该抒。再此解釋一下
- local_action模塊用來(lái)運(yùn)行本地的命令,語(yǔ)法為
- name: 任務(wù)名稱(chēng)
local_action:
module: mail # ansible模塊名顶燕,這里以mail為例凑保,上面我們用的是shell,或command模塊
#以下為模塊的關(guān)鍵字
subject: "Summary Mail"
to: "{{ mail_recipient }}"
body: "{{ mail_body }}"
run_once: True
-
register可以注冊(cè)每一步task運(yùn)行的變量涌攻,變量的結(jié)果在運(yùn)行的時(shí)候加上-v可以看到欧引,-vvv可以看到更詳細(xì)的信息。
image.png
ignore_errors: yes恳谎,忽略腳本運(yùn)行的錯(cuò)誤芝此,默認(rèn)情況下憋肖,運(yùn)行失敗腳本會(huì)停止的,加上這個(gè)關(guān)鍵字婚苹,即使出現(xiàn)錯(cuò)誤岸更,照常運(yùn)行。
tags: 使用tags可以為每個(gè)任務(wù)指定標(biāo)簽膊升,這樣我們就不用每次都把所有的任務(wù)都執(zhí)行完畢了怎炊。可以指定多個(gè)tag
wait_for模塊廓译,這個(gè)模塊可以讓我們等待特定的條件然后繼續(xù)執(zhí)行接下來(lái)的腳本评肆,挺好用的,感興趣的可以研究下责循。
以上的腳本其余部分糟港,都是ansible的正常模塊攀操,可以使用
ansible-doc 模塊名 #查看模塊的具體用法
最后
ansible在自動(dòng)化上還是有很大的功用的院仿,以上只是個(gè)人在使用ansible的一些小經(jīng)驗(yàn),希望能幫到大家速和。