Установка и настройка Docker с помощью Ansible в Ubuntu 18.04

Вместе с популярностью контейнерных приложений и микросервисов растет и необходимость автоматизации серверов в системном администрировании. Это также позволяет заранее определить стандартные процедуры установки новых серверов и уменьшить количество человеческих ошибок.

В этом мануале мы расскажем, как использовать Ansible для автоматизации всех действий, описанных в другом нашем мануале, Установка и использование Docker в Ubuntu 18.04.

Docker – это приложение, которое упрощает управление контейнерами. Контейнеры – это изолированные процессы, которые ведут себя подобно виртуальным машинам, но при этом являются более переносимыми, дружественными к ресурсам и в большей степени зависят от операционной системы хоста.

Конечно, вы можете выполнить эту настройку вручную, но автоматизация процесса с помощью инструмента управления конфигурацией (типа Ansible) сэкономит ваше время. Кроме того, это определит стандартные процедуры, которые можно повторять на десятках и сотнях новых хостов. Ansible предлагает простую архитектуру, не требующую установки специального программного обеспечения на всех хостах. Также в Ansible есть надежный набор функций и встроенных модулей, которые облегчают написание сценариев автоматизации.

Требования

Тестирование подключения к нодам

Чтобы Ansible мог выполнять команды на нодах, выполните следующую команду с Ansible Control Node:

ansible -m ping all

Эта команда использует встроенный модуль Ansible ping для проверки подключения всех нод из файла инвентаря по умолчанию, подключаясь к ним как текущий пользователь системы. Модуль ping проверит:

  • доступны ли ваши хосты Ansible;
  • действительны ли учетные данные SSH на Ansible Control Node;
  • могут ли хосты запускать модули Ansible с помощью Python.

Если вы правильно установили и настроили Ansible, вы получите подобный вывод:

server1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
server2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
server3 | SUCCESS => {
"changed": false,
"ping": "pong"
}

Если вы получаете от хоста ответ pong, это означает, что вы можете запускать команды Ansible и плейбуки на этом сервере.

Примечание: Если вы не получили такой ответ от своих серверов, обратитесь к руководству Как работать с Ansible: простая и удобная шпаргалка.

Что делает этот плейбук?

Данный плейбук Ansible является автоматизированной альтернативой процедуры, описанной в руководстве Установка и использование Docker в Ubuntu 18.04.

При запуске этого плейбука на хостах Ansible будут выполняться следующие действия:

  1. Установка aptitude, который Ansible использует в качестве альтернативы менеджеру пакетов apt.
  2. Установка необходимых системных пакетов.
  3. Установка GPG APT ключа Docker.
  4. Добавление официального репозитория Docker в список apt.
  5. Установка Docker.
  6. Установка модуля Python Docker через pip.
  7. Извлечение с Docker Hub образа по умолчанию, указанного в default_container_image.
  8. Создание количества контейнеров, указанного в поле create_containers, каждый из которых использует образ, указанный в default_container_image, и выполняет команду, определенную в default_container_command.

После выполнения плейбука у вас будет несколько контейнеров, автоматически созданных на основе опций, которые вы определили в переменных конфигурации.

Как использовать этот плейбук?

Для начала нужно загрузить содержимое плейбука на Ansible Control Node. Для удобства содержимое плейбука также включено в следующий раздел данного мануала.

Используйте curl, чтобы загрузить этот плейбук с помощью командной строки:

curl -L https://raw.githubusercontent.com/do-community/ansible-playbooks/master/docker/ubuntu1804.yml -o docker_ubuntu.yml

Это позволит загрузить содержимое плейбука в файл docker_ubuntu.yml в вашем текущем рабочем каталоге. Вы можете просмотреть содержимое плейбука, открыв файл в редакторе командной строки:

nano docker_ubuntu.yml

После того, как вы открыли плейбук, вы должны заметить раздел vars с переменными, которые требуют вашего внимания:

. . .
vars:
create_containers: 4
default_container_name: docker
default_container_image: ubuntu
default_container_command: sleep 1d
. . .

Вот что означают эти переменные:

  • create_containers: количество контейнеров, которое нужно создать.
  • default_container_name: имя контейнера по умолчанию.
  • default_container_image: образ Docker по умолчанию, который будет использоваться при создании контейнеров.
  • default_container_command: команда по умолчанию для запуска в новых контейнерах.

Когда вы закончите обновление переменных внутри docker_ubuntu.yml, сохраните и закройте файл. Если вы использовали nano, нажмите Ctrl + X, Y, а затем Enter.

