Хотя Ansible известен управлением узлами Linux с помощью SSH, вы знали, что Ansible на Windows работает так же хорошо? Используя Windows Remote Management (WinRM), Ansible на Windows может эффективно управлять всеми вашими узлами Windows тоже!
С помощью Ansible на Windows вы можете выполнять задачи, такие как развертывание патчей, управление серверами Windows, выполнение сценариев PowerShell и многое другое.
В этом учебном пособии вы узнаете, как настроить ваш первый узел Windows для управления с помощью Ansible и увидите, как выполнять команды и сценарии против него.
Предварительные требования
Если вы хотите следовать за учебным пособием, пожалуйста, убедитесь, что у вас есть следующее перед началом:
- Хост контроллера Ansible – В этом учебном пособии будет использоваться Ansible v2.9.18 на машине Ubuntu 18.04.5 LTS с IP-адресом 10.111.4.53. Обратите внимание, что Windows не поддерживается в качестве узла управления, только в качестве управляемого узла.
- Python установлен на вашем хосте контроллера Ansible – В этом учебном пособии будет использоваться Python v2, но v3 должен работать так же хорошо.
- Пакет pip установлен на контроллере Ansible.
- A Windows 2012 R2 or greater computer for Ansible to manage – This tutorial will use two Windows Server 2012 R2 Standard machines as remote nodes with IP addresses of 52.242.251.213 and 10.111.4.106.
- A Windows workstation – This tutorial will perform some basic pre-configuration to the node that Windows will manage with Ansible and will require you to sitting at a Windows workstation.
- На управляемом сервере Windows включено удаленное управление PowerShell
- A user account in the local Administrators group on the Windows computer. This tutorial will use an account called adminuser.
Настройка слушателя WinRM на Windows
Перед тем как Ansible сможет связаться с удаленным узлом Windows, он должен иметь возможность установить с ним соединение. Он делает это с помощью протокола Microsoft WinRM. WinRM – это тот же протокол, который используется удаленным управлением PowerShell для выполнения удаленных команд из PowerShell.
На момент написания этого текста Ansible действительно поддерживает SSH в качестве протокола управления, но это экспериментальная функция на данный момент.
Для того чтобы Ansible мог использовать WinRM для общения с узлом Windows, вы должны настроить WinRM. Для этого Ansible предоставляет сценарий PowerShell, который устанавливает различные параметры WinRM.
Хотя сценарий PowerShell, который предоставляет Red Hat для настройки WinRM, был протестирован и безопасен, вы должны прочитать его и понять, на высоком уровне, что он делает.
Вашей первоочередной задачей будет загрузка конфигурационного сценария и запуск Ansible на узле Windows. Для этого, предполагая, что у вас уже включено удаленное управление PowerShell на целевом компьютере с Windows, и вы находитесь на рабочей станции Windows:
Загрузите сценарий PowerShell ConfigureRemotingForAnsible.ps1 на свой локальный компьютер под управлением Windows. В этом руководстве предполагается, что он сохранен в ~\Downloads.
Запустите сценарий конфигурации на управляемом узле Windows, который будет управляться с помощью Ansible, используя команду Invoke-Command
. Ниже приведена команда для выполнения этой команды на двух демонстрационных машинах руководства, которая запросит пароль для локальной учетной записи adminuser на узлах Windows.
По умолчанию сценарий конфигурации настроит WinRM для базовой аутентификации HTTP. Если вы хотите, чтобы Ansible использовал более безопасное соединение, изучите Как настроить WinRM через HTTPS для Ansible.
Настройка контроллера Ansible на Windows
Теперь, когда узел Windows готов к Ansible, давайте настроим контроллер Ansible, чтобы показать ему, как с ним общаться.
1. Подключитесь к хосту вашего контроллера Ansible по SSH с помощью вашего любимого SSH-клиента.
2. Установите модуль Python pywinrm. Модуль Python pywinrm необходим для того, чтобы Ansible на Windows мог общаться с хостами по протоколу WinRM.
3. Определите удаленные узлы Windows в файле инвентаря Ansible. Инвентарь Ansible – это коллекция удаленных хостов, определенных в файле либо по их имени хоста, либо по IP-адресу. После определения вы можете направлять команды и плейбуки к инвентарям Ansible, как вы скоро увидите.
Файл инвентаря Ansible по умолчанию находится в каталоге /etc/ansible/hosts.
Приведенный ниже образец файла инвентаря создает windows
группу хостов, которая содержит каждый узел Windows. В данном учебном пособии используется группа хостов для облегчения направления команд ко всем узлам Windows (если их несколько) одновременно позже.
4. Затем определите несколько необходимых переменных, которые Ansible будет использовать при подключении к хостам Windows в файле инвентаря как группу windows:vars
.
5. Теперь используйте модуль win_ping Ansible для выполнения простого теста подключения к хостам внутри группы хостов windows
, определенной на шаге #3.
После выполнения вы увидите ниже, что Ansible возвращает зеленый текст с сообщением SUCCESS, указывающим на успешную попытку пинга.

