DevOps課程-Configuration Management with Ansible 12
接著本篇的作業需要完成以下幾點:
- 安裝App Dependencies →node_modules目錄(上一篇只搬好Code)
其中package.josn裡面有描述需要的Dependencies
2. 執行node指令驅動app目錄裡面的service.js
所以首先開始撰寫安裝Dependencies部分
首先找到Ansible的npm modules:
這邊要小心,永遠都要注意當前要使用的檔案位置在哪
多數的module都是驅動"目標機台"上的"目錄位置"
只有少數可以用"掌控機"上的(像上一篇用到的解壓縮模組:unarchive)
這邊npm的module使用的都是目標機
接著撰寫node指令啟動的部分
先找到需要的modules:
一種標準寫法如下:
將以上改好的ansible code放到主控機
#在/home/ubuntu/ansible目錄下執行playbook指令:
ansible-playbook -i hosts deploy-node.yaml
會卡住是因為被這個啟動指令hang住,所以其實應該改為背景執行的方式
這時候需要微小調整,需要async,先找doc找到:
任何module都能搭配使用到async & poll,但是階層會跟module同階
所以可以改成:
其中對於上述這兩個值得解說並不是很完整
尤其是官網doc完全沒有講當poll為0的併發process時
async的值又代表甚麼意義!?
首先先解釋poll >0 時候,poll值是循環確認任務,而async的值是
但是poll=0則是要併行的任務,像是背景執行Server等
但是我納悶的是當poll=0這時候async的值的意義?
所以基本上只要大於0就好,照範例設個1000
依樣將目前code同步到主控機並重新執行
當前:
在主控機執行:
#在/home/ubuntu/ansible目錄下執行playbook指令:
ansible-playbook -i hosts deploy-node.yaml
確認一下目標機狀況:
接著為了不用那麼麻煩還要伸手到目標機確認狀態
簡單點就是讓Ansible來確認,使用module →shell
使用shell module來協助確認node server運行狀態
基本上shell module跟command module很像
但是shell可用到pipe"|",導引值的"<"與">"符號,boolean的"&&"或"||",
還有變數如"$HOME"這種寫法
不過整體上直接用shell比較沒有那麼安全,會有shell injection疑慮
(也可以寫到sh檔,用command去呼叫)
基本上Code可以再改成這樣:
然後將上面ps aux結果塞入一個參數中
這一樣是一個共用的寫法,任何module都能用 →register
接著要將這個參數印出來,則需要另一個module →debug
一樣將目前Code上到主控機執行:
#在/home/ubuntu/ansible目錄下執行playbook指令:
ansible-playbook -i hosts deploy-node.yaml
接著可以再改進Code為:
在執行一次看到:
但是這邊講師的畫面則是如下:
並解釋最新在09:17執行的Job消失,舊的仍在運行
因為每次這一步都重複執行:
我猜這種同時看到兩個在運行的畫面是有一定機會看到
(只是我這邊沒有發生,可能也是有機會!)
理由是:
不論command或是shell都不是stateful
- 所以不像前面的那些綠色ok的步驟
- 綠色ok的步驟背後Ansible都能檢查是否已經完成過了
- 但是command或是shell則沒有辦法檢查,只能重複執行!
- 在像是Python這類作業通常都要寫確認狀態的語法,才能做下一步
- 但是Ansible或Terraform則是大多協助我們做完確認狀態(check state)
然後上面學完後發現,目標機上面的node server都自己結束了
看起來就是跟這個值有關係:
也有另外改成50秒:
真的一分鐘後去看就不見了:
所以若是要永久執行,看起來還是應該使用service module:
或是寫好sh檔,裡面下背景執行,讓command去完成sh檔就好!?
然後後來我才發現我一值少寫個東西,就是背景執行一定要帶的:
用這樣去試跑50秒的:
但還是會消失:
我直接比較標準的前面再帶nohup
#在command這個module區塊執行:
nohup node server &
看起來還是會消失:
所以我還是恢復如課程的Code如下
當前的Code內容為:
其他配置檔: