Windows#

Для взаимодействия Ansible с внешними узлами, находящимися под управлением операционной системы Windows, используют протокол WinRM (Windows Remote Management). Поверх WinRM применяется протокол прикладного уровня PSRP (PowerShell Remoting Protocol), который обеспечивает выполнение цепочки команд через PowerShell.

Настройка выполняется в следующей последовательности:

  1. Подготовка учетной записи.

  2. Включение WinRM.

  3. Настройка подключения в файле описания инвентаря.

  4. (Опционально) Настройка защищенного соединения (HTTPS).

Подключение по SSH (OpenSSH) также поддерживается, но используется как альтернативный вариант.

Версия Windows

Поддерживаемые способы подключения

Windows Server 2016 и новее

WinRM (PSRP), SSH (OpenSSH)

Windows 10, 11

WinRM (PSRP), SSH (OpenSSH)

Общие требования#

Перед началом настройки убедитесь, что целевой узел соответствует базовым требованиям.

  • Учетная запись, от имени которой Ansible будет подключаться к узлам, обладает правами администратора.

  • Установлен инструмент PowerShell версии 5.1 или выше.

  • Сетевая доступность соответствует следующим критериям:

    • WinRM – порт TCP 5985 (HTTP) или 5986 (HTTPS).

    • SSH – порт TCP 22.

  • Настроена синхронизация времени между узлами.

  • Настроена служба DNS.

Важно

Windows Firewall применяет разные наборы правил в зависимости от профиля сети:

  • Public – самый строгий профиль (используется для общественных сетей: кафе, аэропорты и т.д.) В нем по умолчанию отключены исключения сетевого фильтра для WinRM, поскольку разрешение удаленного управления в публичной сети небезопасно.

  • Private и Domain – разрешают необходимые исключения для входящих подключений WinRM (порт 5985/5986).

Таким образом, если хотя бы один сетевой адаптер имеет профиль Public, winrm quickconfig отказывается создавать правило сетевого фильтра. Профиль сети должен быть Private или Domain.

Подробнее об ошибках и их решении см. в официальной документации Microsoft:

Настройка WinRM#

Для обеспечения подключения Ansible к узлу по WinRM необходимо выполнить базовые настройки.

Создание учетной записи#

Создайте учетную запись , например ansibleadmin, с привилегиями которой Ansible будет подключаться к целевому узлу.

Для этого выполните следующие действия в командной строке с правами администратора:

  1. Создайте локального пользователя:

    net user ansibleadmin <password> /add
    
  2. Добавьте пользователя в группу локальных администраторов:

    net localgroup Administrators ansibleadmin /add
    

Включение и базовая настройка WinRM#

Команда winrm quickconfig выполняет базовую настройку службы WinRM за один шаг. Она включает службу WinRM, создает HTTP Listener на порту 5985 и добавляет соответствующее правило в Windows Firewall.

Выполните указанную команду в PowerShell с правами администратора:

winrm quickconfig

Устранение ошибки профиля сети#

Если при выполнении команды winrm quickconfig возникает ошибка, связанная с сетевым фильтром и публичным профилем сети, это обычно означает, что хотя бы один сетевой адаптер имеет профиль Public. Измените профиль сети на Private. Для этого выполните следующие действия:

  1. Определите название сетевого интерфейса:

    Get-NetConnectionProfile
    
  2. Измените профиль сети на Private:

    Set-NetConnectionProfile -InterfaceAlias "<InterfaceAlias>" -NetworkCategory Private
    

    Здесь <InterfaceAlias> – название сетевого интерфейса, полученное из вывода команды Get-NetConnectionProfile.

  3. Повторно выполните базовую настройку WinRM:

    winrm quickconfig
    

Настройка подключения в Ansible#

После настройки WinRM необходимо описать параметры подключения в файле инвентаря Ansible.

Пример конфигурации:

[windows]
<winhost> ansible_host=<address>

[windows:vars]
ansible_connection=ansible.builtin.psrp
ansible_user=".\\ansibleadmin"
ansible_password="<password>"

ansible_psrp_protocol=http
ansible_psrp_port=5985
ansible_psrp_auth=ntlm
ansible_psrp_cert_validation=ignore

Здесь:

  • <winhost> – название узла в инвентаре;

  • <address> – FQDN или IP-адрес целевого узла;

  • <password> – пароль учетной записи ansibleadmin.

Проверка подключения#

После завершения настройки рекомендуется проверить доступность узла из Ansible. Для этого в терминале выполните команду, использующую модуль ping:

ansible windows -m ansible.windows.win_ping

Если настройка выполнена корректно, команда вернет сообщение следующего вида, подтверждающее успешное выполнение модуля:

winhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Настройка защищенного соединения#

По умолчанию WinRM работает по протоколу HTTP (порт 5985), передавая данные в открытом виде. Для использования в производственной среде настоятельно рекомендуется настроить WinRM по протоколу HTTPS (порт 5986). В этом случае весь трафик между Ansible и узлом Windows будет зашифрован с помощью SSL/TLS.

WinRM использует специальный компонент, называемый Listener (слушатель). Listener – это сетевой приемник, который ожидает входящие подключения на определенном порту и обрабатывает их. Для работы по HTTPS необходимо создать HTTPS Listener и указать ему сертификат, который будет использоваться для шифрования соединения.

Настройка с использованием самозаверенного сертификата#

Применение самозаверенного сертификата подходит для тестовых сред или в случаях, когда отсутствует инфраструктура удостоверяющего центра. Самозаверенный сертификат не подписан доверенным удостоверяющим центром, поэтому Ansible по умолчанию будет его отклонять. Для игнорирования этой проверки используется параметр cert_validation=ignore.

