Когда количество серверов перевалило за сотню, а каждое обновление или проверка службы превращались в многочасовую рутину по SSH/RDP, становится понятно: ручные правки конфигов и bash-скрипты уже не спасают. Нужен инструмент, который возьмёт на себя повторяемые операции, не требуя при этом перелопачивания всей инфраструктуры. Ansible — именно такой порог входа в мир Infrastructure as Code. Он одинаково легко управляет и Linux, и Windows, используя нативные протоколы без агентов, а первые плейбуки вы запустите уже через час после установки. В этой статье я проведу вас по пути, который сам прошёл от ручного администрирования до автоматизации типовых задач: настройка соединения, инвентаря, написание первых плейбуков и типовые грабли, на которых чаще всего спотыкаются новички.
Почему Ansible — лучший выбор для первого шага в автоматизации
Для системного администратора, привыкшего набирать команды в терминале, Ansible — естественный переход от единичных скриптов к системной автоматизации. Он не требует разворачивать отдельный управляющий сервер с базой данных, как Puppet или Chef, не заставляет устанавливать агентов на целевые машины и использует понятный YAML, который читается почти как техническое задание. Более того, Ansible отлично ложится на гибридные среды, где локальное железо соседствует с облачными инстансами — единый инвентарь и единый подход к конфигурации.
Ключевые преимущества Ansible для сисадмина:
- Без агентов: на управляемых машинах нужны только штатные протоколы — SSH для Linux и WinRM для Windows. Никаких демонов, обновлений агента, конфликтов версий.
- Гибридная поддержка: единый язык описания задач для обеих ОС. Windows-службы, реестр, пакеты — всё это управляется теми же плейбуками, что и nginx на Ubuntu.
- Простота входа: YAML с отступами — не нужно быть программистом, чтобы понять, что делает плейбук. Даже коллеги, далёкие от кодинга, через неделю начинают предлагать правки.
- Версионирование: плейбуки и инвентарь лежат в Git, как любой код. Откатить изменения, провести code review или запустить CI/CD пайплайн при пуше — привычный workflow разработчика, применённый к инфраструктуре.
- Модульность: тысячи готовых модулей под любую задачу — от управления пакетами и файлами до настройки сетевых устройств или DNS-записей. Не нужно изобретать велосипед, достаточно найти подходящий модуль в документации.
Важно понимать разницу с Terraform: последний заточен под provisioning — создание виртуалок, сетей, дисков. Ansible же конфигурирует то, что уже создано: ставит софт, правит конфиги, управляет службами. В реальной практике они часто идут рука об руку — Terraform поднял инстансы, Ansible привёл их в целевое состояние, а потом ещё и следит за дрифтом конфигурации.
Предварительная настройка: Control Machine и требования
Управляющая машина в терминологии Ansible — Control Node — это тот самый центр, откуда вы будете запускать плейбуки. Важно: это должен быть Linux (нативный или WSL), на Windows без дополнительных танцев с бубном Ansible не заведётся.
Требования к Control Machine:
| Компонент | Требование | Примечание |
|---|---|---|
| ОС | Linux (Ubuntu, Debian, CentOS) | Ansible не работает нативно на Windows — только через WSL. |
| Python | Версия 3.8+ | Практически везде уже установлен, но лучше явно проверить: python3 --version. |
| pip | Пакетный менеджер Python | Необходим для установки Ansible и дополнительных модулей. Обычно ставится вместе с python3-venv или отдельно. |
| Ansible | ansible (через pip) |
Самый надёжный способ получить свежую версию. Пакетные менеджеры дистрибутивов часто тащат устаревшие сборки. |
| pywinrm | Модуль для WinRM | Обязателен для работы с Windows: pip install pywinrm[credssp]. Без него Ansible просто не поймёт протокол WinRM. |
Установка Ansible на Linux (Control Machine)
Если у вас Ubuntu/Debian, проще всего поставить через pip в виртуальном окружении, чтобы не засорять систему. Но для первого знакомства можно и глобально. Я предпочитаю такой подход:
sudo apt update
sudo apt install python3-pip -y
pip3 install --user ansible
export PATH=$PATH:~/.local/bin
ansible --version
После выполнения последней команды вы увидите версию Ansible, путь к конфигу и информацию о Python. Если видите что-то вроде «ansible 2.9» — лучше обновить: современная практика требует Ansible Core 2.12+.
Установка Ansible на Windows (через WSL)
Да, Ansible на Windows без WSL — боль. Но это не приговор: WSL2 работает вполне сносно, а накладные расходы на виртуализацию для Control Node некритичны. Главное — не пытайтесь запускать Ansible из PowerShell или cmd, только из терминала установленного дистрибутива.
Шаг 1: Включение WSL
Запустите PowerShell от имени администратора и выполните:
wsl --install
Или, если нужна конкретная версия WSL 2:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
После перезагрузки установите ядро WSL 2 с официального сайта Microsoft и задайте WSL 2 версией по умолчанию: wsl --set-default-version 2.
Шаг 2: Установка Linux-дистрибутива
В Microsoft Store найдите Ubuntu 22.04 LTS (или Debian — кому что ближе), установите. При первом запуске создайте пользователя и пароль — это будут учётные данные внутри WSL.
Шаг 3: Обновление дистрибутива
Первым делом внутри WSL-терминала обновляем индексы и пакеты:
sudo apt update && sudo apt upgrade -y
Шаг 4: Установка Ansible
Теперь как на обычном Linux:
sudo apt install python3-pip -y
pip3 install --user ansible
export PATH=$PATH:~/.local/bin
ansible --version
На этом машина управления готова, и можно двигаться к самому интересному — настройке соединения с целевыми серверами.
Настройка подключения к Windows: WinRM и скрипт ConfigureRemotingForAnsible
Сюда стоит заглянуть сразу после первых успешных подключений по SSH к Linux-серверам, потому что Windows традиционно требует чуть больше телодвижений. WinRM (Windows Remote Management) — это штатный SOAP-протокол удалённого управления, но по умолчанию он выключен, и без предварительной подготовки плейбуки будут падать с непонятными ошибками.
Почему WinRM важен?
- Это единственный стандартный способ, через который Ansible может выполнять модули на Windows.
- Без включённого WinRM любое обращение к Windows-хосту заканчивается таймаутом или отказом в соединении.
- По умолчанию WinRM слушает HTTP (TCP 5985), но в production я рекомендую сразу настраивать HTTPS (TCP 5986) с самоподписанным сертификатом — так трафик шифруется, и можно безопасно передавать учётные данные.
Шаг 1: Включение WinRM на целевом Windows-сервере
Самый простой путь — взять готовый скрипт из репозитория Ansible. Именно его я и использую при разворачивании тестовых стендов:
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1" -OutFile "$env:TEMP\ConfigureRemotingForAnsible.ps1"
powershell -ExecutionPolicy Bypass -File "$env:TEMP\ConfigureRemotingForAnsible.ps1"
Скрипт делает всё необходимое:
- Включает WinRM и задаёт автоматический запуск службы.
- Создаёт правило в Windows Firewall для порта 5986/TCP (HTTPS).
- Генерирует самоподписанный сертификат для прослушивания HTTPS.
- Настраивает CredSSP, если требуется двухфакторная аутентификация для некоторых модулей.
Запускать его нужно обязательно в PowerShell с правами администратора. Если серверов несколько — заверните в цикл или используйте Ansible позже для массового включения WinRM (рекурсия, да, но после первой настройки вы сможете управлять WinRM через Ansible).
Шаг 2: Установка pywinrm на Control Machine
Эта зависимость не входит в основной пакет Ansible, поэтому её часто забывают. Без неё Ansible не сможет взаимодействовать с WinRM. Установка проста:
pip install pywinrm[credssp]
Если у вас виртуальное окружение — не забудьте его активировать. В production обязательно фиксируйте версию в requirements.txt, чтобы избежать сюрпризов.
Шаг 3: Настройка инвентаря для Windows
В инвентаре для каждого Windows-хоста нужно явно указать тип подключения и (на первое время) отключить проверку сертификата. Позже, когда перейдёте к работе с реальным центром сертификации, валидацию можно будет включить.
Пример YAML-инвентаря:
all:
hosts:
win-server01:
ansible_host: 192.168.1.10
ansible_user: Admin
ansible_password: SuperSecret123
ansible_connection: winrm
ansible_port: 5986
ansible_winrm_server_cert_validation: ignore
Для HTTP (если всё же оставили 5985) порт меняется, но я настоятельно советую сразу переходить на 5986.
Шаг 4: Проверка подключения
Модуль win_ping — простейший тест живучести:
ansible win-server01 -i inventory.yml -m win_ping
Если всё хорошо, получите JSON с «SUCCESS». Если нет — читаем диагностику: чаще всего проблема в недоступности WinRM из-за брандмауэра или неправильных учётных данных.
Настройка подключения к Linux: SSH и базовые требования
Здесь всё намного привычнее: Ansible стучится по SSH с ключами или паролем и выполняет модули через Python. Главное — убедиться, что на целевых машинах есть Python подходящей версии.
Требования к Linux-целевым машинам:
| Компонент | Требование |
|---|---|
| SSH | Установлен и запущен сервер OpenSSH. |
| Python | Версия 2.7+ или 3.x. На практике везде должен стоять Python 3.6+, иначе некоторые модули будут ругаться. |
| Права | Пользователь, под которым происходит подключение, должен иметь возможность выполнять нужные команды (обычно sudo). |
Проверка подключения к Linux
ansible all -i inventory.yml -m ping
Модуль ping для Linux проверяет именно работоспособность SSH и наличие Python. Ответ — «pong».
Инвентарь для Linux
Минимальный вариант:
all:
hosts:
web01:
ansible_host: 10.0.0.5
ansible_user: root
db01:
ansible_host: 10.0.0.6
ansible_user: admin
Для Linux не нужно указывать ansible_connection, потому что по умолчанию используется SSH. Однако если хотите управлять через WinRM с Linux-машины на Windows (что бессмысленно), тогда и надо переопределять.
Создание инвентаря: группировка и параметры хостов
Инвентарь — это сердце вашей автоматизации. Именно в нём вы описываете, к каким узлам будут применяться плейбуки, какими учётными данными пользоваться и в какие группы эти узлы объединены. Я предпочитаю YAML за читаемость и возможность хранить группы в отдельных файлах для больших сред.
Структура инвентаря
Формат INI удобен для быстрых черновиков, но для версионирования и сложных конфигураций YAML — более гибкий:
# inventory.ini
[webservers]
web01 ansible_host=10.0.0.5
web02 ansible_host=10.0.0.6
[dbservers]
db01 ansible_host=10.0.1.5
Тот же инвентарь в YAML выглядит аккуратнее и легче расширяется:
all:
children:
webservers:
hosts:
web01:
ansible_host: 10.0.0.5
web02:
ansible_host: 10.0.0.6
dbservers:
hosts:
db01:
ansible_host: 10.0.1.5
Группировка хостов
Группы позволяют запускать задачи не на отдельных серверах, а на логическом слое. Типичный пример из жизни: обновить ядро на всех серверах роли «app», перезагрузить только те, что помечены как «staging», и деплоить новую версию только на «canary».
# Запустить плейбук только для группы webservers
ansible-playbook -i inventory.yml site.yml --limit webservers
Переопределение параметров в команде
Иногда нужно на лету изменить инвентарь или указать конкретный хост без правки файла. Тогда спасают аргументы командной строки:
# Задать конкретный хост
ansible all -i 'win-server01,' -m win_ping
# Указать другой файл инвентаря
ansible-playbook -i /path/to/inventory.yml playbook.yml
Первые плейбуки: автоматизация типовых задач
Плейбук — это последовательность задач, описанная в YAML-файле. Именно здесь вы говорите Ansible, что нужно сделать на целевых машинах. В отличие от ad-hoc команд, плейбуки идемпотентны: повторный запуск не должен ломать систему, а должен приводить к заранее известному состоянию.
Структура плейбука
---
- name: Название плейбука
hosts: целевая_группа
tasks:
- name: Описание задачи
module_name:
параметр1: значение1
параметр2: значение2
Здесь hosts может быть группой из инвентаря, «all» или шаблоном имени. Модуль выполняет конкретную операцию, а параметры определяют её поведение.
Типовые задачи для Linux
| Задача | Модуль | Пример |
|---|---|---|
| Обновить кэш пакетов | apt / yum | apt: update_cache=yes |
| Установить пакет | apt / yum | apt: name=nginx state=present |
| Управление службой | service | service: name=nginx state=started |
| Настройка конфигурационного файла | copy / template | copy: src=nginx.conf dest=/etc/nginx/nginx.conf |
| Проверка доступности | ping | ping: |
Типовые задачи для Windows
| Задача | Модуль | Пример |
|---|---|---|
| Проверка связи | win_ping | win_ping: |
| Управление службой | win_service | win_service: name=Spooler state=stopped |
| Установка MSI/EXE | win_package | win_package: path=C:\installers\setup.exe state=installed |
| Настройка реестра | win_regset | win_regset: key=HKLM\Software\MyApp\Settings value=1 |
| Получение IP-адреса | raw + ipconfig | raw: ipconfig |
Пример плейбука для Windows
Допустим, после развёртывания сервера нужно сразу остановить ненужную службу и добавить ключ в реестр. Плейбук выглядит так:
---
- name: Первоначальная настройка Windows Server
hosts: win-servers
tasks:
- name: Остановить службу Spooler
win_service:
name: Spooler
state: stopped
- name: Установить параметр в реестре
win_regset:
key: HKLM\Software\MyCompany\Agent
value: 1
data: enabled
Запуск:
ansible-playbook -i inventory.yml win-setup.yml
Чек-лист: первые шаги с Ansible
Пройдите по пунктам, чтобы не упустить ничего важного:
- [ ] Control Machine развёрнута (Linux или WSL).
- [ ] Python и pip установлены на Control Machine.
- [ ] Ansible установлен (проверено через
ansible --version). - [ ] Для Windows: модуль
pywinrm[credssp]установлен. - [ ] WinRM включён на целевых Windows-серверах (скрипт
ConfigureRemotingForAnsible.ps1отработал). - [ ] Инвентарь создан, для Windows явно указан
ansible_connection=winrm. - [ ] Подключение проверено:
win_pingдля Windows,pingдля Linux. - [ ] Написан первый плейбук с парой простых задач.
- [ ] Плейбук успешно выполнен.
Типовые ошибки и как их избежать
Каждая из этих ошибок — кусок моего времени, вырванный ночными дебагами. Хорошо, что их можно обойти, зная подводные камни.
Ошибка 1: Ansible пытается подключиться к Windows через SSH
Причина: в инвентаре не указан ansible_connection=winrm.
Решение: добавьте для всех Windows-хостов строку ansible_connection: winrm или, если используете INI, ansible_connection=winrm. Без этого Ansible будет стучаться по 22 порту и упадёт с таймаутом.
Ошибка 2: Проверка сертификата WinRM не проходит
Причина: самоподписанный сертификат не может быть проверен стандартными средствами.
Решение: временно добавьте ansible_winrm_server_cert_validation: ignore. В перспективе настройте внутренний центр сертификации и включите валидацию — иначе злоумышленник может подменить сервер.
Ошибка 3: Python не найден на Linux-целевой машине
Причина: отсутствует Python или версия слишком старая для модулей Ansible (например, Python 2.6 на CentOS 6).
Решение: установите Python 3.x через пакетный менеджер ОС. Если на древней системе это невозможно, рассмотрите использование модуля raw для предварительной установки питона.
Ошибка 4: WinRM не включён на Windows
Причина: пропустили запуск ConfigureRemotingForAnsible.ps1.
Решение: запустите скрипт в PowerShell от администратора. Лучше сразу добавить его в ваш образ виртуалки или скрипт развёртывания, чтобы новые серверы сразу были готовы к управлению.
Ошибка 5: Неправильный порт WinRM
Причина: в инвентаре указан порт 5985 (HTTP), а сервер слушает только HTTPS на 5986.
Решение: проверьте настройки WinRM на целевом хосте: winrm enumerate winrm/config/listener. Если используется самоподписанный сертификат с портом 5986, скорректируйте инвентарь и не забудьте добавить ansible_winrm_server_cert_validation: ignore.
FAQ: частые вопросы по Ansible для Windows и Linux
Q: Можно ли запустить Ansible на Windows без WSL?
A: Нет. Нативно Ansible работает только на POSIX-системах. Все варианты с Cygwin или Docker внутри Windows — это костыли, которые создадут больше проблем, чем решат. WSL2 — официальный и единственный поддерживаемый способ.
Q: Почему WinRM не включён по умолчанию?
A: Из соображений безопасности. Открытый WinRM без дополнительной настройки — потенциальная дыра. Поэтому его включают осознанно, с минимальными привилегиями для управляющих аккаунтов.
Q: Как проверить, что Ansible правильно подключился к хосту?
A: Самый быстрый способ — ad-hoc команда с модулем проверки: ansible all -i inventory.yml -m ping (Linux) или ansible windows -i inventory.yml -m win_ping (Windows).
Q: Можно ли использовать Ansible для управления сетевыми устройствами?
A: Да, существуют специализированные модули (ios, junos, nxos и т.п.). Но это отдельная история, требующая настройки учётных данных и подключения через CLI/API. Для старта лучше сосредоточиться на серверах.
Q: Как обновить Ansible до последней версии?
A: pip install --upgrade ansible. Если использовали виртуальное окружение — сначала активируйте его.
Q: Что делать, если плейбук не выполняется на Windows?
A: Проверьте по контрольному списку: включён ли WinRM? Верно ли указан ansible_connection? Соответствует ли порт (5985 или 5986)? Установлен ли pywinrm? И простая проверка связи: Test-WSMan -ComputerName win-server01 с Control Machine не пройдёт, но можно запустить локальный тест на самом Windows-сервере, а между машинами проверить telnet на порт.
Q: Можно ли использовать Ansible для управления облачными ресурсами?
A: Да, есть модули под AWS, Azure, GCP. Но чаще IaC-задачи по созданию ресурсов отдают Terraform, а Ansible используют для конфигурации уже запущенных инстансов. Впрочем, один Ansible тоже может развернуть инфраструктуру, хотя это не всегда идемпотентно.
Q: Как хранить плейбуки и инвентарь в Git?
A: Инициализируйте репозиторий, добавьте файлы, закоммитьте. Важно: не храните секреты (пароли, ключи) в открытом виде. Используйте Ansible Vault для шифрования переменных или внешние vault-решения (HashiCorp Vault).
Заключение: от ручного администрирования к автоматизации
Первые шаги с Ansible — это не просто установка утилиты. Это смена мышления: вместо списка «зайти на сервер и сделать» вы начинаете описывать желаемое состояние системы в коде, который можно отревьюить, сохранить в истории и воспроизвести в любой момент. Вы уже разобрались с базовыми вещами:
- развернули Control Node (Linux или WSL);
- научились настраивать WinRM для Windows и проверять SSH для Linux;
- структурировали хосты в инвентаре с группами;
- написали и запустили первые плейбуки — и они выполнили реальную работу вместо вас;
- узнали типичные ловушки и теперь сэкономите часы на их обходе.
Впереди — более сложные сценарии: роли для переиспользования кода, условия, циклы, шаблоны jinja2, интеграция с CI/CD и динамические инвентари из облачных провайдеров. Но даже сейчас вы уже автоматизировали задачи, которые ещё недавно заставляли кликать мышкой или набирать однотипные команды. Добро пожаловать в мир Infrastructure as Code, где конфигурация управляется так же строго, как программный продукт.
