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

即使 Ansible 以使用 SSH 管理 Linux 节点而闻名,您是否知道 Ansible 在 Windows 上同样表现出色?使用 Windows 远程管理(WinRM),Ansible 在 Windows 上也能有效地管理您的所有 Windows 节点!

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

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

先决条件

如果您想跟着本教程学习,请确保在开始之前具备以下条件:

  • An Ansible 控制器主机 – 本教程将使用 Ansible v2.9.18,在具有 IP 地址为 10.111.4.53 的 Ubuntu 18.04.5 LTS 机器上进行。请注意,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 Remoting。

截至撰写本文时,Ansible 确实 支持 SSH 作为管理协议,但目前仍然是一个实验性功能。

为了让 Ansible 使用 WinRM 与 Windows 节点通信,您必须配置 WinRM。为此,Ansible 提供了 一个 PowerShell 脚本 来设置各种 WinRM 选项。

尽管红帽提供的用于配置 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

配置Windows上的Ansible控制器

现在Windows节点已经准备好供Ansible使用,让我们现在配置Ansible控制器以向Ansible展示如何与其通信。

1. 使用您喜欢的SSH客户端通过SSH连接到您的Ansible控制器主机。

2. 安装pywinrm Python模块。pywinrm Python模块是Windows上的Ansible通信到主机需要使用WinRM协议的必备模块。

pip install pywinrm

Ansible清单文件中定义远程Windows节点。Ansible清单是一个通过主机名或IP地址在文件中定义的远程主机集合。一旦定义,您就可以使用命令和playbook来针对Ansible清单进行操作,就像您很快就会看到的那样。

默认的Ansible清单文件位于/etc/ansible/hosts目录中。

下面的示例清单文件创建了一个名为windows主机组,其中包含每个Windows节点。本教程在这里使用主机组是为了稍后更容易地一次性定位所有Windows节点(如果您有多个)。

[windows]
 54.242.251.213
 10.111.4.106

接下来,在清单文件中定义一些连接到Windows主机时Ansible将使用的必需变量作为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 功能来演示即时命令。为此,假设你仍然通过 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 Windows 功能(如果尚未安装)。

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 控制器主机并再次打开您喜欢的文本编辑器。这次,创建并保存另一个 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,该playbook在远程主机上执行,但使用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!

您将使用哪些playbooks和Windows模块来管理Windows?

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