Ansible становится одним из наиболее популярных, если не самым популярным, инструментом управления конфигурацией сегодня. Ansible – это удобный (и в большинстве случаев бесплатный) инструмент, который позволяет инженерам DevOps и системным инженерам / администраторам создавать и поддерживать инфраструктуру во всех средах в идемпотентном режиме инфраструктуры-как-кода. Однако настройка его для работы с Windows через WinRM для Ansible может быть сложной задачей.
Как и многие другие компоненты инфраструктуры, Ansible может развертывать и поддерживать состояния конфигурации на хостах Windows. Ansible подключается к этим хостам Windows через WinRM, хотя они экспериментируют с SSH.
При настройке WinRM для Ansible у вас есть несколько вариантов, от простоты настройки до проблем безопасности. Многие выбирают простой подход: базовую аутентификацию с использованием HTTP. Хотя вы откажетесь от дополнительной работы, связанной с сертификатами, никогда не рекомендуется отправлять незашифрованные данные по сети, если это необходимо.
В этой статье вы узнаете, как настроить WinRm для Ansible с использованием аутентификации на основе сертификатов с использованием самоподписанных сертификатов, чтобы Ansible мог с ними общаться.
Настройки, которые вы изучите в этом руководстве, применимы не только к Ansible в качестве клиента. Эта аутентификация на основе сертификатов также может применяться к другим клиентам WinRm, таким как другие хосты Windows.
Предположения
В этой статье будет представлено пошаговое руководство. Если вы намерены следовать представленным здесь шагам для настройки WinRm для Ansible, руководство предполагает следующее:
- У вас уже установлен Ansible на хосте Linux.
- Вы настроили инвентарь Ansible на основе ваших хостов Windows.
- У вас есть Windows Server 2016 или более поздняя версия для управления. Некоторые cmdlet’ы, используемые в этом руководстве, не будут работать с более старыми версиями Windows.
- Хост Windows не является частью домена. Хотя примеры были выполнены на хосте, не присоединенном к домену, эта конфигурация должна также работать на хостах, присоединенных к домену.
- У вас есть доступ к RDP или консоли на хосте Windows, и вы вошли в систему как локальный администратор.
- Вы знакомы с PowerShell. Почти все примеры будут использовать код PowerShell для внесения изменений на хосте Windows.
Каждый раздел будет использовать сниппет кода, который зависит от предыдущего. Некоторые сниппеты будут ссылаться на ранее определенные переменные. Убедитесь, что ваша консоль открыта, когда вы копируете/вставляете этот код, если вы собираетесь следовать ему точно.
Если вам нужен только код без всего объяснения, можете смело загрузить эту публикацию GitHub.
Включение удаленного управления PowerShell для WinRm для Ansible
Хотя на всех серверах Windows Server 2016 и более поздних версий включено удаленное управление PowerShell, всегда полезно подтвердить это.
На управляемом хосте Windows откройте консоль PowerShell от имени администратора и выполните следующий сниппет кода. Этот сниппет кода гарантирует запуск службы WinRm и ее настройку для автоматического запуска при загрузке системы.
Затем убедитесь, что удаленное управление PowerShell включено, сначала проверив, есть ли активные конфигурации сеанса. Если нет, убедитесь, что у него нет доступных прослушивателей. Для Ansible WinRm необходимо иметь как минимум одного прослушивателя. Если хотя бы одно из этих условий не выполняется, выполните Enable-PSRemoting
.

