在 Windows 上精通 Ansible:您的专家指南

即使Ansible以使用SSH管理Linux節點而聞名,你知道Ansible在Windows上同樣運作良好嗎?使用Windows遠端管理(WinRM),Ansible在Windows上也能有效地管理你所有的Windows節點!

使用Ansible在Windows上,你可以執行諸如部署補丁、管理Windows伺服器、執行PowerShell腳本等任務。

在本教程中,你將學習如何設置你的第一個Windows節點以被Ansible管理,並看到如何對其運行命令和劇本。

先決條件

如果你想跟隨本教程,請確保在開始前具備以下條件:

  • 一個Ansible控制主機 – 本教程將使用Ansible v2.9.18在一台Ubuntu 18.04.5 LTS機器上,其IP地址為10.111.4.53。注意,Windows不支持作為控制節點,只支持作為被管理節點。
  • 在你的Ansible控制主機上安裝了Python – 本教程將使用Python v2,但v3應該也同樣適用。
  • 在Ansible控制器上安裝了pip包
  • A Windows 2012 R2 or greater computer for Ansible to manage – This tutorial will use two Windows Server 2012 R2 Standard machines as remote nodes with IP addresses of 52.242.251.213 and 10.111.4.106.
  • A Windows workstation – This tutorial will perform some basic pre-configuration to the node that Windows will manage with Ansible and will require you to sitting at a Windows workstation.
  • 要管理的Windows伺服器已經啟用了PowerShell遠程
  • A user account in the local Administrators group on the Windows computer. This tutorial will use an account called adminuser.

在Windows上設置WinRM監聽器

在 Ansible 能夠與遠端 Windows 節點通訊之前,它必須能夠與其建立連線。它通過 Microsoft 協議 WinRM 來實現這一點。WinRM 是同樣的協議,PowerShell 遠端 在 PowerShell 內部運行遠程命令時使用的協議。

截至目前為止,Ansible 確實 支援 SSH 作為管理協議,但這是一項實驗性功能。

為了讓 Ansible 使用 WinRM 與 Windows 節點通訊,您必須配置 WinRM。為此,Ansible 提供了 一個 PowerShell 腳本,該腳本設置了各種 WinRm 選項。

雖然 Red Hat 提供的用於配置 WinRM 的 PowerShell 腳本 已經過測試並且安全,但您應該閱讀並理解其大致作用。

您的第一個任務將是下載配置腳本並在 Windows 節點上運行 Ansible。為此,假設您已經在目標 Windows 電腦上啟用了 PowerShell 遠端 且您正在 Windows 工作站上:

ConfigureRemotingForAnsible.ps1 PowerShell 腳本 下載到您的本地 Windows 電腦。本教程將假設它已保存在 〜\Downloads

在將 Ansible 管理的 Windows 節點上運行配置腳本,使用 Invoke-Command 命令。以下命令將在教程的兩個演示機器上運行該命令,並提示您輸入 Windows 節點上本地 adminuser 帳戶的密碼。

Invoke-Command -ComputerName 52.242.251.213, 10.111.4.106 -FilePath '~\Downloads\ConfigureRemotingForAnsible.ps1' -Credential (Get-Credential -UserName adminuser)

默認情況下,配置腳本將為基本的 HTTP 身份驗證配置 WinRM。如果您希望 Ansible 使用更安全的連接,請查看 如何為 Ansible 配置 WinRM over HTTPS

在 Windows 上配置 Ansible 控制器

現在 Windows 節點已準備好供 Ansible 使用,讓我們現在配置 Ansible 控制器,告訴 Ansible 如何與其通信。

1. 使用您喜歡的 SSH 客戶端通過 SSH 連接到您的 Ansible 控制器主機。

2. 安裝 pywinrm Python 模塊。pywinrm Python 模塊是 Ansible 在 Windows 上通過 WinRM 協議與主機通信所需的。

pip install pywinrm

Ansible清單文件中定義遠程Windows節點。 Ansible清單是一個由文件中的主機名稱或IP地址定義的遠程主機集合。 一旦定義,您就可以使用命令和播放書來針對Ansible清單進行操作,您很快就會看到。

