共用方式為


使用 Chocolatey 設定持續部署

注意

Azure 自動化 狀態設定 將於 2027 年 9 月 30 日淘汰,請依該日期轉換至 Azure 機器組態。 如需詳細資訊,請參閱 部落格文章 公告。 Azure Machine Configuration 服務結合 DSC 延伸模組、Azure 自動化狀態設定,以及客戶意見反應最常要求的功能。 Azure Machine Configuration 也包含混合機器支援 (透過已啟用 Arc 的伺服器提供)。

警告

Azure 自動化 DSC for Linux 已於 2023 年 9 月 30 日淘汰。 如需詳細資訊,請參閱公告

DevOps 領域中,有許多工具可協助處理持續整合管線中的各個點。 Azure 自動化狀態設定是 DevOps 團隊可以採用的新選項。

Azure 自動化是 Microsoft Azure 中的受控服務,可讓您使用 Runbook、節點以及共用資源 (例如認證、排程和全域變數),將各種工作自動化。 Azure 自動化狀態設定擴充了此自動化功能,而包含 PowerShell Desired State Configuration (DSC) 工具。 以下提供清楚的概觀

本文示範如何為 Windows 電腦設定持續部署 (CD)。 您可以輕鬆地擴充技術,以在角色中包含盡可能多的 Windows 計算機,例如網站,然後從該處移至更多角色。

IaaS VM 的持續部署

概括而言

這裡要進行的事項很多,不過幸好,大致上可分成兩個主要程序:

  • 撰寫程式碼並測試,然後針對系統的主要和次要版本,建立並發佈安裝封裝。
  • 建立和管理 VM,以安裝及執行封裝中的程式碼。

完成這兩個核心程序後,隨著建立及部署新版本,可輕鬆自動更新 VM 上的套件。

元件概觀

apt-get 這類封裝管理員在 Linux 領域中是眾所周知的,但在 Windows 領域中沒有那麼出名。 Chocolatey 是適用於 Windows 的套件管理員。 斯科特·漢塞爾曼關於巧克力的 博客 文章是一個很好的介紹。 Chocolatey 可讓您使用命令行,將套件從中央存放庫安裝到 Windows 操作系統。 您可以建立和管理您自己的儲存機制,而 Chocolatey 可以從您指定的任何數量的儲存機制來安裝封裝。

PowerShell DSC 是一個 PowerShell 工具,可讓您為電腦宣告您想要的組態。 例如,如果您想要安裝 Chocolatey、安裝 IIS、開啟連接埠 80,以及安裝 1.0.0 版的網站,DSC 本機 Configuration Manager (LCM) 會實作該組態。 DSC 提取伺服器有一個儲存機制保存您電腦的組態。 每台電腦上的 LCM 會定期檢查電腦的組態是否符合已儲存的組態。 它可能報告狀態,也可能嘗試讓電腦回復到符合已儲存的組態。 您可以編輯提取伺服器上儲存的組態,讓一台電腦或一群電腦符合已變更的組態。

DSC 資源是具有特定功能的程式碼模組,例如管理網路、Active Directory 或 SQL Server。 Chocolatey DSC 資源知道如何存取 NuGet 伺服器、下載套件、安裝套件,以及執行其他工作。 PowerShell 資源庫中有許多其他 DSC 資源。 您要將這些模組安裝到您的 Azure 自動化狀態設定提取伺服器 (由您安裝),以供您的組態使用。

Resource Manager 範本提供為基礎結構產生資源的宣告式方式,例如:

  • 網路和子網
  • 網路安全性
  • 路由
  • 負載平衡器,
  • NIC、VM 和其他

如需 Resource Manager 部署模型(宣告式)與 Azure 傳統部署模型(命令式)的比較,請參閱 Azure Resource Manager 與傳統部署。 本文包含核心資源提供者:計算、儲存體和網路的討論。

Resource Manager 範本的其中一個重要功能是在 VM 布建期間安裝 VM 擴充功能。 VM 延伸模組具有特定功能,例如執行自訂指令碼、安裝防毒軟體以及執行 DSC 組態指令碼。 有許多其他類型的 VM 延伸模組。

圖表速覽

從頂端開始,您可以撰寫程式碼、建置及測試,然後建立安裝封裝。 Chocolatey 可以處理各種類型的安裝封裝,例如 MSI、MSU、ZIP 等。 如果 Chocolatey 的原生功能不足夠,您還有 PowerShell 的完整功能可執行實際安裝。 將套件放入隨手可得之處 - 套件存放庫。 這個使用範例使用 Azure blob 儲存體帳戶中的公用資料夾,但可以是任何位置。 Chocolatey 可自然搭配 NuGet 伺服器和其他一些工具,一起管理封裝中繼資料。 這篇文章 說明選項。 使用範例會使用 NuGet。 Nuspec 是封裝的中繼資料。 Nuspec 資訊會編譯成 NuPkg 並儲存在 NuGet 伺服器上。 當您的組態依名稱要求某個封裝,並參考 NuGet 伺服器時,Chocolatey DSC 資源 (位於 VM 上) 會為您抓取封裝並加以安裝。 您也可以要求特定版本的封裝。

