Ansible 客户端需求–设置Windows主机

2021-09-13 14:37:19 浏览数 (1)

本文翻译转自[https://docs.ansible.com/ansible/latest/userguide/windowssetup.html]

1.主机要求

为了使Ansible与Windows主机通信并使用Windows模块,Windows主机必须满足以下要求:

  • Ansible通常可以在Microsoft的当前和扩展支持下管理Windows版本。Ansible可以管理包括Windows 7、8.1和10的桌面操作系统以及包括Windows Server 2008、2008 R2、2012、2012 R2、2016和2019的服务器操作系统。
  • Ansible要求在Windows主机上安装PowerShell 3.0或更高版本,并且至少要安装.NET 4.0。
  • 应创建并激活WinRM侦听器。可以在下面找到更多详细信息。

注意

这些是Ansible连接的基本要求,但某些Ansible模块具有其他要求,例如较新的OS或PowerShell版本。请查阅模块的文档页面以确定主机是否满足那些要求。

升级PowerShell和.NET Framework

Ansible要求PowerShell版本3.0和.NET Framework 4.0或更高版本才能在较早的操作系统(例如Server 2008和Windows 7)上运行。基本映像不满足此要求。您可以使用Upgrade-PowerShell.ps1脚本来更新它们。

这是如何从PowerShell运行此脚本的示例:

  1. $url = "https://raw.githubusercontent.com/jborean93/ansible-windows/master/scripts/Upgrade-PowerShell.ps1"
  2. $file = "$env:tempUpgrade-PowerShell.ps1"
  3. $username = "Administrator"
  4. $password = "Password"
  5. (New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)  
  6. Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force  
  7. # Version can be 3.0, 4.0 or 5.1
  8. &$file -Version 5.1 -Username $username -Password $password -Verbose  

完成后,您将需要删除自动登录并将执行策略重新设置为默认值Restricted。您可以使用以下PowerShell命令执行此操作:

  1. # This isn't needed but is a good security practice to complete
  2. Set-ExecutionPolicy -ExecutionPolicy Restricted -Force  
  3. $reg_winlogon_path = "HKLM:SoftwareMicrosoftWindows NTCurrentVersionWinlogon"
  4. Set-ItemProperty -Path $reg_winlogon_path -Name AutoAdminLogon -Value 0  
  5. Remove-ItemProperty -Path $reg_winlogon_path -Name DefaultUserName -ErrorAction SilentlyContinue  
  6. Remove-ItemProperty -Path $reg_winlogon_path -Name DefaultPassword -ErrorAction SilentlyContinue  

该脚本通过检查是否需要安装哪些程序(例如.NET Framework 4.5.2)以及所需的PowerShell版本来进行工作。如果需要重新启动username并且password已设置和参数,则脚本将从重新启动后自动重新启动并登录。该脚本将继续执行,直到不需要其他操作并且PowerShell版本与目标版本匹配为止。如果未设置username和 password参数,脚本将提示用户手动重新启动并在需要时登录。下次登录用户时,脚本将从上次停止的地方继续,然后继续该过程,直到不需要其他操作为止。

注意

如果在Server 2008上运行,则必须安装SP2。如果在Server 2008 R2或Windows 7上运行,则必须安装SP1。

注意

Windows Server 2008只能安装PowerShell 3.0;Windows Server 2008只能安装PowerShell 3.0。指定较新的版本将导致脚本失败。

注意

在 username和 password参数都存储在注册表中的纯文本。确保脚本完成后运行清除命令,以确保主机上仍没有存储凭据。

WinRM内存修补程序

在PowerShell v3.0上运行时,WinRM服务存在一个错误,该错误会限制WinRM可用的内存量。没有安装此修补程序,Ansible将无法在Windows主机上执行某些命令。这些修补程序应作为系统引导或映像过程的一部分进行安装。脚本Install-WMF3Hotfix.ps1可用于在受影响的主机上安装此修补程序。

以下PowerShell命令将安装此修复程序:

  1. $url = "https://raw.githubusercontent.com/jborean93/ansible-windows/master/scripts/Install-WMF3Hotfix.ps1"
  2. $file = "$env:tempInstall-WMF3Hotfix.ps1"
  3. (New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)  
  4. powershell.exe -ExecutionPolicy ByPass -File $file -Verbose  

有关更多详细信息,请参阅Microsoft的修补程序文档。

2.WinRM安装程序

一旦将Powershell升级到至少3.0版,最后一步就是配置WinRM服务,以便Ansible可以连接到它。WinRM服务的两个主要组件决定着Ansible与Windows主机的接口方式:listener和和service配置设置。

可以在下面阅读有关每个组件的详细信息,但是 可以使用脚本 ConfigureRemotingForAnsible.ps1来设置基础。该脚本使用自签名证书设置HTTP和HTTPS侦听器,并Basic 在服务上启用身份验证选项。

要使用此脚本,请在PowerShell中运行以下命令:

  1. $url = "https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1"
  2. $file = "$env:tempConfigureRemotingForAnsible.ps1"
  3. (New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)  
  4. powershell.exe -ExecutionPolicy ByPass -File $file  

可以在此脚本旁边设置不同的开关和参数(如-EnableCredSSP和 -ForceNewSSLCert)。这些选项的文档位于脚本本身的顶部。

注意

ConfigureRemotingForAnsible.ps1脚本仅用于培训和开发目的,不应在生产环境中使用,因为它可以启用Basic本质上不安全的设置(如身份验证)。

WinRM侦听器

WinRM服务在一个或多个端口上侦听请求。这些端口中的每个端口都必须创建和配置一个侦听器。

要查看WinRM服务上正在运行的当前侦听器,请运行以下命令:

  1. winrm enumerate winrm/config/Listener  

这将输出类似:

  1. Listener  
  2.     Address = *  
  3.     Transport = HTTP  
  4.     Port = 5985  
  5.     Hostname  
  6.     Enabled = true
  7.     URLPrefix = wsman  
  8.     CertificateThumbprint  
  9.     ListeningOn = 10.0.2.15, 127.0.0.1, 192.168.56.155, ::1, fe80::5efe:10.0.2.15%6, fe80::5efe:192.168.56.155%8, fe80::  
  10. ffff:ffff:fffe%2, fe80::203d:7d97:c2ed:ec78%3, fe80::e8ea:d765:2c69:7756%7  
  11. Listener  
  12.     Address = *  
  13.     Transport = HTTPS  
  14.     Port = 5986  
  15.     Hostname = SERVER2016  
  16.     Enabled = true
  17.     URLPrefix = wsman  
  18.     CertificateThumbprint = E6CDAA82EEAF2ECE8546E05DB7F3E01AA47D76CE  
  19.     ListeningOn = 10.0.2.15, 127.0.0.1, 192.168.56.155, ::1, fe80::5efe:10.0.2.15%6, fe80::5efe:192.168.56.155%8, fe80::  
  20. ffff:ffff:fffe%2, fe80::203d:7d97:c2ed:ec78%3, fe80::e8ea:d765:2c69:7756%7  

在上面的示例中,激活了两个侦听器。一种是通过HTTP监听端口5985,另一种是通过HTTPS监听端口5986。一些有用的关键选项是:

  • Transport:无论侦听器是通过HTTP还是HTTPS运行,建议对HTTPS使用侦听器,因为数据已加密,无需进行任何进一步更改。
  • Port:监听器运行的端口,默认情况下是5985用于HTTP和5986HTTPS的端口。该端口可以更改为所需的任何端口,并与主机var对应ansible_port。
  • URLPrefix:要监听的URL前缀,默认为wsman。如果更改此ansiblewinrmpath设置,则必须将主机var设置为相同的值。
  • CertificateThumbprint注意:如果运行在HTTPS侦听器上,这是连接中使用的Windows证书存储中证书的指纹。要获取证书本身的详细信息,请在PowerShell中使用相关的证书指纹运行以下命令:
  1. $thumbprint = "E6CDAA82EEAF2ECE8546E05DB7F3E01AA47D76CE"
  2. Get-ChildItem -Path cert:LocalMachineMy -Recurse | Where-Object { $_.Thumbprint -eq $thumbprint } | Select-Object *  

设置WinRM侦听器

设置WinRM侦听器的方法有以下三种:

  • 使用了HTTP或 HTTPS的。在域环境之外运行并且需要一个简单的侦听器时,这是最容易使用的选项。与其他选项不同,此过程还具有为所需的端口打开防火墙并启动WinRM服务的额外好处。winrm quickconfig``winrm quickconfig -transport:https
  • 使用组策略对象。当主机是域的成员时,这是创建侦听器的最佳方法,因为配置是自动完成的,无需任何用户输入。有关组策略对象的更多信息,请参阅 组策略对象文档。
  • 使用PowerShell创建具有特定配置的侦听器。这可以通过运行以下PowerShell命令来完成:
  1. $selector_set = @{  
  2.     Address = "*"
  3.     Transport = "HTTPS"
  4. }  
  5. $value_set = @{  
  6.     CertificateThumbprint = "E6CDAA82EEAF2ECE8546E05DB7F3E01AA47D76CE"
  7. }  
  8. New-WSManInstance -ResourceURI "winrm/config/Listener" -SelectorSet $selector_set -ValueSet $value_set  
  • 要查看此PowerShell cmdlet的其他选项,请参阅 New-WSManInstance。

注意

创建HTTPS侦听器时,需要创建一个现有证书并将其存储在LocalMachineMy证书存储中。如果此存储中没有证书,则大多数命令将失败。

删除WinRM侦听器

删除WinRM侦听器:

  1. # Remove all listeners
  2. Remove-Item -Path WSMan:localhostListener* -Recurse -Force  
  3. # Only remove listeners that are run over HTTPS
  4. Get-ChildItem -Path WSMan:localhostListener | Where-Object { $_.Keys -contains "Transport=HTTPS" } | Remove-Item -Recurse -Force  

注意

该Keys对象是字符串数组,因此它可以包含不同的值。默认情况下,它包含一个密钥,Transport=并且Address= 与winrm枚举winrm / config / Listeners中的值相对应。

WinRM服务选项

可以设置许多选项来控制WinRM服务组件的行为,包括身份验证选项和内存设置。

要获取当前服务配置选项的输出,请运行以下命令:

  1. winrm get winrm/config/Service  
  2. winrm get winrm/config/Winrs  

这将输出类似:

  1. Service  
  2.     RootSDDL = O:NSG:BAD:P(A;;GA;;;BA)(A;;GR;;;IU)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)  
  3.     MaxConcurrentOperations = 4294967295  
  4.     MaxConcurrentOperationsPerUser = 1500  
  5.     EnumerationTimeoutms = 240000  
  6.     MaxConnections = 300  
  7.     MaxPacketRetrievalTimeSeconds = 120  
  8.     AllowUnencrypted = false
  9.     Auth  
  10.         Basic = true
  11.         Kerberos = true
  12.         Negotiate = true
  13.         Certificate = true
  14.         CredSSP = true
  15.         CbtHardeningLevel = Relaxed  
  16.     DefaultPorts  
  17.         HTTP = 5985  
  18.         HTTPS = 5986  
  19.     IPv4Filter = *  
  20.     IPv6Filter = *  
  21.     EnableCompatibilityHttpListener = false
  22.     EnableCompatibilityHttpsListener = false
  23.     CertificateThumbprint  
  24.     AllowRemoteAccess = true
  25. Winrs  
  26.     AllowRemoteShellAccess = true
  27.     IdleTimeout = 7200000  
  28.     MaxConcurrentUsers = 2147483647  
  29.     MaxShellRunTime = 2147483647  
  30.     MaxProcessesPerShell = 2147483647  
  31.     MaxMemoryPerShellMB = 2147483647  
  32.     MaxShellsPerUser = 2147483647  