Вывод подтверждает, что хост контроллера Ansible может успешно общаться с удаленным хостом Windows через WinRM.
Выполнение ад-хок команд на хостах Windows
На этом этапе вы готовы к тому, чтобы Ansible начал контролировать ваши узлы Windows. Давайте теперь проверим это, запустив ад-хок команду на узлах Windows для их изменения. Ад-хок команды отлично подходят, когда вам нужно выполнить простую команду на узлах без предварительного создания плейбука.
Давайте продемонстрируем ад-хок команды, установив функцию Windows на узлах Windows, определенных в файле инвентаря в группе хостов windows
. Для этого, предполагая, что вы все еще подключены по SSH к вашему узлу контроллера Ansible:
1. Вместо модуля win_ping на этот раз вызовите модуль win_feature (-m
), передав ему два аргумента (-a
) с указанием имени функции Windows и состояния, которое вы хотите.
При выполнении вышеуказанной команды, если все пройдет успешно, Ansible должен подключиться ко всем узлам в группе хостов windows
и запустить команду win_feature на каждом из них, проверяя и, при необходимости, устанавливая функцию Windows Telnet-Client
.

2. Ansible показывает успешное выполнение, но для уверенности подключитесь к узлам Windows вручную с помощью PowerShell и убедитесь, что функция Telnet Client для Windows теперь установлена. На вашем локальном рабочем месте под управлением Windows запустите Invoke-Command
, чтобы выполнить команду PowerShell Get-WindowsFeature
на каждом компьютере под управлением Windows.
На этом этапе вы можете запускать любой модуль Windows, который вам нравится, как ad-hoc команды!
Создание и запуск плейбуков Ansible на Windows
После того как вы овладели искусством выполнения ад-хок команд на управляемых узлах Windows, вашим следующим заданием будет создание и запуск плейбуков. Плейбук Ansible объединяет команды в одном месте и позволяет вам писать сложную логику для выполнения сложных сценариев автоматизации.
Запуск удаленных команд Windows с использованием модуля win_command
Предполагая, что вы все еще подключены к хосту контроллера Ansible:
1. Создайте папку в своем домашнем каталоге с именем ansible-windows-demo и перейдите в нее. Эта папка будет содержать ваш плейбук.
2. Откройте ваш любимый текстовый редактор и создайте и сохраните файл с именем ansible-windows.yml в ~/ansible-windows-demo каталоге.
Плейбуки Ansible пишутся на YAML.
3. Теперь скопируйте нижеприведенный плейбук в файл ansible-windows.yml, чтобы создать одну задачу. Этот плейбук выполнит команду netstat Windows с использованием модуля win_command Windows Ansible на всех хостах в группе хостов windows
.
Модуль win_command выполняет команды на удаленном хосте Windows. Он не позволяет использовать команды, включающие переменные, такие как специальные символы, разрыв строки, символ больше и т. д.
4. Вызовите плейбук ansible-windows.yml, который выполняет задачу на удаленном хосте, выполнив следующую команду.
Если все прошло успешно, вы увидите вывод, аналогичный приведенному ниже.

Запуск удаленных команд PowerShell с использованием модуля win_shell
Вы создали плейбук для выполнения удаленной команды cmd.exe (netstat
) на управляемых узлах Windows
в предыдущем примере. Давайте теперь немного усложним задачу и выполним команды PowerShell с помощью модуля win_shell.
По умолчанию модуль win_shell запускает PowerShell на хосте Windows
На вашей локальной рабочей станции Windows:
1. Сначала откройте ваш любимый текстовый редактор на локальной рабочей станции с Windows и создайте образец скрипта PowerShell, скопируйте в него следующий код и сохраните как one.ps1. В этом учебном пособии скрипт будет сохранен как ~\one.ps1.
Нижеприведенный код создает пустой текстовый файл с именем test2.txt в каталоге C:\temp.
2. Скопируйте скрипт PowerShell one.ps1 на ваши управляемые узлы Windows, используя предпочтительный метод. В этом учебном пособии предполагается, что вы скопировали скрипт one.ps1 в папку C:\Temp на каждом узле Windows.
3. После того как образец скрипта PowerShell находится на узле (узлах) Windows, подключитесь к вашему хосту контроллера Ansible и снова откройте ваш любимый текстовый редактор. На этот раз создайте и сохраните другой плейбук с именем ansible-windows-shell.yml в том же каталоге ~/ansible-windows-demo.
4. Скопируйте и вставьте следующий плейбук в файл ansible-windows-shell.yml. Этот плейбук выполнит две задачи, чтобы продемонстрировать модуль win_shell. Он вызывает скрипт PowerShell, только что скопированный на шаге #2, и вставляет код PowerShell непосредственно в плейбук, чтобы показать, что скрипт вообще не нужен.
Чтобы передать несколько строк кода PowerShell в модуль win_shell, используйте символ
|
канала.
5. Теперь вызовите второй плейбук ansible-windows-shell.yml, который выполняется на удаленном хосте, но с использованием PowerShell.

6. Если необходимо, на вашем локальном рабочем месте с Windows проверьте, выполнился ли плейбук существующий сценарий и код PowerShell в плейбуке.
Если плейбук Ansible выполнился успешно, PowerShell должен вернуть два утверждения True
, указывающих на то, что файлы теперь существуют.
Заключение
В этом учебном пособии вы узнали, как настроить свой первый управляемый узел Windows в Ansible. Несмотря на то, что Ansible традиционно был известен как инструмент для Linux, его легко можно использовать и для Windows!
Какие плейбуки и модули Windows Ansible вы собираетесь использовать для управления Windows?