默認的Ansible清單文件位於/etc/ansible/hosts目錄中。

下面的示例清單文件創建了一個windows 主機組,其中包含每個Windows節點。 教程在這裡使用主機組是為了以後更容易一次性定位所有Windows節點(如果您有多個)。

[windows]
 54.242.251.213
 10.111.4.106

4. 接下來,在清單文件中定義幾個Ansible在連接到Windows主機時將使用的必需變量,作為windows:vars組。

[windows:vars]
 ansible_user=localadmin ## Ansible用於通信的Windows用戶名
 ansible_password=s3crect ## Ansible用於通信的Windows密碼
 ansible_connection=winrm ## Ansible將與遠程Windows節點建立的連接類型
 ansible_winrm_server_cert_validation=ignore ## 忽略證書驗證,因為我們將僅使用Ansible附帶的自簽名證書

5. 現在,使用 Ansible 的 win_ping 模組來執行一個簡單的連線測試,針對步驟#3 中定義的 windows 主機組內的主機。

# windows 是主機組
# -m 告訴 Ansible 使用 win_ping 模組
 ansible windows -m win_ping

執行後,您可以看到以下 Ansible 返回綠色文字,並顯示成功訊息,表示 ping 嘗試成功。

Successful win_ping connection

輸出確認 Ansible 控制器主機能夠通過 WinRM 成功與 Windows 遠程主機通信。

在 Windows 主機上執行即時命令

此時,您已經準備好讓 Ansible 開始控制您的 Windows 節點。現在讓我們通過在 Windows 節點上運行即時命令來測試一下。當您需要在未首先創建 playbook 的節點上運行簡單命令時,即時命令非常有用。

讓我們通過在庫存檔案中定義的 windows 主機組中的 Windows 節點上安裝 Windows 功能來演示即時命令。為此,假設您仍然 SSH 到您的 Ansible 控制器節點:

1. 這次不使用 win_ping 模組,而是呼叫 win_feature 模組-m),並傳遞兩個參數(-a),分別表示 Windows 功能的名稱和您希望它處於的狀態。

# 這裡的 windows 是一組主機
# win_feature 是模組的名稱
# state=present 表示安裝該套件或服務
 ansible windows -m win_feature -a "name=Telnet-Client state=present"

執行上述命令後,如果一切順利,Ansible 應該會連接到 windows 主機組中的所有節點,並在每個節點上運行 win_feature 命令,檢查是否存在 Telnet-Client,如果不存在,則安裝。

Ansible Windows Feature

2. Ansible 顯示成功,但為確保,請手動連接到 Windows 節點,使用 PowerShell 驗證 Telnet Client Windows 功能是否已安裝。在本地 Windows 工作站上,運行 Invoke-Command 以在每台 Windows 電腦上運行 Get-WindowsFeature PowerShell 命令。

Invoke-Command -ComputerName 52.242.251.213, 10.111.4.106 -ScriptBlock { Get-WindowsFeature -Name 'Telnet-Service' } -Credential (Get-Credential -UserName adminuser)

此時,您可以運行任何您喜歡的 Windows 模組作為即席命令!

創建並運行 Ansible 在 Windows 上的 Playbooks

一旦您掌握了在Windows管理節點上運行即席命令的技巧,您的下一個任務就是創建並運行playbooks。 Ansible playbook將命令組合到一個地方,並允許您編寫複雜的邏輯以執行複雜的自動化場景。

使用win_command模塊運行遠程Windows命令

假設您仍然連接到您的Ansible控制器主機:

1. 在您的家目錄下創建一個名為ansible-windows-demo的文件夾,並切換到該文件夾。此文件夾將保存您的playbook。

mkdir ~/ansible-windows-demo 
cd ~/ansible-windows-demo 

2. 打開您喜歡的文本編輯器,並創建並保存一個名為ansible-windows.yml的文件到 ~/ansible-windows-demo 目錄下。

Ansible playbooks是用YAML編寫的。

