連接及管理 Windows 主機 | Ansible WinRM



簡介

最近有使用 Ansible 管理 Windows 主機的需求,所以來研究一下了 😁。在本文中,將會說明如何為 Windows 進行前置設定作業,例如,開啟 WinRM (Windows Remote Management) 機制,以便屆時 Ansible 主機能夠順利連接及管理 Windows 主機。
如果,你有點開去看剛才的 WinRM (Windows Remote Management) 機制內容,應該一時之間很難懂吧? 在 Ansible Document 中,有關 WinRM 認證機制的說明整理個簡單易懂的表格,相信可以幫助你更快入門。






安裝 Windows 測試主機

在本文實作環境中,為了快速搭建測試環境,直接在 Azure 公有雲環境中建立相關測試主機,分別是擔任 Ansible 主機的 AlmaLinux 9.2,以及 Windows 測試主機 Windows 10、Windows 11、Windows Server 2019、Windows Server 2022、Windows Server 2022 Azure Edition







Windows 主機啟用 WinRM 遠端管理機制

為了能夠更方便且快速啟用 WinRM (Windows Remote Management) 遠端管理機制,Ansible 有提供 ConfigureRemotingForAnsible.ps1 檔案。透過這個 PowerShell 檔案,便能夠快速且正確的為 Windows 主機啟用 WinRM (Windows Remote Management) 遠端管理機制,並且屆時 Ansible 主機也能夠順利連接及管理。

由於操作步驟是一樣的,以下便以其中一台 Windows 測試主機為例。首先,請確保採用 Administrator 管理帳號開啟 PowerShell 視窗後,執行 ConfigureRemotingForAnsible.ps1 檔案,簡單來說執行後會幫 Windows 主機建立 HTTPS Listener 和自簽憑證……等動作。順利啟用之後,可以透過「netstat -na | findstr ":5985 :5986"」指令,確認主機是否已經啟用 WinRM HTTP (Port 5985) 和 WinRM HTTPS (Port 5986)。此外,也會幫 Windows 主機建立網路卡防火牆規則,允許 WinRM HTTPS (Port 5986) 能夠通過。






Ansible 主機運作環境

在本文實作環境中,採用 AlmaLinux 9.2 擔任 Ansible 主機,可以看到採用的 Python3、PIP3、Ansible 版本,並且已經安裝好需要的 pywinrm 模組


在連接 Windows 主機之前,先在 Ansible 主機端透過簡單的 for 迴圈搭配 nc 指令,確認 Ansible 跟 Windows 主機之間,WinRM HTTPS (Port 5986) 是連通的。


由於,之前踩過 Ansible 採用 dnf 和 pip 二種安裝方式的雷 😅,所以在執行連接 Windows 主機的動作之前,先確認 Ansible 能夠正確執行並使用 pywinrm 模組。執行「ansible -m python_requirements_info -a dependencies=winrm localhost」指令即可判斷,目前運作環境 Ansible 能否順利使用  pywinrm 模組






Ansible 連接及管理 Windows 主機

Ansible 主機準備就緒後,先編輯 hosts 檔案,把要測試連接的 5 台 Windows 主機 IP 鍵入,然後加上連接參數:
  • ansible_user=weithenn,指定連線 Windows 主機的使用者帳號。
  • ansible_password=password,指定連線 Windows 主機的使用者密碼。
  • ansible_connection=winrm,指定連線方式採用 winrm。
  • ansible_winrm_server_cert_validation=ignore,忽略連線時憑證警告訊息。

編寫完成後,即可執行「ansible win -i hosts -m win_ping」進行連接 Windows 主機的測試作業。


倘若,你想要確認 Ansible 主機,是否真的和 Windows 主機之間採用 WinRM HTTPS (Port 5986) 進行通訊,你可以再次使用 nc 指令,但是參數僅使用 -v 即可,例如,「nc -v 10.0.0.5 5986」即可,然後 Windows 主機預設情況下,網卡防火牆的 Public profile 是不允許 WinRM HTTP (Port 5985) 通行的。


確認 Ansible 主機可以透過 win_ping 連接 Windows 主機後,可以試試 win_command 模組的功能,讓 Ansible 主機連線 Windows 主機後執行 hostname 指令,例如,ansible win -i hosts -m win_command -a "hostname"


也可以試試 win_shell 模組的功能,讓 Ansible 主機連線 Windows 主機後執行 hostname 指令,例如,ansible win -i hosts -m win_shell -a "Get-Date"