Spec-Zone.ru › Ansible

Настройка хоста Windows

В этом документе описывается настройка, необходимая перед тем, как Ansible сможет взаимодействовать с хостом Microsoft Windows.

  • Требования к хосту

    • Обновление PowerShell и .NET Framework
    • Обходной путь WinRM для памяти
  • Настройка WinRM

    • Слушатель WinRM

      • Настройка слушателя WinRM
      • Удаление слушателя WinRM
    • Параметры службы WinRM
    • Общие проблемы с WinRM

      • HTTP 401/Отклонены учетные данные
      • Ошибка HTTP 500
      • Ошибки таймаута
      • Ошибки отказа в подключении
      • Не удалось загрузить встроенные модули
  • Настройка SSH для Windows

    • Установка OpenSSH с помощью настроек Windows
    • Установка Win32-OpenSSH
    • Настройка оболочки Win32-OpenSSH
    • Аутентификация Win32-OpenSSH
    • Настройка Ansible для SSH на Windows
    • Известные проблемы с SSH на 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:

  1. В качестве дополнительной, но хорошей меры безопасности, вы можете установить политику выполнения обратно по умолчанию.
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force

Используйте значение RemoteSigned для серверов Windows или Restricted для клиентских компьютеров Windows.

  1. Удалите автоматическое вход.
$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_chocolatey Ansible:
- 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API