尽管这些选项中的许多选项应该很少更改,但是其中一些选项很容易影响WinRM上的操作,并且有助于理解。一些重要的选择是:

  • ServiceAllowUnencrypted:此选项定义WinRM是否允许通过HTTP运行的通信而没有消息加密。当消息级加密是唯一可能的ansiblewinrmtransport是ntlm, kerberos或credssp。默认情况下,这是false并且仅应true在调试WinRM消息时设置为。
  • ServiceAuth*:这些标志定义WinRM服务允许哪些身份验证选项。默认情况下, 并且启用。Negotiate (NTLM)``Kerberos
  • ServiceAuthCbtHardeningLevel:指定通道绑定令牌是未验证(无),已验证但不是必需的(已放松)还是已验证且必需的(严格)。仅当通过HTTPS与NTLM或Kerberos连接时,才使用CBT。
  • ServiceCertificateThumbprint:这是用于加密与CredSSP身份验证一起使用的TLS通道的证书的指纹。默认情况下为空;WinRM服务启动时会生成一个自签名证书,并在TLS进程中使用该证书。
  • WinrsMaxShellRunTime:这是允许远程命令执行的最长时间(以毫秒为单位)。
  • WinrsMaxMemoryPerShellMB:这是每个外壳程序(包括外壳程序的子进程)分配的最大内存量。

要Service在PowerShell中的键下修改设置,请执行以下操作:

  1. # substitute {path} with the path to the option after winrm/config/Service
  2. Set-Item -Path WSMan:localhostService{path} -Value "value here"
  3. # for example, to change ServiceAuthCbtHardeningLevel run
  4. Set-Item -Path WSMan:localhostServiceAuthCbtHardeningLevel -Value Strict  

要Winrs在PowerShell中的键下修改设置,请执行以下操作:

  1. # Substitute {path} with the path to the option after winrm/config/Winrs
  2. Set-Item -Path WSMan:localhostShell{path} -Value "value here"
  3. # For example, to change WinrsMaxShellRunTime run
  4. Set-Item -Path WSMan:localhostShellMaxShellRunTime -Value 2147483647  

注意

如果在域环境中运行,则其中某些选项由GPO设置,并且不能在主机本身上进行更改。使用GPO配置键后,该键[Source="GPO"]将在值旁边包含文本。

常见的WinRM问题

由于WinRM具有广泛的配置选项,因此可能难以设置和配置。由于这种复杂性,实际上Ansible所显示的问题可能与主机设置有关。

确定问题是否是主机问题的一种简单方法是从另一个Windows主机运行以下命令以连接到目标Windows主机:

  1. # Test out HTTP
  2. winrs -r:http://server:5985/wsman -u:Username -p:Password ipconfig
  3. # Test out HTTPS (will fail if the cert is not verifiable)
  4. winrs -r:https://server:5986/wsman -u:Username -p:Password -ssl ipconfig
  5. # Test out HTTPS, ignoring certificate verification
  6. $username = "Username"
  7. $password = ConvertTo-SecureString -String "Password" -AsPlainText -Force  
  8. $cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username, $password  
  9. $session_option = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck  
  10. Invoke-Command -ComputerName server -UseSSL -ScriptBlock { ipconfig } -Credential $cred -SessionOption $session_option  

如果失败,则问题可能与WinRM设置有关。如果有效,则问题可能与WinRM设置无关;请继续阅读以获取更多故障排除建议。

HTTP 401 /凭据被拒绝

HTTP 401错误表示身份验证过程在初始连接期间失败。需要检查的一些事情是:

  • 验证凭据正确无误,并使用ansibleuser和在清单中正确设置 ansiblepassword
  • 确保用户是本地Administrators组的成员,或者已被明确授予访问权限(winrs可以使用带有命令的连接测试将其排除在外)。
  • 确保在以下ansiblewinrmtransport位置启用了 设置的身份验证选项ServiceAuth*
  • 如果运行在HTTP和HTTPS不,使用ntlm,kerberos或credssp 与启用邮件加密。如果使用其他身份验证选项,或者如果无法升级已安装的pywinrm版本,则可以将设置为,但这仅建议用于故障排除ansiblewinrmmessage_encryption: auto ServiceAllowUnencryptedtrue
  • 确保下游封装pywinrm,requests-ntlm, requests-kerberos,和/或requests-credssp使用都是最新的pip。
  • 如果使用Kerberos身份验证,请确保ServiceAuthCbtHardeningLevel未将设置为Strict。
  • 使用基本或证书身份验证时,请确保该用户是本地帐户,而不是域帐户。域帐户不适用于基本身份验证和证书身份验证。

HTTP 500错误

这些表明WinRM服务发生了错误。要检查的一些事情包括:

  • 验证当前打开的外壳数没有超过一个,也没有超过 WinRsMaxShellsPerUser任何其他Winrs配额。

超时错误

这些通常表示Ansible无法访问主机的网络连接错误。要检查的一些事情包括:

  • 确保防火墙未设置为阻止已配置的WinRM侦听器端口
  • 确保在主机变量所设置的端口和路径上启用了WinRM侦听器
  • 确保该winrm服务正在Windows主机上运行并配置为自动启动

连接被拒绝错误

这些通常表示在尝试与主机上的WinRM服务进行通信时出现错误。一些要检查的东西:

  • 确保WinRM服务已启动并在主机上运行。使用 来获取服务的状态。(Get-Service -Name winrm).Status
  • 检查主机防火墙是否允许通过WinRM端口的通信。默认情况下,这适用5985于HTTP和5986HTTPS。

有时,安装程序可能会重新启动WinRM或HTTP服务并导致此错误。解决此问题的最佳方法是win_psexec从另一个Windows主机使用。

无法加载内置模块

如果powershell失败并显示类似的错误消息, 则尝试访问环境变量指定的所有路径可能会出现问题。造成此问题的常见原因是环境变量包含文件共享的UNC路径,并且由于存在双跳/凭据委派问题,Ansible进程无法访问这些文件夹。解决此问题的方法是:The 'Out-String' command was found in the module 'Microsoft.PowerShell.Utility', but the module could not be loaded. PSModulePathPSModulePath

  • 从PSModulePath环境变量中删除UNC路径,或者
  • 使用支持凭据委派的身份验证选项,例如credssp或kerberos启用了凭据委派

有关此问题的更多信息,请参见KB4076842。

3.Windows SSH设置

Ansible 2.8为Windows受管节点添加了实验性SSH连接。

警告

使用此功能需要您自担风险!在Windows上使用SSH是试验性的,该实现可能会在功能版本中进行向后不兼容的更改。服务器端组件可能不可靠,具体取决于所安装的版本。

安装Win32-OpenSSH

在Windows上使用SSH的第一步是 在Windows主机上安装Win32-OpenSSH服务。Microsoft提供了一种Win32-OpenSSH通过Windows功能进行安装的方法,但是当前通过此过程安装的版本太旧,无法与Ansible一起使用。要安装Win32-OpenSSH与Ansible一起使用,请选择以下三个安装选项之一:

  • 按照 Microsoft的安装说明手动安装服务。
  • 使用Chocolatey安装openssh软件包:
  1. choco install --package-parameters=/SSHServerFeature openssh  
  • 使用win_chocolatey安装服务:
  1. - name: install the Win32-OpenSSH service  
  2.   win_chocolatey:  
  3.     name: openssh  
  4.     package_params: /SSHServerFeature  
  5.     state: present  
  • 使用现有的Ansible Galaxy角色,例如jborean93.win_openssh:
  1. # Make sure the role has been downloaded first
  2. ansible-galaxy install jborean93.win_openssh  
  3. # main.yml
  4. - name: install Win32-OpenSSH service  
  5.   hosts: windows  
  6.   gather_facts: no  
  7.   roles:  
  8.   - role: jborean93.win_openssh  
  9.     opt_openssh_setup_service: True  

注意

Win32-OpenSSH仍然是测试版产品,并且会不断更新以包含新功能和错误修正。如果将SSH用作Windows的连接选项,则强烈建议您从上述3种方法之一安装最新版本。

配置Win32-OpenSSH Shell

默认情况下Win32-OpenSSH将cmd.exe用作外壳。要配置其他外壳,请使用Ansible任务定义注册表设置:

  1. - name: set the default shell to PowerShell  
  2.   win_regedit:  
  3.     path: HKLM:SOFTWAREOpenSSH  
  4.     name: DefaultShell  
  5.     data: C:WindowsSystem32WindowsPowerShellv1.0powershell.exe  
  6.     type: string  
  7.     state: present  
  8. # Or revert the settings back to the default, cmd
  9. - name: set the default shell to cmd  
  10.   win_regedit:  
  11.     path: HKLM:SOFTWAREOpenSSH  
  12.     name: DefaultShell  
  13.     state: absent  

Win32-OpenSSH身份验证

Windows的Win32-OpenSSH身份验证类似于Unix / Linux主机上的SSH身份验证。您可以使用纯文本密码或SSH公共密钥身份验证,可以将公共密钥添加到用户配置文件目录authorizedkey的.ssh文件夹中的文件中,并可以sshdconfig像在Unix / Linux主机上一样使用SSH服务使用的文件来配置服务。

当将SSH密钥身份验证与Ansible结合使用时,远程会话将无权访问用户的凭据,并且在尝试访问网络资源时将失败。这也称为双跳或凭据委派问题。有两种方法可以解决此问题:

  • 通过设置使用明文密码身份验证 ansible_password
  • 使用become需要访问远程资源的用户凭据在任务上使用

在Windows上为SSH配置Ansible

要将Ansible配置为对Windows主机使用SSH,必须设置两个连接变量:

  • 设置ansible_connection为ssh
  • 设置ansibleshelltype为cmd或powershell

该ansibleshelltype变量应反映DefaultShell Windows主机上的配置。设置cmd为默认外壳,powershell如果设置DefaultShell为PowerShell ,则设置为 。

Windows上SSH的已知问题

在Windows上使用SSH是试验性的,我们希望发现更多问题。以下是已知的:

  • Win32-OpenSSH版本早于外壳类型v7.9.0.0p1-Beta时不起作用powershell
  • 尽管SCP应该可以工作,但是SFTP是推荐的SSH文件传输机制,可在复制或获取文件时使用

也可以看看

  • 剧本简介 剧本介绍
  • 技巧和窍门 剧本的提示和技巧
  • Windows模块列表 Windows特定的模块列表,全部在PowerShell中实现
  • 用户邮件列表 有一个问题?停在Google网上论坛!
  • irc.freenode.net

0 人点赞