The Art of Readable Code && High Performance Comments

最近趁著專案比較有空閒,把公司內部的伺服器、服務稍做打造。目前公司裡有 X 台實體 server,每項專案或服務會再建立虛擬機器放置,加快安裝、部署,並避免相互干擾。現在連同虛擬機器,已經有了 YZ 台,要維護每台機器的設定、帳號、權限、功能,並建立對照表,實在是件很麻煩的事。更別說將更新的設定、軟體,安裝到每台機器上了。

之前無線基地台|Gateway 發狂了一陣子,雖說後來是用更換 ip 這種逃避的手段,但也構思了自動更新所有 server 設定的手法。最近總算把這套作法實作出來。

服務主要分成兩部份:

  • 伺服器端:負責驗證客戶端的身份,並提供適當的設定檔案供客戶端下載
  • 客戶端則:是驗證自身運行的服務,服務狀態,備份、下載並更新設定檔

伺服器端的專案名稱叫做 dns,顧名思義,這個專案起初是以維護公司的內部  dns 為目標。因此它實作了基本的網頁編輯界面,以及輸出成 bind9 設定檔的功能。這個部份是透過 FuelPHP 來寫作:

  • 使用者界面整合了 Controller_Template 與 ORM,得以快速實作資料的 CRUD,並建立關聯(包含資料查驗)
  • 設定檔下載的部份,也利用了 ORM 帶來的便利
  • 目前設定檔的全部內容都是透過程式碼 (controller) 產生;但其實有很多固定的部份,依照 MVC 的精神,其實應該做成 View
  • 使用者登入與權限的部份仍在進行中。雖說 FuelPHP 提供了 Auth 這個 Package,但總覺得它挺廢的 XD 我不喜歡把 權限(ACL)和群組 (Group)寫在程式碼裡的感覺,並且目前 FuelPHP 沒有好的 LDAP 套件。因此我決定自己打造一個 CAuth 套件,整合 DB, LDAP, OpenID 等認證模式。等到這部份完成,專案應該也能夠 release 了XD
  • 資料的備份與還原更簡單,因為我手邊有之前寫出來的 MySQL dump + Compress + Encrypt 碼;稍加修改應該就能頂著用囉
  • FuelPHP 也有 environment 的設定(跟大多數框架一樣),搭配 Apache httpd SetEnv,就會自動在上線目錄套用設定,簡化設定 + 避免搞爛上線資料
  • 透過設計 routing,我有一隻叫做 ‘etc’ 的 controller,能夠比照系統的  /etc 目錄來運作;並且當對應的 handler 不存在時,傳回 Status Code 404

客戶端的部份,因為不會有大量運算/記憶體需求,所以我也是用 PHP 實作…..一套服務框架 XD 任何 task 只要實作繼承自 Handler_Base 的物件,填入設定並實作必要函式,就能在框架裡運行。這個框架大概有幾項核心要素:

  • Handler_Base:基底物件,實作大部分的工具,例如 fetch() 可以抓 某個 uri 回來,並在 404 回傳 false;service_*() 負責 restart/reload service,或者回報 service status;apt_* 則是操作 apt-get 等。當然也定義了常用的執行流程、Lock、查驗 等等
  • main.php :接受命令列指令,產生 Handler 實體,並依照順序呼叫;如果不是 root 會自動呼叫 sudo
  • run_on.php:指定要執行指令的主機列表,以及要執行的指令;在設定免密碼 ssh 登入之後,會自動連到指定的主機執行指令
  • args.php:解析命令列參數

不過話說回來,在系統上放任免密碼登入 + sudo 的帳號,代表「只要有任何一台 server 失守,就全部瞬間打穿」,懶惰的風險還真高啊 XD 順道一題,這個(客戶端)專案的名字就叫做 lazymis :p

發表迴響

分類

%d 位部落客按了讚: