Ansible и Docker: автоматизация развертывания контейнеров
Запуск контейнеров через docker run по SSH хорошо подходит для небольших задач, когда серверов немного и все можно настроить вручную. Но по мере роста инфраструктуры такой подход начинает создавать проблемы: приходится повторять одни и те же действия на разных машинах, следить за отличиями в настройках и тратить больше времени на исправление ошибок или возврат изменений.
Разбираем сценарии автоматизации (playbook): настроим установку Docker, запустим приложение из нескольких контейнеров и подключим процесс непрерывной интеграции и доставки (Continuous Integration и Continuous Delivery, CI/CD) через GitLab.

- Зачем управлять Docker через Ansible
- Подготовка: установка Docker через Ansible
- Модули community.docker: полный обзор
- Docker_container: управление контейнерами на практике
- Развертывание (деплой) приложений: docker_compose_v2
- Работа с образами и приватным registry
- Интеграция с GitLab CI/CD
- Ansible, Docker и Kubernetes: где граница
- Как развернуть инфраструктуру для Ansible и Docker в Cloud.ru
- Частые ошибки и их решение
Зачем управлять Docker через Ansible
Ansible делает управление Docker воспроизводимым: контейнеры, образы, сети, тома и compose-стеки описываются в коде и приводятся к нужному состоянию автоматически. При повторном запуске playbook Ansible проверяет текущую конфигурацию и меняет только то, что отличается от заданных параметров.
Это отличается от ручного запуска команд docker run, которые подходят для быстрых операций, но плохо масштабируются при работе с большим количеством серверов и контейнеров. Чем больше объектов в инфраструктуре, тем сложнее поддерживать их вручную и тем выше ценность автоматизации.
Доля разработчиков, которые используют Docker, согласно опросу Stack Overflow Developer Survey 2024Docker при этом стал почти отраслевым стандартом. По данным опроса Stack Overflow Developer Survey 2024, его используют 59% профессиональных разработчиков — это самый популярный инструмент в категории контейнеризации.
Согласно опросу Stack Overflow Developer Survey 2025, использование Docker выросло еще на 17% за 2024-2025 годы — крупнейший годовой прирост среди технологий опроса (отчасти из-за пересмотра категорий).
Чем больше контейнеров в контуре, тем дороже ручное управление и очевиднее потребность в автоматизации.
Когда это нужно
Автоматизировать Docker через Ansible стоит в трех случаях.
Нужно развернуть одинаковые контейнеры на десятках серверов. Один playbook приводит все хосты к единому состоянию и избавляет от ручной настройки.
Требуется воспроизводимая инфраструктура как код (Infrastructure as Code, IaC). Описания контейнеров и настроек хранятся в Git, поэтому окружение можно схожим образом развернуть на разных серверах.
Нужно встроить Docker в существующие процессы автоматизации. Если инфраструктура уже управляется через Ansible, контейнеры можно добавить в тот же playbook и связать с CI/CD для автоматического развертывания изменений.
Архитектура работы Docker через AnsibleПодготовка: установка Docker через Ansible
Перед началом работы нужно подготовить целевые хосты: установить Docker и все необходимые зависимости. Вместо ручной настройки каждого сервера можно использовать Ansible — playbook выполнит установку, настроит Docker и приведет все машины к одинаковому состоянию.

