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
Включение и базовая настройка 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.
Для этого в терминале выполните команду, использующую модуль ping:
ansible windows -m ansible.windows.win_ping
Если настройка выполнена корректно, команда вернет сообщение следующего вида, подтверждающее успешное выполнение модуля:
Настройка защищенного соединения#
По умолчанию WinRM работает по протоколу HTTP (порт 5985), передавая данные в открытом виде. Для использования в производственной среде настоятельно рекомендуется настроить WinRM по протоколу HTTPS (порт 5986). В этом случае весь трафик между Ansible и узлом Windows будет зашифрован с помощью SSL/TLS.
WinRM использует специальный компонент, называемый Listener (слушатель). 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реестра 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.
Получите отпечаток (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.
В результате проведенной настройки узел готов к выполнению операций автоматизации под управлением Ansible с использованием протокола WinRM (PSRP) или SSH.