Настройка хоста Windows
В этом документе описывается настройка, необходимая перед тем, как Ansible сможет взаимодействовать с хостом Microsoft Windows.
Требования к хосту
Для взаимодействия Ansible с хостом Windows и использования модулей Windows хост должен соответствовать этим базовым требованиям к подключению:
- С помощью Ansible вы обычно можете управлять версиями Windows в рамках текущей и расширенной поддержки Microsoft. Вы также можете управлять настольными ОС, включая Windows 10 и 11, и серверными ОС, включая Windows Server 2016, 2019 и 2022.
- Вам необходимо установить PowerShell 5.1 или более поздней версии и по крайней мере .NET 4.0 на хосте Windows.
- Вам необходимо создать и активировать слушателя WinRM. Более подробная информация см. в разделе Слушатель WinRM.
Примечание
Некоторые модули Ansible имеют дополнительные требования, такие как более новая ОС или версия PowerShell. Обратитесь к странице документации модуля, чтобы определить, соответствует ли хост этим требованиям.
Обновление PowerShell и .NET Framework
Ansible требует PowerShell версии 5.1 и .NET Framework 4.6 или более поздней версии для работы. Базовый образ для более старых, не поддерживаемых ОС не соответствует этим требованиям. Вы можете использовать скрипт Upgrade-PowerShell.ps1 для обновления этих компонентов.
Вот пример того, как запустить этот скрипт из PowerShell:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $url = "https://raw.githubusercontent.com/jborean93/ansible-windows/master/scripts/Upgrade-PowerShell.ps1" $file = "$env:temp\Upgrade-PowerShell.ps1" $username = "Administrator" $password = "Password" (New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file) Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force &$file -Version 5.1 -Username $username -Password $password -Verbose
В скрипте значение file может быть версией PowerShell 3.0, 4.0 или 5.1.
После завершения необходимо выполнить следующие команды PowerShell:
- В качестве дополнительной, но хорошей меры безопасности, вы можете установить политику выполнения обратно по умолчанию.
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force
Используйте значение RemoteSigned для серверов Windows или Restricted для клиентских компьютеров Windows.
- Удалите автоматическое вход.
$reg_winlogon_path = "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" 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 установлены, скрипт автоматически перезагрузит компьютер и затем выполнит вход. Если параметры username и password не установлены, скрипт попросит пользователя вручную перезагрузить компьютер и выполнить вход при необходимости. При следующем входе пользователя скрипт продолжит работу с того места, где остановился, и процесс будет продолжаться до тех пор, пока не останется никаких задач.
Примечание
Если вы запустите скрипт на Server 2008, вам необходимо установить SP2. Для Server 2008 R2 или Windows 7 вам нужен SP1.
На Windows Server 2008 можно установить только PowerShell 3.0. Более новая версия приведет к ошибке выполнения скрипта.
Параметры username и password хранятся в виде обычного текста в реестре. После завершения работы скрипта выполните команды очистки, чтобы убедиться, что на хосте не сохранились учетные данные.
Обходной путь WinRM для памяти
В PowerShell v3.0 существует ошибка, ограничивающая объем памяти, доступный для службы WinRM. Используйте скрипт Install-WMF3Hotfix.ps1, чтобы установить исправление на затронутые хосты в рамках процесса загрузки системы или создания образов. Без этого исправления Ansible не может выполнить некоторые команды на хосте Windows.
Для установки исправления:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $url = "https://raw.githubusercontent.com/jborean93/ansible-windows/master/scripts/Install-WMF3Hotfix.ps1" $file = "$env:temp\Install-WMF3Hotfix.ps1" (New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file) powershell.exe -ExecutionPolicy ByPass -File $file -Verbose
Для получения дополнительной информации см. статью “Ошибка «Недостаточно памяти» на компьютере, на котором настроен параметр MaxMemoryPerShellMB, и установлен WMF 3.0.
Настройка WinRM
Необходимо настроить службу WinRM, чтобы Ansible мог подключиться к ней. Есть две основные составляющие службы WinRM, которые управляют тем, как Ansible взаимодействует с хостом Windows: listener и service параметры конфигурации.
Примечание
Скрипт для настройки этой службы доступен для скачивания на GitHub. Причина в том, что его использование может вызвать несколько проблем для пользователя. Вероятность того, что он будет полностью удалён в будущем, достаточно высока.
Слушатель 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
В приведенном выше примере активированы два слушателя. Один прослушивает порт 5985 по протоколу HTTP, а другой — порт 5986 по протоколу HTTPS. Некоторые ключевые параметры, которые полезно понимать, это:
-
Transport: Указывает, используется ли слушатель HTTP или HTTPS. Рекомендуется использовать слушатель HTTPS, поскольку данные шифруются без дополнительных изменений. -
Port: Порт, на котором работает слушатель. По умолчанию это5985для HTTP и5986для HTTPS. Этот порт можно изменить на любой необходимый, что соответствует переменной хостаansible_port. -
URLPrefix: Префикс URL для прослушивания. По умолчанию этоwsman. Если вы измените этот параметр, вам необходимо установить переменную хостаansible_winrm_pathна то же значение. -
CertificateThumbprint: Если используется HTTPS-слушатель, это отпечаток сертификата в хранилище сертификатов Windows, используемого в подключении. Чтобы получить информацию о самом сертификате, выполните эту команду с соответствующим отпечатком сертификата в PowerShell:
$thumbprint = "E6CDAA82EEAF2ECE8546E05DB7F3E01AA47D76CE"
Get-ChildItem -Path cert:\LocalMachine\My -Recurse | Where-Object { $_.Thumbprint -eq $thumbprint } | Select-Object *
Настройка слушателя WinRM
Есть три способа настройки слушателя WinRM:
- Использование
winrm quickconfigдля HTTP илиwinrm quickconfig -transport:httpsдля HTTPS. Это самый простой вариант для использования вне среды домена, когда требуется простой слушатель. В отличие от других вариантов, этот процесс также имеет дополнительное преимущество открытия брандмауэра для необходимых портов и запуска службы WinRM. - Использование объектов групповой политики (GPO). Это лучший способ создать слушатель, когда хост является членом домена, поскольку конфигурация выполняется автоматически без какого-либо ввода пользователя. Для получения дополнительной информации об объектах групповой политики см. документацию по объектам групповой политики.
-
Использование PowerShell для создания слушателя со специфической конфигурацией. Это можно сделать, выполнив следующие команды PowerShell:
$selector_set = @{ Address = "*" Transport = "HTTPS" } $value_set = @{ CertificateThumbprint = "E6CDAA82EEAF2ECE8546E05DB7F3E01AA47D76CE" } New-WSManInstance -ResourceURI "winrm/config/Listener" -SelectorSet $selector_set -ValueSet $value_setЧтобы увидеть другие параметры с этой командой PowerShell, обратитесь к документации New-WSManInstance.
Примечание
При создании HTTPS-слушателя необходимо создать и сохранить сертификат в хранилище сертификатов LocalMachine\My.
Удаление слушателя WinRM
- Чтобы удалить все слушатели WinRM:
Remove-Item -Path WSMan:\localhost\Listener\* -Recurse -Force
- Чтобы удалить только те слушатели, которые работают по протоколу HTTPS:
Get-ChildItem -Path WSMan:\localhost\Listener | Where-Object { $_.Keys -contains "Transport=HTTPS" } | Remove-Item -Recurse -Force
Примечание
Объект Keys представляет собой массив строк, поэтому он может содержать различные значения. По умолчанию он содержит ключ для Transport= и Address=, которые соответствуют значениям из команды winrm enumerate 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
Вам не нужно изменять большинство этих параметров. Однако некоторые важные из них:
-
Service\AllowUnencrypted- указывает, разрешит ли WinRM трафик HTTP без шифрования сообщений. Шифрование на уровне сообщений возможно только в том случае, если переменнаяansible_winrm_transportимеет значениеntlm,kerberosилиcredssp. По умолчанию этоfalse, и вы должны установить его вtrueтолько при отладке сообщений WinRM. -
Service\Auth\*- определяет доступные параметры аутентификации для службы WinRM. По умолчанию включеныNegotiate (NTLM)иKerberos. -
Service\Auth\CbtHardeningLevel- определяет, проверяются ли токены привязки каналов (None), проверяются, но не требуются (Relaxed), или проверяются и требуются (Strict). CBT используется только при подключении с использованием NT LAN Manager (NTLM) или Kerberos по HTTPS. -
Service\CertificateThumbprint- отпечаток сертификата для шифрования канала TLS, используемого с аутентификацией CredSSP. По умолчанию пустое значение. При запуске службы WinRM генерируется самозаверяющий сертификат, используемый в процессе TLS. -
Winrs\MaxShellRunTime- максимальное время, в миллисекундах, которое может выполняться удалённая команда. -
Winrs\MaxMemoryPerShellMB- максимальный объём памяти, выделенной для оболочки, включая её дочерние процессы.
Чтобы изменить значение под ключом Service в PowerShell, необходимо указать путь к параметру после winrm/config/Service:
Set-Item -Path WSMan:\localhost\Service\{path} -Value {some_value}
Например, чтобы изменить Service\Auth\CbtHardeningLevel:
Set-Item -Path WSMan:\localhost\Service\Auth\CbtHardeningLevel -Value Strict
Чтобы изменить значение под ключом Winrs в PowerShell, необходимо указать путь к параметру после winrm/config/Winrs:
Set-Item -Path WSMan:\localhost\Shell\{path} -Value {some_value}
Например, чтобы изменить Winrs\MaxShellRunTime:
Set-Item -Path WSMan:\localhost\Shell\MaxShellRunTime -Value 2147483647
Примечание
Если вы выполняете команду в среде домена, некоторые из этих параметров устанавливаются с помощью GPO и не могут быть изменены на хосте. При конфигурации ключа с помощью GPO в значении содержится текст [Source="GPO"].
Общие проблемы WinRM
WinRM имеет множество параметров конфигурации, что делает его настройку сложной. В результате, ошибки, отображаемые Ansible, могут на самом деле быть проблемами с настройкой хоста.
Чтобы определить проблему хоста, выполните следующую команду с другого Windows-хоста для подключения к целевому Windows-хосту.
- Для проверки HTTP:
winrs -r:http://server:5985/wsman -u:Username -p:Password ipconfig
- Для проверки HTTPS:
winrs -r:https://server:5986/wsman -u:Username -p:Password -ssl ipconfig
Команда завершится ошибкой, если сертификат не может быть проверен.
- Для проверки HTTPS, игнорируя проверку сертификата:
$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.
HTTP 401/Отклонены учетные данные
Ошибка HTTP 401 указывает на то, что процесс аутентификации завершился неудачей во время первоначального подключения. Вы можете проверить следующее для устранения неполадок:
- Убедитесь, что учетные данные правильные и корректно заданы в вашем инвентаре с помощью переменных
ansible_userиansible_password. - Пользователь является членом локальной группы Администраторы или получил явное разрешение на доступ. Вы можете выполнить тест подключения с помощью команды
winrs, чтобы исключить эту причину. - Опция аутентификации, заданная переменной
ansible_winrm_transport, включена вService\Auth\*. - Если выполняется подключение по протоколу HTTP, а не HTTPS, используйте
ntlm,kerberosилиcredsspс пользовательской переменной инвентаризацииansible_winrm_message_encryption: auto, чтобы включить шифрование сообщений. Если вы используете другой вариант аутентификации или если невозможно обновить установленный пакетpywinrm, вы можете установитьService\AllowUnencryptedв значениеtrue. Это рекомендуется только для устранения неполадок. - Дополнительные пакеты
pywinrm,requests-ntlm,requests-kerberos, и/илиrequests-credsspобновлены с использованиемpip. - Для аутентификации Kerberos убедитесь, что
Service\Auth\CbtHardeningLevelне установлено в значениеStrict. - Для аутентификации Basic или Certificate убедитесь, что пользователь является локальным аккаунтом. Доменные аккаунты не работают с аутентификациями Basic и Certificate.
Ошибка HTTP 500
Ошибка HTTP 500 указывает на проблему с сервисом WinRM. Вы можете проверить следующее для устранения неполадок:
- Число открытых в данный момент сеансов не превысило
WinRsMaxShellsPerUser. В противном случае, вы не превысили другие квоты Winrs.
Ошибки таймаута
Иногда Ansible не может подключиться к хосту. Эти случаи обычно указывают на проблему с сетевым подключением. Вы можете проверить следующее для устранения неполадок:
- Брандмауэр не блокирует конфигурированные порты WinRM.
- Слушатель WinRM включен на порту и пути, заданных в переменных хоста.
- Сервис
winrmзапущен на Windows-хосте и настроен на автоматический запуск.
Ошибки «Подключение отклонено»
При взаимодействии с сервисом WinRM на хосте могут возникнуть проблемы. Проверьте следующее, чтобы помочь в устранении неполадок:
- Сервис WinRM запущен и работает на хосте. Используйте команду
(Get-Service -Name winrm).Statusдля получения статуса сервиса. - Брандмауэр хоста разрешает трафик через порт WinRM. По умолчанию это
5985для HTTP и5986для HTTPS.
Иногда установщик может перезапустить сервис WinRM или HTTP, вызывая эту ошибку. Лучший способ справиться с этим – использовать модуль win_psexec с другого Windows-хоста.
Ошибка загрузки встроенных модулей
Иногда PowerShell завершается ошибкой, подобной:
The 'Out-String' command was found in the module 'Microsoft.PowerShell.Utility', but the module could not be loaded.
В этом случае может возникнуть проблема при попытке доступа ко всем путям, указанным в переменной среды PSModulePath.
Частой причиной этой проблемы является то, что PSModulePath содержит UNC-путь к файловому ресурсу. Кроме того, проблема двойного соединения/делегирования учетных данных приводит к тому, что процесс Ansible не может получить доступ к этим папкам. Чтобы решить эту проблему, необходимо:
- Удалить UNC-путь из
PSModulePath.
или
- Использовать метод аутентификации, поддерживающий делегирование учетных данных, например,
credsspилиkerberos. Вам необходимо включить делегирование учетных данных.
Для получения дополнительной информации об этой проблеме см. KB4076842.
Настройка SSH для Windows
Ansible 2.8 добавило экспериментальное SSH-соединение для управляемых Windows узлов.
Предупреждение
Используйте эту функцию на свой страх и риск! Использование SSH с Windows экспериментально. Данная реализация может содержать несовместимые с предыдущими версиями изменения в будущих релизах. Компоненты серверной части могут быть ненадежными в зависимости от вашей установленной версии.
Установка OpenSSH с помощью настроек Windows
Вы можете использовать OpenSSH для подключения Windows 10 клиентов к Windows Server 2019. OpenSSH клиент доступен для установки на Windows 10 сборки 1809 и более поздних версий. OpenSSH сервер доступен для установки на Windows Server 2019 и более поздних версий.
Для получения дополнительной информации, обратитесь к Начните работу с OpenSSH для Windows.
Установка Win32-OpenSSH
Для установки сервиса Win32-OpenSSH для использования с Ansible, выберите один из этих вариантов установки:
- Вручную установите
Win32-OpenSSH, следуя инструкциям по установке от Microsoft. - Используйте Chocolatey:
choco install --package-parameters=/SSHServerFeature openssh
- Используйте модуль
win_chocolateyAnsible:
- name: install the Win32-OpenSSH service
win_chocolatey:
name: openssh
package_params: /SSHServerFeature
state: present
- Установите ролью из Ansible Galaxy, например, jborean93.win_openssh:
ansible-galaxy install jborean93.win_openssh
- Используйте роль в вашем playbook:
- name: install Win32-OpenSSH service
hosts: windows
gather_facts: false
roles:
- role: jborean93.win_openssh
opt_openssh_setup_service: True
Примечание
Win32-OpenSSH все еще является бета-продуктом и постоянно обновляется для включения новых функций и исправлений ошибок. Если вы используете SSH в качестве варианта подключения для Windows, мы настоятельно рекомендуем вам установить последнюю версию.
Настройка оболочки Win32-OpenSSH
По умолчанию Win32-OpenSSH использует cmd.exe в качестве оболочки.
- Для настройки другой оболочки используйте playbook Ansible с задачей для определения параметра реестра:
- name: set the default shell to PowerShell
win_regedit:
path: HKLM:\SOFTWARE\OpenSSH
name: DefaultShell
data: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
type: string
state: present
- Для возврата к настройкам по умолчанию (стандартной оболочке):
- name: set the default shell to cmd
win_regedit:
path: HKLM:\SOFTWARE\OpenSSH
name: DefaultShell
state: absent
Аутентификация Win32-OpenSSH
Аутентификация Win32-OpenSSH с Windows аналогична аутентификации SSH на Unix/Linux хостах. Вы можете использовать аутентификацию паролем в открытом виде или с использованием открытых ключей SSH.
Для аутентификации с использованием ключей:
- Добавьте ваши открытые ключи в файл
authorized_keyв папке.sshкаталога профиля пользователя. - Настройте службу SSH с использованием файла
sshd_config.
При использовании аутентификации SSH с открытым ключом с Ansible, удаленный сеанс не будет иметь доступа к учетным данным пользователя и завершится ошибкой при попытке доступа к сетевому ресурсу. Это также известно как проблема двойного соединения или делегирования учетных данных. Для решения этой проблемы:
- Используйте аутентификацию паролем в открытом виде, установив переменную
ansible_password. - Используйте директиву
becomeв задаче с учетными данными пользователя, которому необходим доступ к удаленному ресурсу.
Настройка Ansible для SSH на Windows
Чтобы настроить Ansible для использования SSH для Windows-хостов, необходимо установить две переменные подключения:
- установите
ansible_connectionв значениеssh. - установите
ansible_shell_typeв значениеcmdилиpowershell
Переменная ansible_shell_type должна отражать конфигурированное значение DefaultShell на Windows-хосте. Установите ansible_shell_type в cmd для стандартной оболочки. В противном случае установите ansible_shell_type в powershell если вы изменили DefaultShell на PowerShell.
Известные проблемы с SSH на Windows
Использование SSH с Windows экспериментально. В настоящее время существуют следующие проблемы:
- Версии Win32-OpenSSH, более старые, чем
v7.9.0.0p1-Betaне работают, когдаpowershellявляется типом оболочки. - Хотя протокол Secure Copy (SCP) должен работать, рекомендуется использовать протокол SSH File Transfer (SFTP) при копировании или получении файла.
См. также
- Ansible playbooks
-
Введение в playbooks
- Советы и рекомендации по Ansible
-
Советы и рекомендации по playbooks
- Список модулей Windows
-
Список модулей, специфичных для Windows, все они реализованы в PowerShell
- Связь
-
У вас есть вопросы? Нужна помощь? Хотите поделиться своими идеями? Посетите руководство по коммуникации Ansible
© 2012–2018 Michael DeHaan
© 2018–2024 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/latest/os_guide/windows_setup.html