Установка коллекции community.docker
Коллекция community.docker расширяет спецвозможности Ansible и добавляет инструменты, при помощи которых можно управлять Docker. Установите ее через ansible-galaxy:
Для работы Docker-модулей установите Docker SDK for Python на машине, где Ansible выполняет эти задачи:
Чтобы сохранить воспроизводимость окружения, зафиксируйте версию коллекции в requirements.yml:
Ansible сможет использовать модули community.docker в playbook для управления контейнерной инфраструктурой.
Playbook установки Docker на целевой хост
Перед тем как запускать контейнеры, нужно подготовить сервер. Подготовительный playbook добавляет репозиторий Docker, устанавливает необходимые пакеты, запускает службу и открывает пользователю доступ к Docker через группу docker. Ниже разберем пример для Ubuntu:
Модули community.docker: полный обзор
Коллекция покрывает практически все, что связано с Docker, — от запуска контейнеров до управления сетями и авторизации в registry. Разбираем ключевые модули.
Модуль | Назначение |
docker_container | Создание, запуск, остановка и управление контейнерами (основной модуль) |
docker_image | Сборка, загрузка и удаление образов |
docker_compose_v2 | Управление Compose-стеками (актуальная замена docker_compose) |
docker_network | Создание и управление сетями Docker |
docker_volume | Управление томами для хранения данных |
docker_login | Авторизация в Docker Hub или приватном registry |
docker_container_info | Получение информации о контейнере (аналог docker inspect) |
docker_host_info | Информация о Docker-демоне: контейнеры, образы, сети |
Docker_container: управление контейнерами на практике
Модуль docker_container покрывает полный жизненный цикл контейнера: создает, запускает, останавливает, перезапускает и удаляет. А через параметры модуля задаются порты и тома, переменные окружения, лимиты ресурсов и проверки состояния.

