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

即使 Ansible 以 SSH 管理 Linux 节点而闻名,您知道在 Windows 上同样效果出色吗?通过 Windows 远程管理 (WinRM),Ansible 在 Windows 上同样能够有效地管理所有 Windows 节点!

在 Windows 上使用 Ansible,您可以执行诸如部署补丁、管理 Windows 服务器、执行 PowerShell 脚本等任务。

在本教程中,您将学习如何设置您的第一个 Windows 节点以由 Ansible 管理,并了解如何对其运行命令和 Playbooks。

先决条件

如果您想跟随本教程操作,请确保在开始前具备以下条件:

  • 一个 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 Remoting 在 PowerShell 內運行遠程命令時使用的相同協議。

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

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

儘管 Red Hat 提供的配置 WinRM 的 PowerShell 腳本 已經過測試且安全,但您應該通過閱讀並理解其正在執行的高層次操作。

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

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

在Windows節點上執行配置腳本,Ansible將使用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

配置Ansible在Windows上的控制器

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

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

2. 安裝pywinrm Python模塊。對於Ansible在Windows上通過WinRM協議與主機通信,需要pywinrm Python模塊。

pip install pywinrm

3. 在Ansible清單檔案中定義遠端的Windows節點。 Ansible清單是在檔案中定義的遠端主機集合,可以使用主機名稱或IP位址來定義。 一旦定義,您就可以使用指令和Playbooks針對Ansible清單執行操作,很快您就會看到。

預設的Ansible清單檔案位於/ etc / ansible / hosts目錄中。

下面的示例清單檔案創建了一個windows 主機組,其中包含每個Windows節點。本教程在這裡使用主機組,以便稍後更輕鬆地一次性定位所有Windows節點(如果您有多個)。

[windows]
 54.242.251.213
 10.111.4.106

4. 接下來,在清單檔案中定義一些必要的變數,這些變數將作為windows:vars組在連接到Windows主機時由Ansible使用。

[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 功能來演示臨時命令。為此,假設您仍然連接到 Ansible 控制器節點:

1. 這次不使用 win_ping 模組,改用 win_feature 模組-m),傳遞兩個參數(-a),分別是 namestate,指定 Windows 功能的名稱和您想要的狀態。

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

執行以上命令後,如果一切順利,Ansible 應該會連接到 windows 主機組中的所有節點,並在每個節點上執行 win_feature 命令,檢查並安裝 Telnet-Client Windows 功能(如果不存在的話)。

Ansible Windows Feature

2. Ansible 顯示成功,但為了確保,請手動使用 PowerShell 連接到 Windows 節點,並驗證是否已安裝了 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 模組 作為即時命令!

在 Windows 上建立和執行 Ansible Playbooks

一旦您掌握了在Windows管理节点上运行临时命令的技巧,下一个任务是创建和运行playbook。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 playbook是用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 控制器主機並再次打開您喜歡的文本編輯器。這次,創建並保存另一個 playbook,名為 ansible-windows-shell.yml,保存在相同的 ~/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 的 Ansible?

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