Для настройки соединения с использованием самозаверенного сертификата выполните следующие действия:

  1. Создайте самозаверенный сертификат, используя команду PowerShell:

    $hostname = $env:COMPUTERNAME
    $cert = New-SelfSignedCertificate `
        -DnsName $hostname `
        -CertStoreLocation Cert:\LocalMachine\My `
        -NotAfter (Get-Date).AddYears(5)
    

    Эта команда выполняет следующие действия:

    • создает самозаверенный сертификат с доменным именем устройства (hostname) в поле DNS;

    • настраивает назначение сертификата (Enhanced Key Usage): Server Authentication (серверная аутентификация);

    • помещает сертификат в системное хранилище LocalMachine\My (личное хранилище сертификатов устройства);

    • делает сертификат действительным в течение 5 лет.

  2. Создайте HTTPS Listener и привяжите к нему созданный сертификат, используя команду PowerShell:

    New-Item -Path WSMan:\localhost\Listener `
        -Transport HTTPS `
        -Address * `
        -CertificateThumbprint $cert.Thumbprint `
        -Force
    

    Эта команда выполняет следующие действия:

    • создает новый Listener в конфигурации службы WinRM;

    • указывает, что Listener должен работать по протоколу HTTPS;

    • указывает, что Listener должен принимать подключения на всех IP-адресах устройства;

    • привязывает к Listener сертификат по его отпечатку (Thumbprint).

  3. Измените параметры подключения в файле инвентаря Ansible:

    ansible_psrp_protocol=https
    ansible_psrp_port=5986
    ansible_psrp_cert_validation=ignore   # Обязательно для самозаверенного сертификата
    

Настройка с использованием сертификата удостоверяющего центра#

Этот вариант рекомендуется для производственных сред с централизованным управлением сертификатами.

В этом случае используется сертификат, выданный внутренним или внешним удостоверяющим центром (CA). Такому сертификату автоматически доверяют все устройства домена или те, у которых установлен корневой сертификат центра сертификации.

Для настройки соединения с использованием сертификата удостоверяющего центра выполните следующие действия в PowerShell:

  1. Установите сертификат сервера (с назначением Server Authentication) в хранилище LocalMachine\My реестра Windows.

    Например, если у вас есть файл PFX, содержащий в зашифрованном виде приватный ключ и сертификат (и, возможно, промежуточные сертификаты), можно использовать команду PowerShell Import-PfxCertificate для переноса его содержимого в хранилище LocalMachine/My:

    Import-PfxCertificate -FilePath <.\dev.lab.pfx> -Password (ConvertTo-SecureString -String <$PfxPassword> -AsPlainText)
    

    Здесь:

    • <.dev.lab.pfx> – путь к файлу PFX;

    • <$PfxPassword> – переменная с паролем к файлу PFX.

  2. Получите отпечаток (Thumbprint) установленного сертификата. Это можно сделать через оснастку certlm.msc или с помощью команды PowerShell:

    Get-ChildItem Cert:\LocalMachine\My | Select Thumbprint, Subject, NotAfter, FriendlyName
    
  3. Создайте HTTPS Listener, указав отпечаток вашего сертификата:

    New-Item -Path WSMan:\localhost\Listener `
        -Transport HTTPS `
        -Address * `
        -CertificateThumbprint <thumbprint> `
        -Force
    

    Здесь <thumbprint> – отпечаток сертификата, установленного в хранилище LocalMachine\My.

  4. В файле инвентаря Ansible уберите параметр ansible_psrp_cert_validation=ignore, так как сертификат выдан удостоверяющим центром, которому доверяет управляющий узел:

    ansible_psrp_protocol=https
    ansible_psrp_port=5986
    # ansible_psrp_cert_validation=ignore
    

Проверка конфигурации WinRM#

После настройки убедитесь, что настройки Listener созданы корректно. Для этого выполните команду:

winrm enumerate winrm/config/listener

В выводе должны присутствовать записи следующего вида:

Listener
    ...
    Transport = HTTP
    Port = 5985
    ...
Listener
    ...
    Transport = HTTPS
    Port = 5986
    ...

Настройка SSH#

SSH можно использовать вместо WinRM для установления соединения с внешними узлами.

Установка OpenSSH#

Установите и запустите сервер OpenSSH.

Для этого выполните в PowerShell следующие команды:

Get-WindowsCapability -Name OpenSSH.Server* -Online |
    Add-WindowsCapability -Online

Set-Service -Name sshd -StartupType Automatic
Start-Service sshd

New-NetFirewallRule -Name sshd `
    -DisplayName "OpenSSH Server" `
    -Enabled True `
    -Direction Inbound `
    -Protocol TCP `
    -Action Allow `
    -LocalPort 22

Настройка оболочки#

По умолчанию OpenSSH использует cmd.exe. Для корректной работы Ansible рекомендуется переключить оболочку на PowerShell с помощью следующей команды в PowerShell:

New-ItemProperty `
    -Path "HKLM:\SOFTWARE\OpenSSH" `
    -Name DefaultShell `
    -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" `
    -PropertyType String `
    -Force

Размещение ключа SSH#

Для подключения по SSH необходимо настроить аутентификацию по ключу.

  1. Создайте пользователя.

  2. Добавьте публичный ключ в файл C:\Users\<user>\.ssh\authorized_keys.

В результате проведенной настройки узел готов к выполнению операций автоматизации под управлением Ansible с использованием протокола WinRM (PSRP) или SSH.