圖表的左下方有一個 Azure Resource Manager 範本。 在這個使用範例中,VM 延伸模組會將 VM 註冊到 Azure 自動化狀態設定提取伺服器以做為節點。 設定會儲存在提取伺服器兩次:一次是純文字,一次則編譯為 MOF 檔案。 在 Azure 入口網站中,MOF 代表節點組態 (而非只是組態)。

建立 Nuspec、編譯 Nuspec 並將其儲存在 NuGet 伺服器相當簡單。 持續部署的下一個步驟需要下列一次性工作:

  • 設定提取伺服器
  • 向伺服器註冊您的節點
  • 在伺服器上建立初始設定

當您升級套件並將其部署至存放庫時,您只需要重新整理提取伺服器上的組態和節點組態。

如果您不是從 Resource Manager 範本開始,有 PowerShell 命令可協助您向提取伺服器註冊 VM。 如需詳細資訊,請參閱將機器上架交由 Azure 自動化狀態設定進行管理

關於使用範例

本文中的使用範例開頭 VM 是來自於 Azure 資源庫的一般 Windows Server 2012 R2 映像。 您可以從任何預存的映像開始,再從那裡使用 DSC 組態進行調整。 不過,變更已併入影像的組態,要比使用 DSC 動態更新組態難得多。

將這項技巧運用在 VM 時,不需要使用 Resource Manager 範本和 VM 擴充功能。 此外,VM 不在 Azure 上也能由 CD 管理。 只要在 VM 上安裝 Chocolatey 並設定 LCM,即可知道提取伺服器的位置。

在生產環境中的 VM 上更新套件時,VM 在安裝更新時必須脫離輪替。 視情況而定,作法會有很大的差異。 例如,如果 VM 在 Azure 負載平衡器後方,您可以加入自訂探查。 更新 VM 時,讓探查端點傳回 400。造成此變更所需的調整可能位於您的設定內,因為調整可在更新完成之後將其切換回傳回 200。

此使用範例的完整原始檔位於 GitHub 上的 Visual Studio 專案

步驟 1:設定提取伺服器和自動化帳戶

在已驗證的 PowerShellConnect-AzAccount 工作階段執行下列命令:

New-AzResourceGroup -Name MY-AUTOMATION-RG -Location MY-RG-LOCATION-IN-QUOTES
$newAzAutomationAccountSplat = @{
    ResourceGroupName = 'MY-AUTOMATION-RG'
    Location = 'MY-RG-LOCATION-IN-QUOTES'
    Name = 'MY-AUTOMATION-ACCOUNT'
}
New-AzAutomationAccount @newAzAutomationAccountSplat

在設定提取伺服器時,此步驟需要幾分鐘的時間。

您可以在下列任何 Azure 區域中建立自動化帳戶:

  • 美國東部 2
  • 美國中南部
  • US Gov 維吉尼亞州
  • 西歐
  • 東南亞
  • 日本東部
  • 印度中部
  • 澳大利亞東南部
  • 加拿大中部
  • 北歐

步驟 2:讓 VM 延伸模組根據 Resource Manager 範本進行調整

Azure 快速入門範本提供 VM 註冊的詳細資料 (使用 PowerShell DSC VM 延伸模組)。 此步驟會將新的 VM 註冊到提取伺服器的狀態設定節點清單中。 這項註冊的一部分會指定要套用至節點的節點組態。 此節點組態尚未存在於提取伺服器中,但您必須選擇節點的名稱和組態的名稱。 在這裡範例中,節點為 isvbox ,且組態名稱為 ISVBoxConfig。 您在 中指定的 DeploymentTemplate.json 節點群組態名稱是 ISVBoxConfig.isvbox

步驟 3:將所需的 DSC 資源新增至提取伺服器

PowerShell 資源庫 可以將 DSC 資源安裝到您的 Azure 自動化 帳戶。 流覽至您想要的資源,然後選取 [部署至 Azure 自動化]。

PowerShell 資源庫範例

最近新增至 Azure 入口網站的另一種技術可讓您提取新的模組或更新現有模組。 選取 [ 瀏覽資源庫] 圖示以查看資源庫中 的模組清單、鑽研詳細數據,以及匯入您的自動化帳戶。 您可以使用此程式讓您的模組保持在最新狀態。 此外,匯入功能會檢查與其他模組的相依性,以確保不會同步。

另外還有一種手動方法,除非您稍後想要升級,否則每個資源只會使用一次。 如需關於撰寫 PowerShell 整合模組的詳細資訊,請參閱撰寫 Azure 自動化的整合模組

注意

