yandex
Калькулятор ценEvolution Free TierТарифыАкцииДокументацияО насПартнерство с Cloud.ruБезопасностьТехническая поддержкаИнвесторамОбучение и сертификацияМероприятияБлогКарьера в Cloud.ruКейсыEvolutionAdvancedEvolution StackОблако VMwareВ чем отличия платформ?ВойтиЗарегистрироватьсяГига-помощникРешенияРазработка и тестирование в облакеИнфраструктура для 1С в облакеМиграция IT‑инфраструктуры в облакоОблако для КИИОблако для мобильных и веб‑приложений3D-моделирование и рендерингEvolution ComputeEvolution Managed KubernetesEvolution Object StorageEvolution Managed PostgreSQL®Evolution Bare MetalEvolution MigrationEvolution SSH KeysEvolution VPNEvolution DNSEvolution VPCEvolution Load BalancerEvolution Disaster RecoveryEvolution Agent BackupEvolution DiskEvolution Container AppsEvolution Container SecurityEvolution Artifact RegistryEvolution Managed KafkaEvolution Managed RedisEvolution Managed ClickHouseEvolution Managed OpenSearchEvolution API GatewayEvolution RepoEvolution Managed ArenadataDBEvolution Managed TrinoEvolution Managed SparkEvolution Managed MetastoreEvolution AI AgentsEvolution ML InferenceEvolution Foundation ModelsEvolution Managed RAGEvolution TagsEvolution Task HistoryCloud MonitoringCloud LoggingCurator Anti-DDoSCurator Anti‑DDoS+WAFUserGate: виртуальный NGFWStormWall: Anti-DDoSАренда GPUDirect ConnectCDNCloud AdvisorCross-platform connectionAdvanced Object Storage ServiceAdvanced Elastic Cloud ServerAdvanced Relational Database Service for PostgreSQLAdvanced Image Management ServiceAdvanced Auto ScalingAdvanced Enterprise RouterAdvanced Cloud Backup and RecoveryAdvanced Data Warehouse ServiceAdvanced Elastic Volume ServiceAdvanced Cloud Container EngineAdvanced FunctionGraphAdvanced Container Guard ServiceAdvanced Software Repository for ContainerAdvanced Document Database Service with MongoDBAdvanced Relational Database Service for MySQLAdvanced Relational Database Service for SQL ServerAdvanced Server Migration ServiceAdvanced Data Replication ServiceAdvanced API GatewayAdvanced CodeArtsAdvanced Distributed Message Service for KafkaAdvanced Distributed Message Service for RabbitMQAdvanced DataArts InsightAdvanced CloudTableAdvanced MapReduce ServiceAdvanced Cloud Trace ServiceAdvanced Application Performance ManagementAdvanced Identity and Access ManagementAdvanced Enterprise Project Management ServiceVMware: виртуальный ЦОДVMware: резервное копирование виртуальных машинУдаленные рабочие столы (VDI)VMware: виртуальный ЦОД с GPUVMware: резервный ЦОДVMware: резервное копирование в облакоVMware: миграция виртуальных машин
Связаться с нами

Ansible и Docker: автоматизация развертывания контейнеров

Запуск контейнеров через docker run по SSH хорошо подходит для небольших задач, когда серверов немного и все можно настроить вручную. Но по мере роста инфраструктуры такой подход начинает создавать проблемы: приходится повторять одни и те же действия на разных машинах, следить за отличиями в настройках и тратить больше времени на исправление ошибок или возврат изменений.

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

Сервисы
Иллюстрация для статьи на тему «Ansible и Docker: автоматизация развертывания контейнеров»

Зачем управлять Docker через Ansible

Ansible делает управление Docker воспроизводимым: контейнеры, образы, сети, тома и compose-стеки описываются в коде и приводятся к нужному состоянию автоматически. При повторном запуске playbook Ansible проверяет текущую конфигурацию и меняет только то, что отличается от заданных параметров.

Это отличается от ручного запуска команд docker run, которые подходят для быстрых операций, но плохо масштабируются при работе с большим количеством серверов и контейнеров. Чем больше объектов в инфраструктуре, тем сложнее поддерживать их вручную и тем выше ценность автоматизации.

Доля разработчиков, которые используют Docker, согласно опросу Stack Overflow Developer Survey 2024Доля разработчиков, которые используют Docker, согласно опросу Stack Overflow Developer Survey 2024

Docker при этом стал почти отраслевым стандартом. По данным опроса 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

Перед началом работы нужно подготовить целевые хосты: установить 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 покрывает полный жизненный цикл контейнера: создает, запускает, останавливает, перезапускает и удаляет. А через параметры модуля задаются порты и тома, переменные окружения, лимиты ресурсов и проверки состояния.

Управляйте Kubernetes в облаке
Управляйте Kubernetes в облаке
Настройте безопасное сетевое взаимодействие, добавьте визуализацию метрик через маркетплейс плагинов
Узнать больше

Пример: запуск контейнера

Запуск контейнераЗапуск контейнера

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 ComposeDocker 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Примерно так выглядит архитектура 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
Дарим до 20 000 бонусов
Дарим до 20 000 бонусов
4 000 бонусов – физическим лицам, 20 000 бонусов – юридическим
Узнать больше

Evolution Compute предоставляет виртуальные машины под целевые хосты для Ansible-плейбуков. Создаются за минуты, доступ по SSH. Их удобно заводить как managed-серверы под контейнеры.

Evolution Artifact Registry — приватный registry для образов

Архитектура сервиса Evolution Artifact RegistryАрхитектура сервиса Evolution Artifact Registry

Docker-образы можно хранить в приватном репозитории вместо публикации в 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

Когда инфраструктура становится сложнее, используют 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, где обслуживание управляющих компонентов берет на себя платформа.

14 августа 2026

Подбираете облачный сервис?

Экспертно поможем с выбором
*
*
+7
*
*
*
0/300

Вам может понравиться