Пример: запуск контейнера
Запуск контейнераPlaybook ниже разворачивает контейнер Nginx с пробросом порта, переменной окружения и политикой перезапуска:
Параметр state задает итоговое состояние контейнера после выполнения задачи.
К примеру, при значении started Ansible проверяет наличие контейнера и запускает его, если он еще не работает, present создает контейнер без запуска, stopped переводит его в остановленное состояние, а absent удаляет контейнер.
Идемпотентность и пересоздание
Идемпотентность в Ansible означает, что повторный запуск одного и того же playbook приводит инфраструктуру к заданному состоянию, а не выполняет одни и те же действия заново. Например, если контейнер уже запущен с нужным образом, портами и настройками, Ansible проверит текущее состояние и не изменит его, если параметры уже соответствуют описанию.
Некоторые параметры контейнера Docker нельзя изменить без пересоздания. В таких случаях модуль docker_container удаляет старый контейнер и создает новый (destroy + create). Для сервисов, которые не хранят важные данные внутри контейнера (stateless) это безопасно. Но если информация находится внутри контейнера или в анонимных томах, пересоздание может привести к ее потере.
данные в именованных томах сохраняются даже при пересоздании контейнера;
данные в анонимных томах могут быть потеряны, если не указать опцию keep_volumes: true.
Чтобы Ansible не пересоздавал контейнер без необходимости, указывайте в playbook настройки и контролируйте, какие изменения стоит учитывать. Для этого используют comparisons (сравнение параметров) — настройку, которая задает правила проверки состояния контейнера.
Развертывание (деплой) приложений: docker_compose_v2
Модуль docker_container подходит для запуска отдельных контейнеров. Но большинство реальных приложений состоит из нескольких связанных компонентов: например, веб-сервера, базы данных и очередей сообщений. Чтобы управлять такой связкой как единым проектом, в Ansible используют модуль docker_compose_v2.
Docker ComposeМодуль работает с Docker Compose v2 — современным Go-плагином для Docker CLI. Он взаимодействует с установленным плагином docker compose, поэтому использует тот же подход, что и запуск Compose-команд в терминале.
Старый модуль docker_compose удален из community.docker начиная с версии 4.0.0, так как он использовал Docker Compose v1, который прекратил поддержку в июле 2022 года. Используйте docker_compose_v2 — он работает с современным Go-плагином Docker Compose, интегрированным в Docker CLI как подкоманда docker compose.
Пример: развертывание сompose-стека
Разберем деплой на примере — развернем Matrix-сервер. Playbook копирует docker-compose.yml на хост и поднимает стек:
Здесь project_src указывает каталог с файлом docker-compose.yml, state: present гарантирует, что стек запущен и приведен к описанному состоянию, а build управляет сборкой собственных образов приложения. Параметр pull: missing позволяет загрузить образы, которых нет на хосте.
Работа с образами и приватным registry
В рабочей среде (production) образы хранят в закрытых реестрах (private registry), там проще контролировать доступ и версии.
Сборка и публикация образа
Модуль community.docker.docker_image позволяет собрать образ из Dockerfile, назначить ему тег и отправить результат в реестр образов:
Параметр source: build указывает, что образ надо собрать заново. В build.path задается папка, где лежит Dockerfile и все необходимые данные для сборки. Когда образ создан, push: true отправляет его в реестр.
Безопасная авторизация в registry
Перед отправкой образа в registry нужно пройти авторизацию с помощью модуля community.docker.docker_login. Учетные данные нельзя выводить в логи Ansible, поэтому для такой задачи используют no_log: true.
Параметр no_log: true скрывает чувствительные данные в выводе выполнения playbook.
Значения registry_user и registry_password храните в Ansible Vault или передавайте через переменные CI/CD, а не прописывайте напрямую в коде.
Интеграция с GitLab CI/CD
Связка GitLab → Ansible → Docker позволяет автоматизировать сборку и развертывание приложений. Такой CI/CD-конвейер (pipeline) собирает образы, запускает проверки и обновляет инфраструктуру через Ansible. Разбираем, как настроить такой процесс.
Архитектура pipeline
Разработчик отправляет код, GitLab CI собирает образ, публикует его в registry, а затем запускает Ansible-playbook, который разворачивает свежий контейнер на целевом сервере.
Примерно так выглядит архитектура pipelineПример .gitlab-ci.yml с вызовом Ansible
Конфигурация описывает три этапа: сборку образа, его публикацию и развертывание. На последнем этапе GitLab Runner запускает Ansible. Секреты — учетные данные реестра и SSH-ключи — хранятся в переменных GitLab CI/CD, а не в репозитории.
Тег образа формируется из $CI_COMMIT_SHORT_SHA, что позволяет однозначно идентифицировать сборку по коммиту. Для дополнительного удобства рекомендуется также использовать семантическое версионирование (SemVer) с помощью тегов Git или переменной $CI_COMMIT_TAG для релизных версий.
Ansible, Docker и Kubernetes: где граница
Ansible хорошо подходит для автоматизации Docker-хостов: установки окружения, запуска контейнеров и настройки инфраструктуры. Но он не является оркестратором и не решает задачи управления большим количеством динамичных сервисов. В таких сценариях используют Kubernetes.
Когда Docker-хостов достаточно
Если инфраструктура небольшая, а приложения состоят из stateless-сервисов, связки Ansible и Docker будет достаточно. Она проще в настройке, не требует отдельного оркестратора и позволяет управлять контейнерами через знакомые playbook.
Когда нужен Kubernetes
Kubernetes используют, когда появляются требования к автоматическому масштабированию, перезапуску отказавших сервисов, балансировке нагрузки и управлению сложными распределенными приложениями.
При этом Ansible не заменяет Kubernetes. Его используют вместе с Kubernetes для подготовки серверов, настройки окружения и применения объектов кластера через коллекцию kubernetes.core:
Критерий | Ansible + docker_container | Kubernetes |
Масштаб | Несколько серверов | От нескольких узлов до тысяч |
Масштабирование | Ручное или через playbook | Автоматическое |
Самовосстановление | Нет | Да |
Сети | Простые | Сложные, service mesh |
Порог входа | Низкий | Высокий |
Роль Ansible | Provisioning хостов и управление контейнерами через модули (без оркестрации) | Provisioning (подготовка) узлов и деплой манифестов |
Как развернуть инфраструктуру для Ansible и Docker в Cloud.ru
Ansible автоматизирует настройку серверов и запуск задач, но сначала нужна сама инфраструктура для выполнения этих сценариев. Cloud.ru предоставляет готовую инфраструктуру под перечисленные выше сценарии.
Evolution Compute — Docker-хосты для Ansible
Сценарии использования Evolution Compute
Evolution Compute предоставляет виртуальные машины под целевые хосты для Ansible-плейбуков. Создаются за минуты, доступ по SSH. Их удобно заводить как managed-серверы под контейнеры.
Evolution Artifact Registry — приватный registry для образов
Архитектура сервиса Evolution Artifact RegistryDocker-образы можно хранить в приватном репозитории вместо публикации в Docker Hub. Evolution Artifact Registry позволяет организовать хранение образов внутри инфраструктуры Cloud.ru и использовать их в процессах сборки и развертывания через CI/CD и Ansible.
Например, команда может создать Docker-хосты в Evolution Compute, добавить их в inventory Ansible, собрать образы и разместить их в Evolution Artifact Registry. Затем playbook авторизуется в registry через docker_login с параметром no_log: true, чтобы учетные данные не попадали в логи.
Evolution Managed Kubernetes — для масштаба
Что можно делать с помощью сервиса облачного сервиса Evolution Managed KubernetesКогда инфраструктура становится сложнее, используют Evolution Managed Kubernetes. Сервис предоставляет управляемый Kubernetes-кластер, а Ansible может применяться для подготовки окружения и работы с объектами кластера через Kubernetes-модули.
Типовая архитектура на Cloud.ru
Компонент | Сервис Cloud.ru | Роль в pipeline |
Управляющий хост (Ansible) | Evolution Compute | Запускает playbook |
Целевые Docker-хосты | Evolution Compute | Принимают контейнеры |
Хранилище образов | Evolution Artifact Registry | Приватный registry |
Оркестрация (опционально) | Evolution Managed Kubernetes | Масштаб и самовосстановление (self-healing) |
CI/CD-раннер | Evolution Compute или Evolution Container Apps | Сборка и деплой |
Частые ошибки и их решение
При автоматизации Docker через Ansible чаще всего возникают типовые проблемы.
Не установлен Docker SDK for Python. Модули коллекции community.docker не могут работать без библиотеки. Решение — установить SDK в подготовительном playbook:
Пароли registry попадают в логи. Вывод данных авторизации может привести к раскрытию секретов. Решение — использовать no_log: true для задач с учетными данными.
Неожиданное пересоздание контейнера. При изменении некоторых параметров Ansible может удалить контейнер и создать его заново. Решение — явно указывать настройки контейнера и использовать comparisons для контроля проверки изменений.
Используется устаревший docker_compose. Для новых проектов рекомендуется применять docker_compose_v2, который работает с современным Docker Compose.
Несовместимая версия Ansible. Некоторые версии community.docker требуют определенную версию ansible-core. Перед установкой коллекции проверьте совместимость компонентов.
Часто задаваемые вопросы
Как установить Docker через Ansible?
Через playbook: нужно добавить репозиторий Docker, установить необходимые пакеты и запустить службу. Для управления контейнерами также установить коллекцию community.docker и Docker SDK for Python на хостах, где выполняются задачи.
Какой модуль использовать для контейнеров?
Используйте docker_container из коллекции community.docker. Он позволяет создавать, запускать, останавливать, перезапускать и удалять контейнеры.
Docker_compose или docker_compose_v2?
Используйте docker_compose_v2: он работает с актуальной версией Docker Compose. Старый модуль docker_compose для новых проектов применять не рекомендуется.
Можно ли управлять Kubernetes через Ansible?
Да, через коллекцию kubernetes.core. Ansible помогает подготовить инфраструктуру и применять манифесты в кластер. Для production-среды удобно использовать управляемый Kubernetes, например, Evolution Managed Kubernetes, где обслуживание управляющих компонентов берет на себя платформа.
