Использование ansible в Docker контейнерах

Для решения задачи настройки сервера уже давно придумали много вещей лучше, чем просто bash скрипт. Я в частности, использую ansible. Но для создания docker контейнеров по прежнему предлагается механизм который не далеко ушёл от bash скриптов.

Мне понадобилось строить на сервере набор контейнеров, причём полностью автоматизировано. Если создание docker images на основе Dockerfile и работа с готовыми контейнерами в ansible решается из коробки, то с настройкой контейнеров через ansible пришлось немного извратиться.

Идея простая:

  • сделать базовый image в docker в котором через Dockerfile устанавливается только ansible,
  • засинхронизировать с локальной машины на хост машину все файлы, нужные для ansible - роли, настройки и таски,
  • создать контейнер,
  • засинхронизированные настройки подключить в volume внутри контейнера,
  • запустить ansible-playbook через docker exec,
  • готовые контейнеры при необходимости коммитяться и используются как основа для других контейнеров.

Плюсы ansible здесь – идемпотентность, готовые модули и возможность использовать некоторые роли, как для хост машин, так и для контейнеров. Например, у меня есть абстрактная роль nginx и отдельная роль поверх неё nginx_container со спецификой для контейнеров.

То что получилось и подробности работы можно посмотреть в репозитории scala-moscow/deploy.