Ansible 以其簡潔易用和代理程式無關的特性,成為自動化管理 Linux 系統的利器。然而,它的能力不僅限於此,也能有效管理 Windows 系統。本文將探討如何設定 Windows 主機,讓 Ansible 的自動化能力延伸至 Windows 世界。

Ansible 在 Windows 自動化方面展現了強大實力,涵蓋了資訊收集、功能安裝與移除、服務管理、使用者帳戶管理、軟體套件管理(透過 Chocolatey)、Windows 更新、檔案傳輸,以及 PowerShell 命令和指令碼執行等多個導向。無論是使用本地使用者或網域使用者,Ansible 都能透過 Windows 的 runas 支援,以管理員許可權執行操作,如同 Linux 的 sudo 命令。此外,Ansible 的開源特性允許您建立自定義 PowerShell 模組,或直接傳送 PowerShell 命令,以擴充套件其功能,滿足特定需求,例如資安團隊可以輕鬆管理檔案系統 ACL、設定 Windows 防火牆,以及管理主機名稱和網域成員資格。

Windows 主機的 Ansible 自動化設定

要讓 Ansible 控制主機與 Windows 主機順暢溝通,必須滿足以下條件:

  • Windows 版本:Ansible 支援所有獲得 Microsoft 現行或延伸支援的 Windows 版本,包括 Windows 8.1、10 和 11 等桌面平台,以及 Windows Server 2012 (和 R2)、2016、2019 和 2022 等伺服器作業系統。
  • PowerShell 和 .NET Framework:Windows 主機上需安裝 PowerShell 3.0 或更高版本,以及 .NET 4.0 或更高版本。
  • WinRM 監聽器:必須建立並啟用 WinRM 監聽器,這並非 Windows 預設啟用的功能。

設定步驟詳解

以下步驟將引導您完成 Windows 主機的 Ansible 自動化設定:

  1. 確認 PowerShell 和 .NET Framework 版本: 多數現代 Windows 系統已預裝這些元件。若版本過舊,則需升級。您可以手動執行,或使用以下 PowerShell 指令碼自動處理:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$url = "https://raw.githubusercontent.com/jborean93/ansible-windows/master/scripts/Upgrade-PowerShell.ps1"
