Windows Server 2012、Windows PowerShell 3.0、DevOps – Part 1

在這個分為二部分的系列文章當中第一篇文章,我將會提供有關 PowerShell 和 DevOps 的一些技術背景資訊。在第二篇文章當中,則向您介紹一些相關細節。PowerShell 3.0 與 Windows Server 2012 類似,具有大量的新功能和增強功能,因此這裡僅僅簡略介紹部份內容。

–Cheers – Jeffrey

我是在介紹 2009 Velocity 大會的部落格當中第一次聽說 DevOps。在業界大多數人每年部署幾次發佈版本都會感到吃力的同時,John Allspaw 和 Paul Hammond 卻高調的宣稱“每天部署 10 次: 開發人員與維運人員在 Flickr 上的協同合作”。他們創造出透過改變文化和工具傳遞營運結果的案例,並且催生出一個新名詞「DevOps」。問題是開發人員認為他們負責傳遞功能,維運人員則認為他們負責維持網站運作。開發人員與維運人員的分工不同導致在發生錯誤時互相指責。成功的營運需要共同承擔責任和互相尊重的 IT 文化: 開發人員應該要考慮維運人員的需求和注意事項,同樣的維運人員也應該考慮開發人員的需求和注意事項。   
他們的談話說明了企業需要如何因應快速變化,而該變化也是大多數網站關閉事件的根本原因。他們避開了傳統“避免變化”的做法,主張透過自動化使改變能更安全一些並將風險降至最低。這就是 DevOps 的工作 – 安全性變化。這是應用於 IT 操作的 Taguchi 品質方法。Taguchi 注意到,品質差的根本原因是改變。解決的辦法是首先弄清楚如何重複做一些事情。如果能夠這樣做,便可以在該過程中進行一些小小的變動,以瞭解這些變動是使事情變得更好還是更糟,停止使事情變得更糟的變動,繼續做使事情變得更好的動作關鍵是「可重複性」。可重複性使我們能夠執行一些促使改進的實驗,我們透過自動化在 IT 操作中獲得可重複性。   
我們透過發佈 Monad Manifesto 開始 PowerShell,該版本清楚的說明了我們看到的問題、解決這些問題的方法以及要傳遞的元件。我們建構了一個分散式自動化引擎和一種指令碼語言。資淺的維運人員和經驗豐富的開發人員將使用該引擎和語言。催生出 DevOps 構想和價值同樣可以套用於 PowerShell 設計:

1. 專注於營運。

2. 透過自動化進行安全性變動。

3. 消除開發人員和維運人員之間的隔閡。

專注於營運
PowerShell 始終專注於在營運環境中使用電腦的人。PowerShell 需要 一致性、安全性高效率 。PowerShell 和 UNIX 之間有許多相似之處,但在此一重點上我們與 VMS/DCL、AS400/CL 更為相像。   
一致性: 維運人員和開發人員沒有太多的時間學習新知識。一致性的體驗可讓他們一次性的投入精力於一套技能當中,然後可以反覆使用這些技能。PowerShell 對於所有指令使用一個通用的分析程式並且執行通用的參數驗證,在命令列語法當中提供絕對的一致性。PowerShell Cmdlet 的設計方式為,普遍存在的參數可以向所有指令提供一致性的函數(例如 –ErrorAction、–ErrorVariable、–OutputVariable …等)   
安全性: 維運人員曾經告訴過我,有時他正準備做某事時就會意識到,如果做錯了他可能會被解雇。在 PowerShell 當中,如果您曾經執行某個對系統有負面影響的 Cmdlet,則可以事先鍵入–WhatIf 參數來測試如果執行此操作時會發生什麼情況。我們還支援 –Confirm、–Verbose、–Debug 參數。不過儘管有這些測試運作參數但是仍然可能發生錯誤,如果發生錯誤時 PowerShell 將會做出許多努力以加快診斷和糾正錯誤。   
高效率: PowerShell 設計的每個方面都是為了最大程度提高管理人員的能力(因此而得名)。PowerShell 可以跨越大量主機輕鬆執行批次操作。PowerShell 還可以讓維運人員與開發人員之間輕鬆且高效率的協同合作,因為 PowerShell 允許他們使用共同的語言並且在腳本當中互相幫助。   
透過自動化進行安全性變動
PowerShell 為 .Net 語言、指令碼語言、互動式 Shell? 這已經討論過許多遍了!! PowerShell 是一個帶有指令碼語言和互動式 Shell 的分散式自動化引擎。互動式 Shell 和指令碼語言是關鍵元件,但是重點在於透過腳本達成的自動化。自動化是減少和消除由人為執行的操作過程。腳本記錄要發生的事情。管理人員可以查看腳本並且根據他們的回應修改該腳本。您可以測試腳本、觀察結果、修改腳本,如果修改效果良好則可以保持,如果效果不佳則可以停止。換句話說,腳本提供將 Taguichi 方法應用到 IT 操作的可重複性。在擁有自動化過程之後,便可以安全性的反覆應用該過程。現在資淺的管理人員可以執行這些過程。使用傳統的 GUI 管理工具時是不可能執行這些步驟的。   
消除開發人員和維運人員之間的隔閡
我們的目標始終是傳遞可以滿足維運人員執行臨時操作、簡單腳本、正式腳本、進階腳本和開發人員執行系統級程式設計時所需要的單一工具。   
PowerShell 花費了大量的心力嘗試計畫,針對任務並且具有統一語法和語義的高度抽象語法的環境。我們將之稱為 Cmdlet。這也正是維運人員確實有效能管理系統所需的方法。要使用 API 進行複製檔案的動作,您需要執行以下操作:

clip_image001[9]
您有沒有想過為何 PowerShell 要使用大括弧 {}(和其他 C 語言構造函數),而不使用其他指令碼語言使用的 BEGIN/END? 這樣做是因為我們想讓開發人員更輕鬆的採用其他 C 語言的程式設計語言: C++、Objective C、Java、JavaScript、Perl、PHP …等。我們做了一些測試並且確定維運人員能夠輕鬆適應這種語法。我們還希望提供一種在 PowerShell 和 C# 之間順利轉換的途徑。希望為從開發人員轉為維運人員提供職業移動性。   
最重要的是,我們希望開發一種維運人員和開發人員都可以使用的工具,以消除這二個團隊之間的差異,並且允許他們建立通用腳本,以便互相學習攜手合作。   
Windows Server 2012 和 PowerShell 3.0 是卓越的 DevOps 工具
DevOps 是一個新術語,關於它會帶來什麼好處目前還存有一些不同的意見,但是在本質上它完全是透過自動化來保證變化的安全性,並且希望消除維運人員和開發人員之間的差異。在該領域有許多工作要做,但是 Windows Server 2012 和 PowerShell 3.0 為了達成這些目標取得了相當成效的進步。PowerShell 不會是您的 DevOps 工具箱中的唯一工具,但它是每個 DevOps 工具箱中不可或缺的工具。請立即 下載 Windows Server 2012 RC 版本 並且親自體驗一下。   
Cheers!

Jeffrey Snover  
Windows Server 團隊傑出工程師及首席架構師