Windows-Server-2008

了解 Windows 部署自動化中 Puppet 的案例

  • December 16, 2016

我必須在 Windows 環境中自動化一些任務。使用的技術是 MS SQL Server 2008、IIS、MSMQ 等。執行應用程序的所有依賴項都安裝在一台機器上。但是,在生產環境中,依賴項是在不同的實例上設置的。到目前為止,在任何實例上安裝依賴項(SQL 伺服器、IIS 等)都是手動的。

我計劃做的第一件事是創建一個包含所有依賴組件(軟體)的基礎映像。我認為 Puppet 和 Powershell 以及 Jenkins 將在這方面幫助我。我是 Puppet 和 Powershell 的新手。

我的目標是:

1)在基礎機器上自動安裝軟體。

  1. 在所有(或大多數)環境(Dev、Integration、Staging、UAT、Production)上使用此映像

上述兩個步驟都應該是自動化的。

現在我的困惑是,如果我使用 Powershell 安裝 SQL 伺服器(以及其他軟體),那麼 Puppet 會出現在哪裡?我可以通過使用環境的自定義配置文件從 Jenkins 呼叫這個 Powershell 腳本來部署在不同的環境中。我在這裡不了解 Puppet 的真實案例嗎?我是否應該實際使用任何其他工具,例如 Docker 等?請指導我。

PowerShell vs Puppet 是個錯誤的問題

這甚至都不是一回事。Puppet 可以執行 PowerShell 腳本。但還有另一個重要原因,兩者並沒有真正的可比性。

PowerShell 是程序性的,Puppet 是聲明性的。您還可以將PowerShell 與 Puppet 一起使用,前提是您使用方法使對腳本的這些呼叫具有冪等性檢查。

exec { 'rename-guest':
 command   => file('guest/rename-guest.ps1'),
 onlyif    => file('guest/guest-exists.ps1'),
 provider  => powershell,
 logoutput => true,
}

Puppet 還具有報告、差異、自動更正 Puppet 之外的更改(稱為配置漂移)以及許多使其成為配置管理工具而不是腳本語言的功能。

Puppet + PowerShell是一個更完整的解決方案。現在讓我們看看使用本機資源來真正減少程式碼。

範例 - 確保 IIS 和 ASP.NET 安裝

假設您要執行一個腳本來確保 IIS 和 ASP.NET 的安裝。您需要確保提供所有正確的檢查,以便如果該腳本多次執行,它不會出錯。您基本上要確保安裝了 IIS 並配置了 ASP.NET,否則退出。

在 Puppet 中這樣做是微不足道的。假設這是部署到 Windows Server 2012 機器:

 windowsfeature { 'Web-WebServer':
   installmanagementtools => true,
 } ->
 windowsfeature { 'Web-Asp-Net45':
 } 

這就是確保安裝 IIS 和 ASP.NET 所需的全部內容。想像一下,您需要編寫多少行 PowerShell 才能做到這一點。

有一個更完整的範例,用於在puppet-chocolatey_server設置一個完整的具有權限的網站。

管理 SQL Server 安裝

您可以使用SQL Server 模組。這是一個範例(有更多相關範例可用):

sqlserver_instance{ 'MSSQLSERVER':
 features              => ['SQL'],
 source                => 'E:/',
 sql_sysadmin_accounts => ['myuser'],
} 

安裝軟體

當您使用Chocolatey時,這變得微不足道。

  • 是的,Chocolatey 建立在無人值守安裝和 PowerShell 之上。
  • 是的,Chocolatey 與 zip 和執行時二進製文件一起工作。
  • 不,它不需要網際網路。
  • 它也不需要您在執行時從 Internet 下載東西。

Chocolatey 是一個完整的軟體管理工具,可以直接集成到 Puppet中。

通常使用 Chocolatey 的組織不使用社區包儲存庫( https://chocolatey.org/packages ),因為那裡提供的包受分發權約束,需要在執行時從官方位置下載。組織通常對損壞的容忍度非常低,因此他們創建和託管自己的包(在內部他們沒有分發合法性)。這樣,該過程是完全安全的、可重複的和可靠的。

package { 'notepadplusplus':
 ensure   => latest,
 provider => 'chocolatey',
 source   => 'https://internal/odata/repo/',
}

引用自:https://serverfault.com/questions/820361