Ansible & Windows 10 家用版

如何用 Ansible 操控 Windows 10 家用版

這個藍色真是深得朕心

上次用 Windows OS 應該是我大學時代的事了吧(煙

近期因為工作需求又再一次接觸到,原以為很快就搞定,結果還是有些小檻要跨,在此紀錄一下方便之後有需求的人也可以查找。

注意事項
  • 本篇僅供測試用,如果要上 Production 該加的憑證還是要加。
  • 本篇在 Windows Server 上的操作全部都是以管理員方式執行 PowerShell

另外我也有寫一些簡單的範例可以在這個 Repo上找到,有時間就會更新。

測試規格列表

Bastion Node: Red Hat Enterprise Linux 8
Ansible version on Bastion Node: 2.9.6
Python version on Bastion Node: 3.6.8

Windows Server: Microsoft Windows 10 (64-bit)

測試步驟
  1. 防火牆先打開,不然 ping 不到

  2. Openssh Server 要裝,不然沒辦法透過 ssh 連線,Ansible 執行腳本的方式不是透過 agent,而是透過 SSH 連線

    UI 法: 在搜尋欄裡面找 `程式` > 新增選用功能 Command Line 法:請參考[這篇](https://docs.microsoft.com/zh-tw/windows-server/administration/openssh/openssh_install_firstuse)
  3. 裝完 Openssh 除了重新啟動之外該更新的還要更新,我當初還納悶為什麼重新開機之後 openssh 仍舊不在 service 列表裡面…

  4. 測試 Bastion 機是否可以連線到 Windows 機器,如果發現 SSH permission denied(Public Key),請 copy 一下 ssh key:

1
ssh-copy-id ${Windows's Username}@${Windows Server IP}
  1. 開通 TCP Port 5985 / firewall rule,相關設定參照 netsh-advfirewall-firewall-control-firewall-behavior
1
netsh advfirewall firewall add rule name="WinRM-HTTP" dir=in localport=5985 protocol=TCP action=allow
  1. Windows Server 開啟 Administrator 功能,這樣遠端連進去時就可以用 Admin 帳號執行 PowerShell,但這邊主要是測試方便使用而已

註. 不知道為啥 Windows 10 家用版拿掉了用 UI 啟動 Administrator 這個功能,可能是怕屁孩如我輩手賤改掉密碼,這邊提供不限於家用版的指令

1
2
3
4
# 啟動管理員帳號
net user administrator /active:yes
# 關閉管理員帳號
net user administrator /active:no

開啟後記得去設定管理員密碼

1
net user administrator ${你設定的管理員密碼}
  1. 將 PowerShell 執行原則設為 RemoteSigned,遠端下載的腳本要有受信任的簽章才可執行,原則詳列於 about_execution_policies
1
set-executionpolicy remotesigned

改完之後查看一下 PowerShell 的執行策略

1
get-executionpolicy
  1. 在 Windows Server 上配置 winrm,開啟 winrm listener,Windows Host 需要安裝的套件及設定詳列於此
1
2
3
4
5
6
7
8
9
10
# 配置 winrm service 並且啟動服務
winrm quickconfig

# 修改 winrm configuration 檔案,設定遠端連接認證,如果用 Windows cmd 的話,@前面的' 和 末尾的' 要去掉

winrm set winrm/config/service/auth '@{Basic="true"}'
winrm set winrm/config/service '@{AllowUnencrypted="true"}'

# 查看 winrm listener 啟動狀態
winrm enumerate winrm/config/listener

成功啟動:
upload successful

註1: 在這邊有些人在設定時可能會遇到以下這個問題

請修改網路設定,把現在的網路設定從公用網路變成私人網路

註2: 有些人會卡在這個問題,原因可以參照此篇,這也就是為什麼我們要設定AllowUnencrypted="true"

upload successful

但是在正式環境的話,還是要[把 credentials 加密]([Ansible] Windows 連線設定 (basic、certificate authentication)

  1. 在 Ansible 腳本執行機器上上安裝 pywinrm 套件

    1
    pip3 install winrm
  2. 寫個 inventory file 註記 windows server IP 還有連線資訊,如果要測試也可以直接在 hosts 裡面加入群組

1
2
[windows]
${windows server IP} ansible_ssh_user="Administrator" ansible_ssh_pass="${Administrator Password}" ansible_ssh_port=5985 ansible_connection="winrm"
  1. 用 win_ping 模組測試執行結果

Windows Update with Ansible

對如何用 Ansible 更新 Windows KB 可參考此篇


Reference