DevOps課程-Configuration Management with Ansible 12

Project:Deploy Nodejs application -Part2

ZONGRU Li
Apr 3, 2022

接著本篇的作業需要完成以下幾點:

  1. 安裝App Dependencies →node_modules目錄(上一篇只搬好Code)

其中package.josn裡面有描述需要的Dependencies

2. 執行node指令驅動app目錄裡面的service.js

所以首先開始撰寫安裝Dependencies部分

首先找到Ansiblenpm modules:

link
link
雖然講師用npm,但是最後她還是建議用全名

這邊要小心,永遠都要注意當前要使用的檔案位置在哪

多數的module都是驅動"目標機台"上的"目錄位置"

只有少數可以用"掌控機"上的(像上一篇用到的解壓縮模組:unarchive)

這邊npmmodule使用的都是目標機

接著撰寫node指令啟動的部分

先找到需要的modules:

link

一種標準寫法如下:

將以上改好的ansible code放到主控機

#在/home/ubuntu/ansible目錄下執行playbook指令:
ansible-playbook -i hosts deploy-node.yaml

會卡住是因為被這個啟動指令hang住,所以其實應該改為背景執行的方式

這時候需要微小調整,需要async,先找doc找到:

link

任何module都能搭配使用到async & poll,但是階層會跟module同階

所以可以改成:

其中對於上述這兩個值得解說並不是很完整

尤其是官網doc完全沒有講當poll0的併發process

async的值又代表甚麼意義!?

首先先解釋poll >0 時候,poll值是循環確認任務,而async的值是

link

但是poll=0則是要併行的任務,像是背景執行Server

但是我納悶的是當poll=0這時候async的值的意義?

所以基本上只要大於0就好,照範例設個1000

依樣將目前code同步到主控機並重新執行

當前:

在主控機執行:

#在/home/ubuntu/ansible目錄下執行playbook指令:
ansible-playbook -i hosts deploy-node.yaml

確認一下目標機狀況:

node server有啟動成功!

接著為了不用那麼麻煩還要伸手到目標機確認狀態

簡單點就是讓Ansible來確認,使用module shell

使用shell module來協助確認node server運行狀態

基本上shell modulecommand 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消失,舊的仍在運行

因為每次這一步都重複執行:

啟動node server步驟,每次都會執行,而不是跳過!

我猜這種同時看到兩個在運行的畫面是有一定機會看到

(只是我這邊沒有發生,可能也是有機會!)

理由是:

不論command或是shell都不是stateful

  • 所以不像前面的那些綠色ok的步驟
  • 綠色ok的步驟背後Ansible都能檢查是否已經完成過了
  • 但是command或是shell則沒有辦法檢查,只能重複執行!
  • 在像是Python這類作業通常都要寫確認狀態的語法,才能做下一步
  • 但是AnsibleTerraform則是大多協助我們做完確認狀態(check state)

然後上面學完後發現,目標機上面的node server都自己結束了

看起來就是跟這個值有關係:

也有另外改成50秒:

真的一分鐘後去看就不見了:

所以若是要永久執行,看起來還是應該使用service module:

link

或是寫好sh檔,裡面下背景執行,讓command去完成sh檔就好!?

然後後來我才發現我一值少寫個東西,就是背景執行一定要帶的:

發現講師畫面前面有這個符號,後面突然不見

用這樣去試跑50秒的:

但還是會消失:

我直接比較標準的前面再帶nohup

#在command這個module區塊執行:
nohup node server &

看起來還是會消失:

所以我還是恢復如課程的Code如下

當前的Code內容為:

其他配置檔:

參考課程reference

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet