本文翻译转自[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运行此脚本的示例:
- $url = "https://raw.githubusercontent.com/jborean93/ansible-windows/master/scripts/Upgrade-PowerShell.ps1"
- $file = "$env:tempUpgrade-PowerShell.ps1"
- $username = "Administrator"
- $password = "Password"
- (New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
- Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force
- # Version can be 3.0, 4.0 or 5.1
- &$file -Version 5.1 -Username $username -Password $password -Verbose
完成后,您将需要删除自动登录并将执行策略重新设置为默认值Restricted。您可以使用以下PowerShell命令执行此操作:
- # This isn't needed but is a good security practice to complete
- Set-ExecutionPolicy -ExecutionPolicy Restricted -Force
- $reg_winlogon_path = "HKLM:SoftwareMicrosoftWindows NTCurrentVersionWinlogon"
- Set-ItemProperty -Path $reg_winlogon_path -Name AutoAdminLogon -Value 0
- Remove-ItemProperty -Path $reg_winlogon_path -Name DefaultUserName -ErrorAction SilentlyContinue
- 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命令将安装此修复程序:
- $url = "https://raw.githubusercontent.com/jborean93/ansible-windows/master/scripts/Install-WMF3Hotfix.ps1"
- $file = "$env:tempInstall-WMF3Hotfix.ps1"
- (New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
- 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中运行以下命令:
- $url = "https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1"
- $file = "$env:tempConfigureRemotingForAnsible.ps1"
- (New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
- powershell.exe -ExecutionPolicy ByPass -File $file
可以在此脚本旁边设置不同的开关和参数(如-EnableCredSSP和 -ForceNewSSLCert)。这些选项的文档位于脚本本身的顶部。
注意
ConfigureRemotingForAnsible.ps1脚本仅用于培训和开发目的,不应在生产环境中使用,因为它可以启用Basic本质上不安全的设置(如身份验证)。
WinRM侦听器
WinRM服务在一个或多个端口上侦听请求。这些端口中的每个端口都必须创建和配置一个侦听器。
要查看WinRM服务上正在运行的当前侦听器,请运行以下命令:
- winrm enumerate winrm/config/Listener
这将输出类似:
- Listener
- Address = *
- Transport = HTTP
- Port = 5985
- Hostname
- Enabled = true
- URLPrefix = wsman
- CertificateThumbprint
- 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::
- ffff:ffff:fffe%2, fe80::203d:7d97:c2ed:ec78%3, fe80::e8ea:d765:2c69:7756%7
- Listener
- Address = *
- Transport = HTTPS
- Port = 5986
- Hostname = SERVER2016
- Enabled = true
- URLPrefix = wsman
- CertificateThumbprint = E6CDAA82EEAF2ECE8546E05DB7F3E01AA47D76CE
- 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::
- 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中使用相关的证书指纹运行以下命令:
- $thumbprint = "E6CDAA82EEAF2ECE8546E05DB7F3E01AA47D76CE"
- 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命令来完成:
- $selector_set = @{
- Address = "*"
- Transport = "HTTPS"
- }
- $value_set = @{
- CertificateThumbprint = "E6CDAA82EEAF2ECE8546E05DB7F3E01AA47D76CE"
- }
- New-WSManInstance -ResourceURI "winrm/config/Listener" -SelectorSet $selector_set -ValueSet $value_set
- 要查看此PowerShell cmdlet的其他选项,请参阅 New-WSManInstance。
注意
创建HTTPS侦听器时,需要创建一个现有证书并将其存储在LocalMachineMy证书存储中。如果此存储中没有证书,则大多数命令将失败。
删除WinRM侦听器
删除WinRM侦听器:
- # Remove all listeners
- Remove-Item -Path WSMan:localhostListener* -Recurse -Force
- # Only remove listeners that are run over HTTPS
- Get-ChildItem -Path WSMan:localhostListener | Where-Object { $_.Keys -contains "Transport=HTTPS" } | Remove-Item -Recurse -Force
注意
该Keys对象是字符串数组,因此它可以包含不同的值。默认情况下,它包含一个密钥,Transport=并且Address= 与winrm枚举winrm / config / Listeners中的值相对应。
WinRM服务选项
可以设置许多选项来控制WinRM服务组件的行为,包括身份验证选项和内存设置。
要获取当前服务配置选项的输出,请运行以下命令:
- winrm get winrm/config/Service
- winrm get winrm/config/Winrs
这将输出类似:
- Service
- RootSDDL = O:NSG:BAD:P(A;;GA;;;BA)(A;;GR;;;IU)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)
- MaxConcurrentOperations = 4294967295
- MaxConcurrentOperationsPerUser = 1500
- EnumerationTimeoutms = 240000
- MaxConnections = 300
- MaxPacketRetrievalTimeSeconds = 120
- AllowUnencrypted = false
- Auth
- Basic = true
- Kerberos = true
- Negotiate = true
- Certificate = true
- CredSSP = true
- CbtHardeningLevel = Relaxed
- DefaultPorts
- HTTP = 5985
- HTTPS = 5986
- IPv4Filter = *
- IPv6Filter = *
- EnableCompatibilityHttpListener = false
- EnableCompatibilityHttpsListener = false
- CertificateThumbprint
- AllowRemoteAccess = true
- Winrs
- AllowRemoteShellAccess = true
- IdleTimeout = 7200000
- MaxConcurrentUsers = 2147483647
- MaxShellRunTime = 2147483647
- MaxProcessesPerShell = 2147483647
- MaxMemoryPerShellMB = 2147483647
- 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中的键下修改设置,请执行以下操作:
- # substitute {path} with the path to the option after winrm/config/Service
- Set-Item -Path WSMan:localhostService{path} -Value "value here"
- # for example, to change ServiceAuthCbtHardeningLevel run
- Set-Item -Path WSMan:localhostServiceAuthCbtHardeningLevel -Value Strict
要Winrs在PowerShell中的键下修改设置,请执行以下操作:
- # Substitute {path} with the path to the option after winrm/config/Winrs
- Set-Item -Path WSMan:localhostShell{path} -Value "value here"
- # For example, to change WinrsMaxShellRunTime run
- Set-Item -Path WSMan:localhostShellMaxShellRunTime -Value 2147483647
注意
如果在域环境中运行,则其中某些选项由GPO设置,并且不能在主机本身上进行更改。使用GPO配置键后,该键[Source="GPO"]将在值旁边包含文本。
常见的WinRM问题
由于WinRM具有广泛的配置选项,因此可能难以设置和配置。由于这种复杂性,实际上Ansible所显示的问题可能与主机设置有关。
确定问题是否是主机问题的一种简单方法是从另一个Windows主机运行以下命令以连接到目标Windows主机:
- # Test out HTTP
- winrs -r:http://server:5985/wsman -u:Username -p:Password ipconfig
- # Test out HTTPS (will fail if the cert is not verifiable)
- winrs -r:https://server:5986/wsman -u:Username -p:Password -ssl ipconfig
- # Test out HTTPS, ignoring certificate verification
- $username = "Username"
- $password = ConvertTo-SecureString -String "Password" -AsPlainText -Force
- $cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username, $password
- $session_option = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
- 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
ServiceAllowUnencrypted
true - 确保下游封装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. PSModulePath
PSModulePath
- 从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软件包:
- choco install --package-parameters=/SSHServerFeature openssh
- 使用win_chocolatey安装服务:
- - name: install the Win32-OpenSSH service
- win_chocolatey:
- name: openssh
- package_params: /SSHServerFeature
- state: present
- 使用现有的Ansible Galaxy角色,例如jborean93.win_openssh:
- # Make sure the role has been downloaded first
- ansible-galaxy install jborean93.win_openssh
- # main.yml
- - name: install Win32-OpenSSH service
- hosts: windows
- gather_facts: no
- roles:
- - role: jborean93.win_openssh
- opt_openssh_setup_service: True
注意
Win32-OpenSSH仍然是测试版产品,并且会不断更新以包含新功能和错误修正。如果将SSH用作Windows的连接选项,则强烈建议您从上述3种方法之一安装最新版本。
配置Win32-OpenSSH Shell
默认情况下Win32-OpenSSH将cmd.exe用作外壳。要配置其他外壳,请使用Ansible任务定义注册表设置:
- - name: set the default shell to PowerShell
- win_regedit:
- path: HKLM:SOFTWAREOpenSSH
- name: DefaultShell
- data: C:WindowsSystem32WindowsPowerShellv1.0powershell.exe
- type: string
- state: present
- # Or revert the settings back to the default, cmd
- - name: set the default shell to cmd
- win_regedit:
- path: HKLM:SOFTWAREOpenSSH
- name: DefaultShell
- 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