Теперь вы готовы запустить этот плейбук на одном или нескольких серверах. По умолчанию большинство плейбуков настроено на выполнение на всех серверах из инвентаря. Вы можете использовать флаг -l, чтобы плейбук запустился только на подмножестве серверов или на одном сервере. Чтобы выполнить плейбук только на сервере server1, вы можете использовать следующую команду:

ansible-playbook docker_ubuntu.yml -l server1

Вы увидите:

...
TASK [Add Docker GPG apt Key] ***************************************************************************************

changed: [server1]


TASK [Add Docker Repository] ****************************************************************************************


changed: [server1]


TASK [Update apt and install docker-ce] *****************************************************************************


changed: [server1]


TASK [Install Docker Module for Python] *****************************************************************************


changed: [server1]


TASK [Pull default Docker image] ************************************************************************************


changed: [server1]


TASK [Create default containers] ************************************************************************************


changed: [server1] => (item=1)


changed: [server1] => (item=2)


changed: [server1] => (item=3)


changed: [server1] => (item=4)


PLAY RECAP **********************************************************************************************************


server1                  : ok=9    changed=8    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Читайте также: Как работать с Ansible: простая и удобная шпаргалка

После выполнения плейбука войдите через SSH на сервер, оркестрованный Ansible, и запустите команду docker ps -a, чтобы проверить, были ли созданы контейнеры:

sudo docker ps -a

Вы должны увидеть похожий вывод:

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a3fe9bfb89cf        ubuntu              "sleep 1d"          5 minutes ago       Created                                 docker4
8799c16cde1e        ubuntu              "sleep 1d"          5 minutes ago       Created                                 docker3
ad0c2123b183        ubuntu              "sleep 1d"          5 minutes ago       Created                                 docker2
b9350916ffd8        ubuntu              "sleep 1d"          5 minutes ago       Created                                 docker1

Это означает, что контейнеры, определенные в плейбуке, были созданы успешно. Так как это было последнее задание в плейбуке, это также значит, что на этом сервере плейбук был выполнен полностью.

Содержание плейбука

Плейбук для Docker, описанный в этом руководстве, можно найти в репозитории ansible-playbooks на GitHub. Чтобы скопировать или загрузить содержимое сценария напрямую, нажмите кнопку Raw в верхней части сценария или нажмите сюда, чтобы просмотреть исходное содержимое плейбука.

Мы опубликуем здесь полное содержание плейбука для вашего удобства:

---
- hosts: all
become: true
vars:
create_containers: 4
default_container_name: docker
default_container_image: ubuntu
default_container_command: sleep 1d
tasks:
- name: Install aptitude using apt
apt: name=aptitude state=latest update_cache=yes force_apt_get=yes
- name: Install required system packages
apt: name={{ item }} state=latest update_cache=yes
loop: [ 'apt-transport-https', 'ca-certificates', 'curl', 'software-properties-common', 'python3-pip', 'virtualenv', 'python3-setuptools']
- name: Add Docker GPG apt Key
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
- name: Add Docker Repository
apt_repository:
repo: deb https://download.docker.com/linux/ubuntu bionic stable
state: present
- name: Update apt and install docker-ce
apt: update_cache=yes name=docker-ce state=latest
- name: Install Docker Module for Python
pip:
name: docker
# Pull image specified by variable default_image from the Docker Hub
- name: Pull default Docker image
docker_image:
name: "{{ default_container_image }}"
source: pull
# Creates the number of containers defined by the variable create_containers, using default values
- name: Create default containers
docker_container:
name: "{{ default_container_name }}{{ item }}"
image: "{{ default_container_image }}"
command: "{{ default_container_command }}"
state: present
with_sequence: count={{ create_containers }}

Вы можете использовать этот плейбук в качестве расширяемого шаблона и изменить его, чтоб он наилучшим образом соответствовал индивидуальным потребностям в рамках вашего рабочего процесса. Например, вы можете добавить модуль docker_image для передачи образов в Docker Hub или модуль docker_container  для настройки контейнерных сетей.

Заключение

Автоматизация настройки инфраструктуры может не только сэкономить ваше время, но и помочь обеспечить точное соответствие серверов стандартной конфигурации. Благодаря распределенной природе современных приложений и потребности в согласованности между различными промежуточными средами, сегодня автоматизация оркестровки стала одним из центральных этапов в процессах разработки.

В этом мануале вы узнали, как использовать Ansible для автоматизации установки и настройки Docker на удаленном сервере. Поскольку при работе с контейнерами у всех пользователей обычно разные потребности, мы рекомендуем вам ознакомиться с официальной документацией Ansible для получения дополнительной информации и примеров использования модуля docker_container.

Если вы хотите включить в этот плейбук другие задачи для дальнейшей настройки сервера, пожалуйста, обратитесь к нашему вводному руководству Создание плейбука Ansible.

Tags: , , ,