Pull to refresh
295.45
Rating
Southbridge
Обеспечиваем стабильную работу highload-проектов

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

Southbridge corporate blogSystem administrationVirtualizationServer AdministrationDevOps
Tutorial


Недавно разработчики 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 — Виктор Батуев.
Tags:centos-admin.rusouthbridgeansibledockeransible-container
Hubs: Southbridge corporate blog System administration Virtualization Server Administration DevOps
Total votes 22: ↑21 and ↓1 +20
Views23.6K

Comments 13

Only those users with full accounts are able to leave comments. Log in, please.
DevOps инженер
from 180,000 to 300,000 ₽SouthbridgeRemote job

Information

Founded
Location
Россия
Website
southbridge.io
Employees
51–100 employees
Registered
Representative
Антон Скобин