Включение аутентификации на основе сертификатов
По умолчанию WinRM не настроен для аутентификации на основе сертификатов. Для включения этой функции необходимо настроить WSMan, как показано ниже.
Создание локальной учетной записи пользователя
Для аутентификации WinRM на основе сертификатов для Ansible необходимо «сопоставить» локальную учетную запись пользователя с сертификатом. Вы можете использовать учетную запись локального администратора для этого, но рекомендуется создать отдельную учетную запись для упрощения управления.
В следующем фрагменте кода создается локальная учетная запись пользователя для WinRm для Ansible с именем ansibletestuser
и паролем p@$$w0rd12
, если она не существует. Чтобы гарантировать ее постоянную активность, срок действия пароля этой учетной записи никогда не будет истекать.
Создание клиентского сертификата
Для работы WinRm для Ansible (безопасно) требуются два сертификата: клиентский и серверный.
Вы можете использовать один и тот же сертификат для клиента и сервера, но у меня возникли проблемы с этим подходом. В документации Ansible и многих других источниках вы найдете инструкции по созданию клиентского сертификата с помощью командлета
New-SelfSignedCert
в PowerShell. Хотя этот метод может сработать, мне не удалось легко заставить его работать.
Для создания клиентского сертификата для WinRM для Ansible необходимо создать закрытый и открытый ключи. Начните с подключения по SSH к хосту Ansible и выполните следующую команду openssl
. Эта команда создает закрытый ключ в файле с именем cert_key.pem и открытый ключ с именем cert.pem. Ключ будет использоваться для аутентификации клиента (1.3.6.1.4.1.311.20.2.3) “связан” с локальной учетной записью пользователя ansibletestuser, созданной ранее.
Шаг ближе к аутентификации WinRM в Ansible!
Импортируйте клиентский сертификат
После создания клиентского сертификата для WinRM для Ansible его необходимо импортировать в два хранилища сертификатов на хосте Windows, чтобы WinRM на Ansible работал. Для этого сначала перенесите открытый ключ cert.pem на хост Windows. В приведенном ниже примере предполагается, что ключ находится в месте C:\cert.pem.
После получения открытого сертификата на хосте Windows импортируйте его в хранилища сертификатов Доверенные корневые центры сертификации и Доверенные лица с помощью команды Import-Certificate
, как показано ниже.
Создайте серверный сертификат
Для использования WinRM в Ansible необходим сертификат, определенный с использованием ключа для аутентификации сервера. Этот сертификат будет храниться в хранилище сертификатов LocalMachine\My на хосте Windows. Создайте самоподписанный сертификат с помощью следующего фрагмента кода.
Создайте прослушиватель WinRm в Ansible
После создания обоих сертификатов, теперь необходимо создать прослушиватель WinRm на хосте Windows. Этот прослушиватель начинает прослушивание на порту 5986 для входящих соединений. После создания этот прослушиватель принимает входящие соединения и пытается зашифровать данные с использованием созданного серверного сертификата.
PowerShell Remoting использует этот прослушиватель WinRM в качестве транспорта после аутентификации.
В приведенном ниже фрагменте кода вы можете увидеть пример проверки наличия существующего прослушивателя HTTPS. Если не найден ни один прослушиватель, использующий созданный серверный сертификат, будет создан новый.
«Привяжите» клиентский сертификат к локальной учетной записи пользователя
Следующий шаг – убедиться, что при подключении Ansible к хосту Windows с использованием серверного сертификата будут выполняться все инструкции от имени локального пользователя. В данном случае все действия, выполняемые WinRm для Ansible, будут использовать локальную учетную запись пользователя ansibletestuser.
Разрешите WinRm для Ansible с учетной записью пользовательского управления учетными записями (UAC)
Если вы используете локальную учетную запись для сопоставления сертификата, вы также должны установить параметр LocalAccountTokenFilterPolicy
равным 1, чтобы гарантировать, что UAC не будет помехой. Параметр LocalAccountTokenFilterPolicy
применяется ко всем локальным учетным записям (не доменным учетным записям) и приводит к ограничению вашего сетевого входа в составе вашего токена. Это предотвратит вход в систему, поскольку Windows не видит его как администратора, а WinRM по умолчанию требует, чтобы пользователь был локальным администратором.
Установив параметр LocalAccountTokenFilterPolicy
, вы указываете Windows не создавать ограниченный токен для сетевых входов с локальной учетной записью и использовать его полный токен.
Откройте порт 5986 в брандмауэре Windows
WinRm по HTTPS использует порт 5986. Если у вас включен брандмауэр Windows, вам необходимо открыть этот порт. Вы можете сделать это, запустив следующий фрагмент кода PowerShell. Этот фрагмент кода слишком щедрый, позволяя использовать его всем компьютерам. Если вы хотите ужесточить это, убедитесь, что вы используете параметр LocalAddress
и указываете IP Ansible.
Добавить локального пользователя в группу администраторов
Вы можете спросить, почему в этом руководстве ранее не был добавлен локальный пользователь в группу администраторов. Причина в том, что по непонятным причинам, когда вы пытаетесь привязать клиентский сертификат к пользователю, учетная запись пользователя не может быть локальным администратором.
Запустите следующий фрагмент кода, чтобы добавить локальную учетную запись пользователя ansibletestuser в группу администраторов.
Заключение
Если вы выполнили все эти шаги, как показано, теперь вы должны иметь возможность выполнять команды Ansible на Windows-хосте. Используйте модуль win_shell для выполнения тестирования. Если этот модуль успешно выполняется, значит, вы успешно настроили WinRM для Ansible с использованием аутентификации на основе сертификатов!