$file = "$env:temp\Upgrade-PowerShell.ps1"
$username = "Administrator"
$password = "Password"
(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force
&$file -Version 5.1 -Username $username -Password $password -Verbose

此指令碼會檢查系統是否已安裝必要的程式(例如 .NET Framework 4.5.2)和所需的 PowerShell 版本(此範例為 5.1,有效值為 3.0、4.0 或 5.1)。它會使用指定的管理員帳戶執行,因此請根據您的環境設定 $username$password 變數。設定正確的認證後,若指令碼執行過程中需要重新啟動,它會自動重新啟動並登入,確保指令碼能繼續執行,直到 PowerShell 升級至目標版本。

安全性注意事項: 設定認證以啟用自動重新啟動時,這些認證會以純文字形式儲存在登入檔中。為避免安全風險,請務必在指令碼執行後清除這些認證。建議您在指令碼執行後執行以下 PowerShell 命令:

$reg_winlogon_path = "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Winlogon"
Set-ItemProperty -Path $reg_winlogon_path -Name AutoAdminLogon -Value 0
Remove-ItemProperty -Path $reg_winlogon_path -Name DefaultUserName -ErrorAction SilentlyContinue
Remove-ItemProperty -Path $reg_winlogon_path -Name DefaultPassword -ErrorAction SilentlyContinue

若未設定使用者名稱和密碼引數,指令碼會提示使用者手動重新啟動並登入。下次使用者登入時,指令碼會從中斷處繼續執行,直到主機符合 Ansible 自動化的要求。

指令碼執行完成後,請將執行策略設定回更安全的值。 對於 Windows 伺服器,請使用以下 PowerShell 命令:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force

在 Windows 使用者端(例如 Windows 10 或 Windows 11)上,請使用以下命令:

Set-ExecutionPolicy -ExecutionPolicy Restricted -Force

這些是上述作業系統的預設設定。 若需查詢目前的執行策略設定,可使用以下命令:

Get-ExecutionPolicy
  1. 設定 WinRM 服務: PowerShell 升級至 3.0 版或更高版本後,接著設定 WinRM 服務,讓 Ansible 可以連線。
  graph LR
A[檢查 PowerShell 版本] --> B{版本 >= 3.0?};
B -- 是 --> C[設定 WinRM];
B -- 否 --> D[執行升級指令碼];
D --> A;
C --> E[完成設定];

設定 WinRM 的詳細步驟以及 Ansible 與 Windows 主機的互動方式,將在下一篇文章中詳細介紹。

在這個部分,我們已經完成了 PowerShell 和 .NET Framework 的檢查與升級,並準備開始設定 WinRM 服務。設定 WinRM 的過程會涉及一些重要的安全考量和最佳實務,我們將在下一篇文章中探討這些細節,並提供逐步的設定,確保您的 Windows 主機能安全有效地與 Ansible 整合。

python3 --version

這個指令會顯示已安裝的 Python 版本。Ansible 2.15 需要 Python 3.8 或更高版本。

  1. 如果未安裝 Python,請使用系統的套件管理器安裝。例如,在 Debian/Ubuntu 系統上:
sudo apt update
sudo apt install python3

這段程式碼首先更新系統的套件列表,然後安裝 Python 3。

  1. 使用 pip 安裝 Ansible:
pip3 install ansible

這個指令會使用 pip3 安裝最新版本的 Ansible。

  1. (Optional) 建立虛擬環境 (建議):
python3 -m venv .venv
source .venv/bin/activate
pip install ansible

這段程式碼建立一個 Python 虛擬環境,並在虛擬環境中安裝 Ansible,確保 Ansible 的依賴項不會影響系統的整體環境。使用虛擬環境是最佳實務,可以避免套件衝突。

設定 Windows 受管主機

由於 Ansible 並非原生在 Windows 上執行,因此管理 Windows 主機需要額外的設定。Ansible 使用 WinRM(Windows 遠端管理)與 Windows 主機通訊。以下步驟說明如何設定 Windows 主機以供 Ansible 管理:

  1. 啟用 WinRM:
Enable-PSRemoting -Force

這個 PowerShell 指令強制啟用 WinRM 服務。

  1. 設定 WinRM 監聽器:
winrm quickconfig

這個指令會設定 WinRM 監聽器,允許遠端連線。

  1. 設定信任關係 (如果控制節點和受管節點不在同一個網域):
Set-Item WSMan:\localhost\Client\TrustedHosts -Value *

這個指令將所有主機新增至信任主機列表,簡化測試環境設定。注意:在生產環境中,請務必指定控制節點的 IP 地址或主機名稱,而不是使用 * 這能避免安全風險。

驗證 Ansible 安裝

安裝完成後,執行以下指令驗證 Ansible 版本:

ansible --version

這個指令會顯示 Ansible 的版本資訊,確認 Ansible 已成功安裝。

Ansible 架構

  graph LR
    subgraph 控制節點 (Linux/macOS/WSL)
        A[Ansible] --> B(Python)
    end
    B --> C(SSH/WinRM)
    subgraph 受管節點
        D{Linux}
        E{Windows}
    end
    C --> D
    C --> E

圖表說明: Ansible 在控制節點上執行,透過 SSH 連線到 Linux 受管主機,透過 WinRM 連線到 Windows 受管主機。

這篇文章詳細介紹了 Ansible 的安裝和設定步驟,涵蓋了 Linux、FreeBSD 和 Windows 系統。同時,也說明瞭如何驗證 Ansible 安裝以及 Ansible 的基本架構。透過這些步驟,您可以快速建立 Ansible 環境,開始您的自動化之旅。 下一篇文章將會探討 Ansible 的核心概念,例如 Inventory、Playbooks 和 Modules。

brew doctor

brew doctor 指令會檢查 Homebrew 的安裝環境,並找出潛在問題。它會顯示一些警告訊息,例如過時的套件、錯誤的連結等等。執行這個指令能幫助你維護 Homebrew 的健康狀態,並避免一些不必要的錯誤。我建議定期執行 brew doctor,尤其是在遇到 Homebrew 相關問題時。

  graph LR
    A[選擇作業系統] --> B{Linux}
    A --> C{macOS}
    B --> D[使用 venv 建立虛擬環境]
    D --> E[使用 pip 安裝 Ansible]
    C --> F[使用 Homebrew 安裝 Ansible]

這個流程圖簡潔地展示了在 Linux 和 macOS 系統上安裝 Ansible 的不同路徑。在 Linux 上,我建議使用 Python 虛擬環境搭配 pip 安裝,以獲得更好的版本控制和隔離性。而在 macOS 上,使用 Homebrew 則更為便捷。

我個人的經驗是,無論在 Linux 還是 macOS 上,使用虛擬環境都是 Ansible 開發的最佳實務。它能有效隔離不同專案的 Ansible 環境,避免版本衝突,讓你的自動化管理工作更加順暢。此外,善用 brew doctor 指令,能幫助你保持 Homebrew 的健康狀態,並及早發現潛在問題。

透過這篇文章,我希望分享我的 Ansible 安裝與環境設定經驗,幫助你快速搭建 Ansible 環境,並開始你的自動化之旅。從 Python 虛擬環境的應用到 GitHub 安裝方式,這些技巧都是我在實戰中積累的寶貴經驗,希望能對你有所幫助。