Ansible-container: новый шаг в управление контейнерами

2bc76c4b286c4a04a8fc25f8beb896d2.png

Недавно разработчики Ansible анонсировали новый проект Ansible Container. Проект нас очень сильно заинтриговал, и мы решили рассмотреть его поближе.
Ansible уже давно стал незаменимым инструментом в вопросах создания, сборки, деплоя образов docker-контейнеров и самих docker-контейнеров, благодаря соответствующему модулю.
Ранее для провиженинга docker-контейнеров с помощью Ansible необходим был запущенный в контейнере sshd, но в версии 2.1 в Ansible был добавлен Docker connection plugin, благодаря которому стало возможно запускать плейбуки не только на физических/виртуальных машинах, но и внутри docker-контейнеров и отпала необходимость использования sshd внутри docker-контейнера.

Ещё одна из причин, по которым разработчики начали работу над ansible-container — это формат Dockerfile. Наверное, многие знают, что из себя представляет Dockerfile — не более, чем shell-скрипт со своими инструкциями. Не знаю, как вам, но лично я предпочту описать содержимое контейнера в yaml-формате, чем городить портянку из shell-скрипта, в котором потом ещё не каждый сможет разобраться. Таким образом, нам дали ещё одну крутую возможность — сборку docker-образа при помощи ansible-плейбука!

Ещё один из приятных бонусов — это возможность оркестрации контейнеров в формате docker-compose.
Также есть возможность закидывать и скачивать образы в Docker registry (в том числе в приватный), и разворачивать приложения в кластере Kubernetes и в облаке OpenShift.

Давайте проведём небольшое знакомство с ansible-container.
В качестве хост-машины будем использовать CentOS 7.

Установка Docker.

sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
sudo yum install docker-engine

Установка Ansible.

Установка ansible прекрасно описана в официальной документации.

Подключим репозиторий EPEL (в нём доступная последняя стабильная версия Ansible 2.1), установим ansible, git и python-pip для управления пакетами python.

yum install epel-release
yum install ansible git python-pip

Установка ansible-container
Здесь всё довольно просто. Пока что доступна только сборка из исходников, т. к. проект находится на стадии ранней разработки и в репозитории его ещё не выкладывали.

git clone https://github.com/ansible/ansible-container.git
cd ansible-container
pip install --upgrade setuptools
python ./setup.py install

Настройка

Правим юнит (For ansible-container to work the Docker daemon must be set to listen on an IP address assigned to the host NOT 127.0.0.1. This is because the daemon must be accessible remotely from the Ansible build container.):
По-умолчанию, docker-демон слушает UNIX-сокет. Для использования Ansible Container необходимо перевесить демон на TCP-сокет.

vi /etc/systemd/system/docker.service

Меняем в строке *ExecStart* IP-адрес на актуальный:

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target docker.socket
Requires=docker.socket

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/docker daemon -H fd:// -H tcp://0.0.0.0:2375
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes

[Install]
WantedBy=multi-user.target

Также рекомендуется настроить TLS для docker-демона. В тестовой среде мы опустили этот момент.

перезапускаем docker-демон

systemctl daemon-reload
systemctl restart docker

не забываем выставить переменную DOCKER_HOST для работы с docker-демоном по TCP-сокету.
export DOCKER_HOST=tcp://0.0.0.0:2375

после установки ansible и ansible-container нужно создать новый проект

ansible-container init

после этого у нас создастся директория «ansible» с тремя файлами внутри

ansible
|-- container.yml
|-- main.yml
`-- requirements.txt

Файл container.yml — это описание запуска проекта, его контейнеров и приложений внутри них. Формат очень схож с docker-compose v 1.

К примеру, у нас есть парочка сферических ролей в вакууме.

├── container.yml
├── main.yml
├── requirements.txt
└── roles
    ├── dumb-init
    │   └── tasks
    │       └── main.yml
    ├── nginx
    │   ├── defaults
    │   │   └── main.yml
    │   ├── files
    │   │   └── nginx.repo
    │   ├── handlers
    │   │   └── main.yml
    │   ├── tasks
    │   │   └── main.yml
    │   └── templates
    │       └── nginx.conf
    ├── php-fpm
    │   ├── handlers
    │   │   └── main.yml
    │   ├── tasks
    │   │   └── main.yml
    │   ├── templates
    │   │   └── php.ini
    │   │   └── app.conf
    │   └── vars
    │       └── main.yml

файл container.yml

version: "1"
services:
  nginx:
    image: centos:7
    ports:
      - "80:80"
    links:
      - php
    command: ['/usr/bin/dumb-init', '/usr/sbin/nginx', '-c', '/etc/nginx/nginx.conf' ]
    volumes:
      - /var/www:/usr/share/nginx/html

  php:
    image: centos:7
    ports:
      - "9000:9000"
    command: ['/usr/bin/dumb-init', '/usr/sbin/php-fpm', '-y', '/etc/php-fpm.d/app.conf']
    volumes:
      - /var/www:/usr/share/nginx/html

Файл main.yml — это ничто иное, как ansible-плейбук, который описывает конфигурацию docker-контейнеров. Именно по этому сценарию будет выполняться сборка docker-образов. Нам больше не нужна куча папок и Dockerfile’ов. Сборку всех образов можно описать в одном-единственном файле.

- hosts: all
  gather_facts: false

  roles:
    - dumb-init

- hosts: nginx
  roles:
    - nginx

- hosts: php
  roles:
    - php-fpm

Собираем образы командой:

ansible-container build

И запускаем контейнеры:

ansible-container run

Таким образом, двумя командами мы можем собрать, запустить полноценное докерезированное приложение, не утруждая себя в написании Dockerfile и не вводя кучу параметров в командной строке при запуске docker-контейнеров.

Проект ещё достаточно молодой, находится на стадии активной разработки, но, на мой взгляд, имеет огромный потенциал, хотя и имеется ещё ряд недостатков. К примеру, я не смог найти как запустить контейнеры с опцией detach (аналог docker-compose up -d) или возможность отладки плейбуков. И сборка образов мне показалась слишком долгой, в отличии от сборки образов традиционным Dockerfile.

Спасибо за внимание. Удачной автоматизации!
Автор: DevOps-администратор Southbridge — Виктор Батуев.

Комментарии (0)

© Habrahabr.ru