Windows#
Для взаимодействия Ansible с целевыми узлами, находящимися под управлением операционной системы Windows, используют протокол WinRM (Windows Remote Management). Поверх WinRM применяется протокол прикладного уровня PSRP (PowerShell Remoting Protocol), который обеспечивает выполнение цепочки команд через PowerShell.
Настройка выполняется в следующей последовательности:
Подготовка учетной записи.
Включение WinRM.
Настройка подключения в файле описания инвентаря.
(Опционально) Настройка защищенного соединения (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 будет подключаться к целевому узлу.
Для этого выполните следующие действия в командной строке с правами администратора:
Создайте локального пользователя:
net user ansibleadmin <password> /add
Добавьте пользователя в группу локальных администраторов:
net localgroup Administrators ansibleadmin /add
Примечание
В русскоязычной Windows встроенная группа администраторов называется «Администраторы». Не зависящий от локализации вариант – команда PowerShell, использующая идентификатор SID группы:
Add-LocalGroupMember -SID S-1-5-32-544 -Member ansibleadmin
Включение и базовая настройка WinRM#
Команда winrm quickconfig выполняет базовую настройку службы WinRM за один шаг.
Она включает службу WinRM, создает HTTP Listener на порту 5985 и добавляет соответствующее правило в Windows Firewall.
Выполните указанную команду в PowerShell с правами администратора:
winrm quickconfig
Устранение ошибки профиля сети#
Если при выполнении команды winrm quickconfig возникает ошибка, связанная с сетевым фильтром и публичным профилем сети, это обычно означает, что хотя бы один сетевой адаптер имеет профиль Public.
Измените профиль сети на Private.
Для этого выполните следующие действия:
Определите название сетевого интерфейса:
Get-NetConnectionProfileИзмените профиль сети на
Private:Set-NetConnectionProfile -InterfaceAlias "<InterfaceAlias>" -NetworkCategory Private
Здесь <InterfaceAlias> – название сетевого интерфейса, полученное из вывода команды
Get-NetConnectionProfile.Повторно выполните базовую настройку 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.
Для этого в терминале выполните команду, использующую модуль ansible.windows.win_ping:
ansible windows -i <inventory> -m ansible.windows.win_ping
Здесь <inventory> – путь к файлу описания инвентаря с настроенными параметрами подключения.
Если настройка выполнена корректно, команда вернет сообщение следующего вида, подтверждающее успешное выполнение модуля:
Настройка защищенного соединения#
По умолчанию WinRM работает по протоколу HTTP (порт 5985), передавая данные в открытом виде. Для использования в производственной среде настоятельно рекомендуется настроить WinRM по протоколу HTTPS (порт 5986). В этом случае весь трафик между Ansible и узлом Windows будет зашифрован с помощью SSL/TLS.
WinRM использует специальный компонент – слушатель (Listener), который ожидает входящие подключения на определенном порту и обрабатывает их. Для работы по HTTPS необходимо создать HTTPS Listener и указать ему сертификат, который будет использоваться для шифрования соединения.
Настройка с использованием самозаверенного сертификата#
Применение самозаверенного сертификата подходит для тестовых сред или в случаях, когда отсутствует инфраструктура удостоверяющего центра.
Самозаверенный сертификат не подписан доверенным удостоверяющим центром, поэтому Ansible по умолчанию будет его отклонять.
Для игнорирования этой проверки используется параметр cert_validation=ignore.
Для настройки соединения с использованием самозаверенного сертификата выполните следующие действия:
Создайте самозаверенный сертификат, используя команду 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 лет.
Создайте HTTPS Listener и привяжите к нему созданный сертификат, используя команду PowerShell:
New-Item -Path WSMan:\localhost\Listener ` -Transport HTTPS ` -Address * ` -CertificateThumbprint $cert.Thumbprint ` -Force
Эта команда выполняет следующие действия:
создает новый Listener в конфигурации службы WinRM;
указывает, что Listener должен работать по протоколу HTTPS;
указывает, что Listener должен принимать подключения на всех IP-адресах устройства;
привязывает к Listener сертификат по его отпечатку (Thumbprint).
Измените параметры подключения в файле инвентаря Ansible:
ansible_psrp_protocol=https ansible_psrp_port=5986 ansible_psrp_cert_validation=ignore # Обязательно для самозаверенного сертификата
Настройка с использованием сертификата удостоверяющего центра#
Этот вариант рекомендуется для производственных сред с централизованным управлением сертификатами.
В этом случае используется сертификат, выданный внутренним или внешним удостоверяющим центром (CA). Такому сертификату автоматически доверяют все устройства домена или те, у которых установлен корневой сертификат центра сертификации.
Для настройки соединения с использованием сертификата удостоверяющего центра выполните следующие действия в PowerShell:
Установите сертификат сервера (с назначением Server Authentication) в системное хранилище сертификатов
LocalMachine\My.Например, при наличии файла PFX, содержащего в зашифрованном виде приватный ключ и сертификат (и, возможно, промежуточные сертификаты), можно использовать команду PowerShell
Import-PfxCertificateдля переноса его содержимого в хранилищеLocalMachine\My:Import-PfxCertificate -FilePath <path-to-pfx> -CertStoreLocation Cert:\LocalMachine\My -Password (ConvertTo-SecureString -String <pfx-password> -AsPlainText -Force)
Здесь:
<path-to-pfx> – путь к файлу PFX;
<pfx-password> – пароль к файлу PFX.
Получите отпечаток (Thumbprint) установленного сертификата. Это можно сделать через оснастку
certlm.mscили с помощью команды PowerShell:Get-ChildItem Cert:\LocalMachine\My | Select Thumbprint, Subject, NotAfter, FriendlyName
Создайте HTTPS Listener, указав отпечаток установленного сертификата:
New-Item -Path WSMan:\localhost\Listener ` -Transport HTTPS ` -Address * ` -CertificateThumbprint <thumbprint> ` -Force
Здесь <thumbprint> – отпечаток сертификата, установленного в хранилище
LocalMachine\My.В файле инвентаря 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
В выводе должны присутствовать записи следующего вида:
Настройка 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 необходимо настроить аутентификацию по ключу.
Создайте пользователя.
Добавьте публичный ключ в файл
C:\Users\<user>\.ssh\authorized_keys.
Важно
Для учетных записей, входящих в группу локальных администраторов, сервер OpenSSH по умолчанию использует общий файл C:\ProgramData\ssh\administrators_authorized_keys (блок Match Group administrators в файле C:\ProgramData\ssh\sshd_config) – ключ в профиле пользователя использоваться не будет.
Добавьте публичный ключ такой учетной записи в этот файл и установите на него права доступа:
icacls C:\ProgramData\ssh\administrators_authorized_keys /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
Другой вариант – закомментировать блок Match Group administrators в файле C:\ProgramData\ssh\sshd_config и перезапустить службу sshd.
В результате проведенной настройки узел готов к выполнению операций автоматизации под управлением Ansible с использованием протокола WinRM (PSRP) или SSH.