適用於 Windows 電腦的 PowerShell 整合模組資料夾結構,與 Azure 自動化所需的資料夾結構稍有不同。

  1. 安裝 Windows Management Framework v5 (Windows 10 不需安裝)。

  2. 安裝整合模組。

    Install-Module -Name MODULE-NAME`    <—grabs the module from the PowerShell Gallery
    
  3. 將模組資料夾從 C:\Program Files\WindowsPowerShell\Modules\MODULE-NAME 複製到暫存資料夾。

  4. 刪除主要資料夾中的範例和文件。

  5. 壓縮主要資料夾,ZIP 檔案的命名與資料夾相同。

  6. 將 ZIP 檔案放到可存取的 HTTP 位置,例如 Azure 儲存體帳戶中的 Blob 儲存體。

  7. 執行下列命令。

    $newAzAutomationModuleSplat = @{
        ResourceGroupName = 'MY-AUTOMATION-RG'
        AutomationAccountName = 'MY-AUTOMATION-ACCOUNT'
        Name = 'MODULE-NAME'
        ContentLinkUri = 'https://STORAGE-URI/CONTAINERNAME/MODULE-NAME.zip'
    }
    New-AzAutomationModule @newAzAutomationModuleSplat
    

隨附的範例會針對 cChoco 和 xNetworking 實作這些步驟。

步驟 4:將節點組態新增至提取伺服器

第一次將組態匯入到提取伺服器並編譯,並沒有什麼特殊之處。 稍後所有的匯入或編譯相同組態過程完全相同。 每次更新套件且需要向外推送到生產環境時,在確定設定檔正確之後 (包括套件的新版本),就會執行此步驟。 以下是組態檔 ISVBoxConfig.ps1

Configuration ISVBoxConfig
{
    Import-DscResource -ModuleName cChoco
    Import-DscResource -ModuleName xNetworking

    Node 'isvbox' {

        cChocoInstaller installChoco
        {
            InstallDir = 'C:\choco'
        }

        WindowsFeature installIIS
        {
            Ensure = 'Present'
            Name   = 'Web-Server'
        }

        xFirewall WebFirewallRule
        {
            Direction    = 'Inbound'
            Name         = 'Web-Server-TCP-In'
            DisplayName  = 'Web Server (TCP-In)'
            Description  = 'IIS allow incoming web site traffic.'
            Enabled       = 'True'
            Action       = 'Allow'
            Protocol     = 'TCP'
            LocalPort    = '80'
            Ensure       = 'Present'
        }

        cChocoPackageInstaller trivialWeb
        {
            Name      = 'trivialweb'
            Version   = '1.0.0'
            Source    = 'MY-NUGET-V2-SERVER-ADDRESS'
            DependsOn = '[cChocoInstaller]installChoco','[WindowsFeature]installIIS'
        }
    }
}

下列 New-ConfigurationScript.ps1 腳本已修改為使用 Az PowerShell 模組:

$importAzAutomationDscConfigurationSplat = @{
    ResourceGroupName = 'MY-AUTOMATION-RG'
    AutomationAccountName = 'MY-AUTOMATION-ACCOUNT'
    SourcePath = 'C:\temp\AzureAutomationDsc\ISVBoxConfig.ps1'
    Published = -Published
    Force = -Force
}
Import-AzAutomationDscConfiguration @importAzAutomationDscConfigurationSplat

$startAzAutomationDscCompilationJobSplat = @{
    ResourceGroupName = 'MY-AUTOMATION-RG'
    AutomationAccountName = 'MY-AUTOMATION-ACCOUNT'
    ConfigurationName = 'ISVBoxConfig'
}
$jobData = Start-AzAutomationDscCompilationJob @startAzAutomationDscCompilationJobSplat

$compilationJobId = $jobData.Id

$getAzAutomationDscCompilationJobSplat = @{
    ResourceGroupName = 'MY-AUTOMATION-RG'
    AutomationAccountName = 'MY-AUTOMATION-ACCOUNT'
    Id = $compilationJobId
}
Get-AzAutomationDscCompilationJob @getAzAutomationDscCompilationJobSplat

步驟 5:建立及維護封裝中繼資料

對於放入封裝儲存機制中的每一個封裝,您需要 Nuspec 來加以描述。 其必須經過編譯並儲存在 NuGet 伺服器中。 如需詳細資訊,請參閱[使用 nuget.exe CLI 建立 NuGet 套件]。

您可以使用 MyGet.org 做為 NuGet 伺服器。 您可以購買此服務,但有免費的入門 SKU。 如需為私人套件安裝您自己的 NuGet 伺服器相關指示,請參閱 Nuget.org

步驟 6:結合在一起

每當有某個版本通過 QA 並核准可部署時,即會建立封裝,且 nuspec 及 nupkg 會更新並部署至 NuGet 伺服器。 您必須使用新的版本號碼來更新組態 (步驟 4)。 然後,將它傳送至提取伺服器並加以編譯。

從這裡開始,則須由依存於該組態的 VM 提取更新並加以安裝。 這些更新內容每一個都很簡單 - 只有一兩行 PowerShell。 針對 Azure DevOps,其中一些會封裝在建置工作中,您可以在組建中鏈結在一起。 本文將詳加說明。 此 GitHub 儲存機制會詳細說明可用的組建工作。

下一步