Saturday, September 4, 2010

不使用 GPO 的自動安裝概念

緣起
由於在 Windows 環境, GPO 是一個整合的方案, 透過 AD 帳號認證, GPO 派送, 可以滿足這需求, 相對的就是要付出授權費.
但分公司有許多電腦, 搭載的 OS 無法加入網域, 但又有更新的需要, 所以構想著要讓更新自動化, 減少人力的成本.
(本來也有考慮 DRBL + Thin Client , 不過主管不喜歡這樣, 所以 Client 端仍有自己的 OS )

基本需求
1. 自動下載
2. 自動執行
3. 版本控制
4. 資料同步
5. 首次使用時的自動安裝
6. 異常時的還原

需要的環境
1. 提供安裝程式與資料的主機.
1a. 需要提供"唯讀"用的帳號密碼與權限.
1b. 另外提供一個"寫入"(回報)用的資料.
2. Client 端的環境要一致或相容版本.

Client安裝時的步驟
1. 硬碟分割為 C: 與 D: , 以公司的政策, 將來 C: (OS)很可能會安裝還原軟體,
必要的 OOo/FileZilla 於整理時安裝, 後台專用程式採用綠色版, 放在 D 槽.
(Documents and Settings 也在 D 槽)
2. 於 C: 與 D: 各放一些檔案:
C: 自動更新的主程式, 不含任何參數, 於本機群組原則設定開機時自動執行這程式. (PRG_AAA 這是程式)
D: 存放以下檔案:
a. 固定執行的程式目錄: 由遠端主機下載新程式用的程式, 或開機必執行的對時程式. (PRG_BBB 這是目錄)
b. 參數資料: ftp 或網芳的帳號密碼, 下載目錄. (PAR)
c. 當次更新的程式目錄: 每次下載新程式後, 暫存在本目錄, 執行完就移除掉. (PRG_CCC 這是目錄)
d. 版本更新資料: 用來比對安裝檔的版本, 或各程式是否已經安裝的判斷. (VER)
e. 工作用的目錄: (TEMP)
f. 公用程式目錄: Windows 未提供或更好用的工具. 例如: wget , md5 , zip , rsync 等.

Server目錄
Server 有幾套主要的版本區隔, 例如後台會計用, 後台訂購用, 各系列再各自有:
1. 版本參數目錄
2. 更新程式(批次檔或 VBS , 有判斷性質)目錄
3. 更新子程式(無判斷性質, 直接執行)或 Windows 封裝(MSI)

執行的原理
1. Client 端開機, 本機群組原則自動執行固定目錄下的程式. (PRG_AAA)
2. PRG_AAA 依序呼叫 PRG_BBB 目錄內的批次檔或 VBS .
3. PRG_BBB 目錄內的檔案, 先依 PAR 參數, 向主機抓取目前主機上的版本與清單, 存到 TEMP 目錄.
4. PRG_BBB 的程式, 比對 TEMP 目錄下的清單, 與本機 VER 目錄下的清單. (這階段只是列表)
5. 依清單判斷, 有需要異動的程式清單.
6. PRG_BBB 再向主機抓取真正要異動的程式, 存到 PRG_CCC.
7. PRG_CCC 下的程式會進行以下步驟:
7a. 判斷目前主機上的參數. (例如後台自動安裝印表機, 判斷哪幾台有裝過了)
7b. 抓取必要的安裝程式或 MSI 檔與 md5 檔.
7c. 比對檔案是否一致. (md5)
7d. 執行安裝程式. (盡量用指令或免 UI 完成)
7e. 判斷程式是否安裝完成. 如果完成, 在本機 VER 目錄更新版本清單.
7f. 刪除掉 PRG_CCC 內本身的程式與相關的程式.
(註: 無論更新是否完成, 都是由 VER 判斷, 所以執行的程式本身都是臨時性的)
8. 重複執行多次 PRG_CCC 底下的程式, 直到全部安裝完成.

移除程式
移除程式基本上不是這一個架構會處理的部份,
而是在前一段的"執行的步驟"中, 呼叫安裝程式, 改成呼叫移除程式的功能.
所以選用程式, 最好是安裝與移除都能用指令或免 UI 完成.

製作母碟時的考慮
最好以某一天的母碟當樣本, 後續有更新的部份, 都要列入, 例如:
母碟原本的 ntp 是指向 ntp_A , 最近要換到 ntp_B ,
則新母碟若已經更換為 ntp_B , 要在 VER 記錄, 以免重複執行.
可能每一兩年會依後台主機規格重新製作母碟, 對該母碟的版本控制就靠 VER 內的清單.

更換主機或公用程式等
難免遇到主機狀況, 有兩個方式解決:
1. 預期的移機: 將主機上的程式複製一份到新主機, 並安排一個安裝檔, 負責把 PAR 目錄下的參數換掉;
通知所有後台當天一定要開機, 等下次 PRG_BBB 呼叫時, 就會到新主機抓取.
(也可以呼叫回寫主機, 確保該主機已經完成更換動作)
2. 非預期的停機: 先建立一台臨時主機, 或者利用 Domain Name 指向備用機, 再更新.
(在 PRG_BBB 內要設定連線失敗的參數, 例如 ping 2 次失敗就不連線了)
3. 雖然 wget 等程式, 參數幾乎都不變, 不過遇到要換版本等狀況, 打包成一個檔案, 由 PRG_CCC 替換掉原程式即可.

程式撰寫時的特性
1. 依序執行: 由於有些程式可能有順序性, 考慮將檔名依 0~9 排列, 由 0 先執行. (類似 Linux 的 S00~S99 )
2. 各程式安裝時, 要有未完成能還原的機制, 例如先將舊檔改名, 放新檔, 再比對新檔, 確定完成.
3. 要加上許多判斷點: 例如 md5 , 檢查檔案存在等.
4. 善用 Windows 本身的工具程式, 這也就是最好 OS 版本不要差太多,
例如: 我這邊偏好使用 XP SP2 光碟(當初的正版光碟)再裝 SP3 當母碟, 而非 XP SP3 光碟安裝(後來 MSDN 下載的),
Super XP 就絕對不考慮(因為有些程式被移除掉, 會造成掃描器無法驅動/PPPoE 無法連線等異常)
5. 共用參數的資料, 盡量存在 PAR 目錄下, 而不使用 Windows 的 SET .

Lab 經驗
1. 自動安裝/移除印表機.
2. 安裝 Flash 10 (未移除)
3. 更新後台主機用的資料.

Lab 要加強的部份
1. 如何依序執行 PRG_BBB 下的程式
2. 將檢查檔案由 fc 改用 md5
3. 印表機安裝程式該算公用程式, 或每次使用才下載?
4. 總部對 Client 端版本的取得.
5. 版本檔的命名原則.

以上就是個人工作上, 最近可能要執行的方案, 先提出概念, 算分享也歡迎指教,
至於實作的部份, 牽涉到許多因素, 不會再深入說明.