3. 現在,將下面的playbook複製到ansible-windows.yml文件中以創建一個單獨的任務。此playbook將使用win_command Windows Ansible模塊windows主機組中的所有主機上執行netstat Windows命令。

win_command 模块在 Windows 远程主机上执行命令。它不允许包含变量的命令,例如特殊字符、换行符、大于符号等。

---
 - name: Ansible win_command module example  
   hosts: windows # 要在其中运行模块的主机组
   tasks: 
   -  name: run an executable command on a remote Windows system
      win_command: netstat -e # win_command 是一个 Windows 模块。

4. 调用 ansible-windows.yml playbook,通过运行以下命令在远程主机上执行任务。

ansible-playbook ansible-windows.yml

如果一切顺利,您应该看到如下输出。

Ansible successfully executed the netstat command using win_command module

使用 win_shell 模块运行远程 PowerShell 命令

您已经创建了一个 playbook,以在上一个示例中管理的 Windows 节点上运行远程 cmd.exe 命令 (netstat)。现在让我们再提高一点难度,使用 win_shell 模块来运行 PowerShell 命令。

默认情况下,win_shell 模块在 Windows 主机上运行 PowerShell。

在您的本地 Windows 工作站上:

1. 首先,在您的本地 Windows 工作站上打开您喜欢的文本编辑器,创建一个示例 PowerShell 脚本,并将以下代码复制到其中,保存为 one.ps1。本教程将把脚本保存到 ~\one.ps1

以下代码在 C:\temp 目录中创建一个名为 test2.txt 的空文本文件。

Set-Content -Path C:\temp\test2.txt -Value ''

2. 使用您首选的方法将 one.ps1 PowerShell 脚本复制到您的 Windows 管理节点。本教程将假定您已将 one.ps1 脚本复制到每个 Windows 节点上的 C:\Temp 文件夹中。

3. 一旦示例 PowerShell 脚本位于 Windows 节点上,连接到您的 Ansible 控制器主机,并再次打开您喜欢的文本编辑器。这次,创建并保存另一个名为 ansible-windows-shell.yml 的 playbook,保存在相同的 ~/ansible-windows-demo 目录中。

4. 将以下 playbook 复制并粘贴到 ansible-windows-shell.yml 文件中。此 playbook 将运行两个任务来演示 win_shell 模块。它调用从第 2 步刚刚复制的 PowerShell 脚本,并直接将 PowerShell 代码插入 playbook 中,以演示根本不需要脚本。

要将多行 PowerShell 代码传递给 win_shell 模块,请使用 | 管道字符。

---
 - name: Ansible win_shell module example 
   remote_user: localadmin # 本地 Windows 用户用于连接
   hosts: windows # 远程主机组
   tasks:
    - name: Single line PowerShell # 使用 win_shell 模块运行单个命令
      win_shell: C:\temp\one.ps1
    - name: Run multi-lined shell commands 
      win_shell: |
        $text = ' Iam Author of ATA'
       Set-Content -Path C:\temp\test3.txt -Value $text 

5. 现在,调用第二个 playbook ansible-windows-shell.yml,它在远程主机上执行,但使用 PowerShell。

ansible-playbook ansible-windows-shell.yml
ansible-playbook ansible-windows-shell.yml

6. 如有必要,在您的本地 Windows 工作站上验证 playbook 是否执行了现有脚本以及 playbook 中的 PowerShell 代码。

Invoke-Command -ComputerName 52.242.251.213, 10.111.4.106 -ScriptBlock { Test-Path -Path 'C:\Temp\test3.txt','C:\Temp\test2.txt' } -Credential (Get-Credential -UserName adminuser)

如果 Ansible playbook 运行成功,PowerShell 应返回两个 True 语句,指示文件现在已存在。

结论

在本教程中,您已经学会了如何在 Ansible 中设置第一个 Windows 受控节点。尽管 Ansible 传统上被视为 Linux 工具,但它也可以轻松用于 Windows!

您将开始使用哪些 playbook 和 Windows 模块来管理 Windows ?

Source:
https://adamtheautomator.com/ansible-windows/