Как использовать Ansible для установки и настройки Docker в Ubuntu 18.04
Введение
В настоящее время автоматизация серверов играет важную роль в системном администрировании из-за одноразового характера современных сред приложений. Ansible обычно используются для упрощения процесса автоматической настройки сервера путем установления стандартных процедур для новых серверов, а также для уменьшения человеческих ошибок, связанных с ручной настройкой.
Ansible предлагает простую архитектуру, которая не требует установки специального программного обеспечения на узлах. Он также предоставляет надежный набор функций и встроенных модулей, упрощающих написание сценариев автоматизации.
В этом руководстве объясняется, как использовать Ansible для автоматизации шагов, описанных в нашем руководстве по Docker. Это приложение упрощает процесс управления контейнерами, процессами, изолированными от ресурсов, которые ведут себя аналогично виртуальным машинам, но более переносимы, более ресурсоемки и в большей степени зависят от основной операционной системы.
Предпосылки
Чтобы выполнить автоматическую настройку, представленную в этом руководстве, вам потребуется:
- Один управляющий узел Ansible: компьютер с Ubuntu 18.04, на котором Ansible установлен и настроен для подключения к хостам Ansible с помощью ключей SSH. Убедитесь, что на управляющем узле есть обычный пользователь с разрешениями sudo и включенным брандмауэром, как описано в нашем разделе Установка и настройка Ansible в Ubuntu 18.04.
- Один или несколько хостов Ansible: один или несколько удаленных серверов Ubuntu 18.04, предварительно настроенных в соответствии с руководством «Как использовать Ansible для автоматизации начальной настройки сервера в Ubuntu 18.04».
Прежде чем продолжить, вам сначала нужно убедиться, что ваш узел управления Ansible может подключаться и выполнять команды на вашем хосте Ansible. Для проверки подключения см. Шаг 3 раздела «Установка и настройка Ansible в Ubuntu 18.04».
Что делает этот Playbook?
Этот учебник Ansible представляет собой альтернативу ручному запуску процедуры, описанной в нашем руководстве «Как установить и использовать Docker в Ubuntu 18.04». Настройте свой playbook один раз и используйте его для каждой последующей установки.
Запуск этого плейбука выполнит следующие действия на ваших хостах Ansible:
- Установите
aptitude
, который Ansible предпочитает в качестве альтернативы диспетчеру пакетовapt
. - Установите необходимые системные пакеты.
- Установите ключ Docker GPG APT.
- Добавьте официальный репозиторий Docker в исходный код
apt
. - Установите Docker.
- Установите модуль Python Docker через
pip
. - Извлеките образ по умолчанию, указанный в
default_container_image
, из Docker Hub. - Создайте количество контейнеров, определенное переменной
container_count
, каждый из которых использует изображение, определенноеdefault_container_image
, и выполните команду, определенную вdefault_container_command
. в каждом новом контейнере.
После того, как playbook завершит работу, у вас будет несколько контейнеров, созданных на основе параметров, которые вы определили в своих переменных конфигурации.
Для начала войдите в систему с включенным пользователем sudo
на сервере узла управления Ansible.
Шаг 1 — Подготовка вашего Playbook
В файле playbook.yml
определены все ваши задачи. Задача — это наименьшая единица действия, которую можно автоматизировать с помощью Ansible playbook. Но сначала создайте файл playbook с помощью предпочитаемого вами текстового редактора:
- nano playbook.yml
Это откроет пустой файл YAML. Прежде чем приступить к добавлению задач в свою книгу, начните со следующего:
---
- hosts: all
become: true
vars:
container_count: 4
default_container_name: docker
default_container_image: ubuntu
default_container_command: sleep 1
Почти каждая пьеса, с которой вы столкнетесь, будет начинаться с объявлений, подобных этому. hosts
объявляет, на какие серверы узел управления Ansible будет ориентироваться с этой книгой воспроизведения. become
указывает, будут ли все команды выполняться с повышенными привилегиями root.
vars
позволяет хранить данные в переменных. Если вы решите изменить их в будущем, вам нужно будет отредактировать только эти отдельные строки в вашем файле. Вот краткое объяснение каждой переменной:
container_count
: количество создаваемых контейнеров.default_container_name
: имя контейнера по умолчанию.default_container_image
: образ Docker по умолчанию, который будет использоваться при создании контейнеров.default_container_command
: команда по умолчанию для запуска новых контейнеров.
Примечание. Если вы хотите увидеть файл плейбука в его окончательном законченном состоянии, перейдите к шагу 5. Файлы YAML могут отличаться своей структурой отступов, поэтому вы можете дважды проверить свой плейбук после добавления всех своих задач.
Шаг 2 — Добавление задач по установке пакетов в ваш Playbook
По умолчанию задачи выполняются Ansible синхронно в порядке сверху вниз в вашем плейбуке. Это означает, что порядок задач важен, и вы можете с уверенностью предположить, что одна задача завершит выполнение до того, как начнется следующая задача.
Все задачи в этом сборнике можно использовать отдельно и повторно использовать в других ваших сборниках.
Добавьте свои первые задачи по установке aptitude
, инструмента для взаимодействия с менеджером пакетов Linux и установке необходимых системных пакетов. Ansible гарантирует, что эти пакеты всегда будут установлены на вашем сервере:
tasks:
- name: Install aptitude
apt:
name: aptitude
state: latest
update_cache: true
- name: Install required system packages
apt:
pkg:
- apt-transport-https
- ca-certificates
- curl
- software-properties-common
- python3-pip
- virtualenv
- python3-setuptools
state: latest
update_cache: true
Здесь вы используете apt
встроенный модуль Ansible, чтобы направить Ansible для установки ваших пакетов. Модули в Ansible — это ярлыки для выполнения операций, которые в противном случае вам пришлось бы запускать как необработанные команды bash. Ansible безопасно использует apt
для установки пакетов, если aptitude
недоступен, но Ansible исторически предпочитал aptitude
.
Вы можете добавлять или удалять пакеты по своему вкусу. Это гарантирует, что все пакеты не только присутствуют, но и имеют последнюю версию, и выполняются после вызова обновления с помощью apt
.
Шаг 3 — Добавление задач установки Docker в ваш Playbook
Вашей задачей будет установка последней версии Docker из официального репозитория. Ключ Docker GPG добавляется для проверки загрузки, официальный репозиторий добавляется в качестве нового источника пакета, и Docker будет установлен. Дополнительно будет установлен модуль Docker для Python:
- 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:
name: docker-ce
state: latest
update_cache: true
- name: Install Docker Module for Python
pip:
name: docker
Вы увидите, что встроенные модули Ansible apt_key
и apt_repository
сначала указывают правильные URL-адреса, а затем получают задание убедиться, что они присутствуют. Это позволяет установить последнюю версию Docker, а также использовать pip
для установки модуля для Python.
Шаг 4 — Добавление Docker Image и Container Tasks в ваш Playbook
Фактическое создание ваших контейнеров Docker начинается здесь с извлечения желаемого образа Docker. По умолчанию эти образы берутся с официального Docker Hub. Используя этот образ, контейнеры будут созданы в соответствии со спецификациями, изложенными в переменных, объявленных в верхней части вашего плейбука:
- name: Pull default Docker image
docker_image:
name: "{{ default_container_image }}"
source: pull
- name: Create default containers
.docker_container:
name: "{{ default_container_name }}{{ item }}"
image: "{{ default_container_image }}"
command: "{{ default_container_command }}"
state: present
with_sequence: count={{ container_count }}
docker_image
используется для извлечения образа Docker, который вы хотите использовать в качестве основы для ваших контейнеров. docker_container
позволяет указать особенности создаваемых вами контейнеров, а также команду, которую вы хотите им передать.
with_sequence
— это Ansible способ создания цикла, и в этом случае он будет зацикливать создание ваших контейнеров в соответствии с указанным вами количеством. Это базовый цикл подсчета, поэтому переменная item
здесь предоставляет число, представляющее текущую итерацию цикла. Этот номер используется здесь для именования ваших контейнеров.
Шаг 5 — Просмотр полного сборника сценариев
Ваш плейбук должен выглядеть примерно так, с небольшими отличиями в зависимости от ваших настроек:
---
- hosts: all
become: true
vars:
container_count: 4
default_container_name: docker
default_container_image: ubuntu
default_container_command: sleep 1d
tasks:
- name: Install aptitude
apt:
name: aptitude
state: latest
update_cache: true
- name: Install required system packages
apt:
pkg:
- apt-transport-https
- ca-certificates
- curl
- software-properties-common
- python3-pip
- virtualenv
- python3-setuptools
state: latest
update_cache: true
- 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:
name: docker-ce
state: latest
update_cache: true
- name: Install Docker Module for Python
pip:
name: docker
- name: Pull default Docker image
docker_image:
name: "{{ default_container_image }}"
source: pull
- name: Create default containers
docker_container:
name: "{{ default_container_name }}{{ item }}"
image: "{{ default_container_image }}"
command: "{{ default_container_command }}"
state: present
with_sequence: count={{ container_count }}
Не стесняйтесь изменять этот сборник сценариев, чтобы он наилучшим образом соответствовал вашим индивидуальным потребностям в рамках вашего собственного рабочего процесса. Например, вы можете использовать модуль docker_container для настройки сетей контейнеров.
Примечание. Это мягкое напоминание о том, что нужно помнить о своих отступах. Если вы столкнулись с ошибкой, это, скорее всего, виновник. YAML предлагает использовать 2 пробела в качестве отступа, как это было сделано в этом примере.
Когда вы будете удовлетворены своей игрой, вы можете выйти из текстового редактора и сохранить.
Шаг 6 — Запуск вашего Playbook
Теперь вы готовы запустить эту книгу на одном или нескольких серверах. Большинство плейбуков по умолчанию настроены на выполнение на каждом сервере в вашем инвентаре, но на этот раз вы укажете свой сервер.
Чтобы выполнить плейбук только на server1
, подключившись как sammy
, вы можете использовать следующую команду:
- ansible-playbook playbook.yml -l server1 -u sammy
Флаг -l
указывает ваш сервер, а флаг -u
указывает, под каким пользователем выполнять вход на удаленном сервере. Вы получите вывод, подобный этому:
Output. . .
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, ознакомьтесь с нашим руководством по Ansible Cheat Sheet.
Это означает, что настройка вашего сервера завершена! Ваш результат не обязательно должен быть точно таким же, но важно, чтобы у вас не было сбоев.
Когда playbook завершит работу, войдите через SSH на сервер, предоставленный Ansible, чтобы проверить, успешно ли созданы контейнеры.
Войдите на удаленный сервер с помощью:
- ssh sammy@your_remote_server_ip
И перечислите свои контейнеры Docker на удаленном сервере:
- sudo docker ps -a
Вы должны увидеть вывод, похожий на этот:
OutputCONTAINER 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
Это означает, что контейнеры, определенные в playbook, были успешно созданы. Поскольку это была последняя задача в плейбуке, это также подтверждает, что плейбук полностью выполнен на этом сервере.
Заключение
Автоматизация настройки вашей инфраструктуры может не только сэкономить ваше время, но и обеспечить соответствие ваших серверов стандартной конфигурации, которую можно настроить в соответствии с вашими потребностями. Учитывая распределенный характер современных приложений и необходимость согласованности между различными промежуточными средами, подобная автоматизация стала центральным компонентом в процессах разработки многих команд.
В этом руководстве вы продемонстрировали, как использовать Ansible для автоматизации процесса установки и настройки Docker на удаленном сервере. Поскольку каждый человек обычно имеет разные потребности при работе с контейнерами, мы рекомендуем вам ознакомиться с официальной документацией Ansible для получения дополнительной информации и примеров использования модуля docker_container
Ansible.
Если вы хотите включить в этот сборник другие задачи для дальнейшей настройки первоначальной настройки сервера, обратитесь к нашему вводному руководству по Ansible Управление конфигурацией 101: Написание Ansible Playbooks.