Автоматизация серверов в настоящее время играет важную роль в системном администрировании из-за одноразовости современных прикладных сред. Инструменты для управления конфигурацией, такие как Ansible, обычно используются для оптимизации процесса автоматизации настройки сервера путем установления стандартных процедур для новых серверов, а также для уменьшения человеческих ошибок, связанных с ручной настройкой.
Ansible предлагает простую архитектуру, которая не требует установки специального программного обеспечения на узлы. Он также предоставляет надежный набор функций и встроенных модулей, облегчающих написание сценариев автоматизации.
В этом руководстве объясняется, как использовать Ansible для автоматизации шагов, содержащихся в нашем руководстве по Установке и использованию Docker в Ubuntu 22.04.
Docker — это приложение, упрощающее процесс управления контейнерами, процессами, изолированными от ресурсов, которые ведут себя аналогично виртуальным машинам, но являются более переносимыми, более ресурсоемкими и в большей степени зависят от операционной системы хоста.
Предварительные требования
Для выполнения автоматической настройки, предоставленной playbook в этом руководстве, вам понадобится:
- Один узел управления Ansible: компьютер Ubuntu 22.04 с установленным и настроенным Ansible для подключения к вашим хостам Ansible с помощью SSH-ключей. Убедитесь, что на управляющем узле есть обычный пользователь с разрешениями sudo и включенным брандмауэром, как описано в нашем руководстве по начальной настройке сервера. Чтобы настроить Ansible, пожалуйста, следуйте нашему руководству о том, как установить и настроить Ansible в Ubuntu 22.04.
- Один или несколько хостов Ansible: один или несколько удаленных серверов Ubuntu 22.04, предварительно настроенных в соответствии с руководством по использованию Ansible для автоматизации начальной настройки сервера в Ubuntu 22.04.
Прежде чем продолжить, вам сначала необходимо убедиться, что ваш узел управления Ansible способен подключаться и выполнять команды на вашем хосте (ах) Ansible. Для проверки подключения ознакомьтесь с Шагом 3 из Инструкции по установке и настройке Ansible в Ubuntu 22.04.
Что делает этот playbook?
Это руководство по Ansible предоставляет альтернативу ручному выполнению процедуры, описанной в нашем руководстве по Установке и использованию Docker в Ubuntu 22.04. Настройте playbook один раз и используйте его для каждой последующей установки.
При запуске этого 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 control node server.
Подготовка вашего playbook
В playbook.yml
файле определены все ваши задачи. Задача — это наименьшая единица действия, которую вы можете автоматизировать с помощью Ansible playbook. Но сначала создайте файл playbook, используя предпочитаемый вами текстовый редактор:
1 |
nano playbook.yml |
При этом откроется пустой файл YAML. Прежде чем приступить к добавлению задач в playbook, начните с добавления следующего:
playbook.yml
1 2 3 4 5 6 7 8 |
--- - hosts: all become: <strong>true</strong> vars: container_count: 4 default_container_name: docker default_container_image: ubuntu default_container_command: sleep 1 |
Почти каждый playbook, с которым вы сталкиваетесь, состоит из переменных:
hosts
объявляет, на какие серверы узел управления Ansible будет нацелен с помощью этого playbook.become
указывает, будут ли все команды выполняться с повышенными привилегиями root.vars
позволяет хранить данные в переменных. Если вы решите изменить их в будущем, вам нужно будет отредактировать только эти отдельные строки в вашем файле. Вот краткое объяснение каждой переменной:container_count
: Количество создаваемых контейнеров.default_container_name
: Имя контейнера по умолчанию.default_container_image
: Образ Docker по умолчанию, который будет использоваться при создании контейнеров.default_container_command
: Команда по умолчанию для запуска в новых контейнерах.
Примечание: Если вы хотите увидеть файл playbook в его окончательном готовом виде, перейдите к шагу 5. Файлы YAML могут отличаться особой структурой отступов, поэтому вам может потребоваться перепроверить playbook после добавления всех ваших задач.
Добавление задач по установке пакетов в ваш Playbook
По умолчанию задачи Ansible выполняются синхронно в порядке сверху вниз в вашем playbook. Это означает, что порядок выполнения задач важен, и вы можете с уверенностью предположить, что выполнение одной задачи завершится до начала выполнения следующей.
Все задачи из этого сборника можно выполнять самостоятельно и повторно использовать в других ваших сборниках.
Добавьте свои первые задачи по установке aptitude
, инструмента для взаимодействия с менеджером пакетов Linux и установки необходимых системных пакетов. Ansible гарантирует, что эти пакеты всегда будут установлены на вашем сервере.:
playbook.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
tasks: - name: Install aptitude apt: name: aptitude state: latest update_cache: <strong>true</strong> - 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: <strong>true</strong> |
Здесь вы используете apt
встроенный в Ansible модуль, чтобы направить Ansible на установку ваших пакетов. Модули в Ansible — это ярлыки для выполнения операций, которые в противном случае вам пришлось бы запускать как необработанные команды bash. Ansible безопасно возвращается к apt
для установки пакетов, если aptitude
он недоступен, но исторически предпочтение отдавалось Ansible aptitude
.
Вы можете добавлять или удалять пакеты по своему усмотрению. Это гарантирует, что все пакеты не только присутствуют, но и находятся в последней версии, и выполняются после вызова обновления с помощью apt
.
Добавление задач по установке Docker в ваш Playbook
Ваша задача — установить последнюю версию Docker из официального репозитория. Добавлен GPG-ключ Docker для подтверждения загрузки, добавлен официальный репозиторий в качестве источника нового пакета, и Docker будет установлен. Кроме того, также будет установлен модуль Docker для Python:
playbook.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
- 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 jammy stable state: present - name: Update apt and install docker-ce apt: name: docker-ce state: latest update_cache: <strong>true</strong> - name: Install Docker Module for Python pip: name: docker |
Вы увидите, что apt_key
и apt_repository
встроенные модули Ansible сначала указывают на правильные URL-адреса, а затем им поручается убедиться в их наличии. Это позволяет установить последнюю версию Docker, а также использовать pip
для установки модуля для Python.
Добавление образа Docker и контейнерных задач в вашу Playbook
Фактическое создание ваших контейнеров Docker начинается здесь с извлечения желаемого образа Docker. По умолчанию эти образы поступают из официального Docker Hub. Используя этот образ, контейнеры будут созданы в соответствии со спецификациями, изложенными переменными, объявленными в верхней части вашего справочника:
playbook.yml
1 2 3 4 5 6 7 8 9 10 11 12 |
- name: Pull default Docker image community.docker.docker_image: name: "{{ default_container_image }}" source: pull - name: Create default containers community.docker.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
переменная здесь предоставляет число, представляющее текущую итерацию цикла. Это число используется здесь для присвоения имен вашим контейнерам.
Просмотр полного руководства по playbook
Ваш playbook должен выглядеть примерно следующим образом, с небольшими отличиями в зависимости от ваших настроек:
playbook.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
--- - hosts: all become: <strong>true</strong> 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: <strong>true</strong> - 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: <strong>true</strong> - 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 jammy stable state: present - name: Update apt and install docker-ce apt: name: docker-ce state: latest update_cache: <strong>true</strong> - name: Install Docker Module for Python pip: name: docker - name: Pull default Docker image community.docker.docker_image: name: "{{ default_container_image }}" source: pull - name: Create default containers community.docker.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 Hub или модуль docker_container для настройки контейнерных сетей.
Примечание: Это ненавязчивое напоминание о том, что следует помнить о своих отступах. Если вы столкнулись с ошибкой, весьма вероятно, что виновником является она. YAML предлагает использовать 2 пробела в качестве отступа, как было сделано в этом примере.
После того, как вы будете удовлетворены своей игрой, вы можете выйти из текстового редактора и сохранить.
Запуск Playbook
Теперь вы готовы запустить этот сборник игр на одном или нескольких серверах. Большинство сборников игр по умолчанию настроены для запуска на каждом сервере в вашем инвентаре, но на этот раз вы укажете свой сервер.
Чтобы запустить playbook только на server1
, подключившись как sammy
, вы можете использовать следующую команду:
1 |
ansible-playbook playbook.yml -l server1 -u sammy |
Флаг -l
указывает ваш сервер, а флаг -u
указывает, к какому пользователю входить на удаленном сервере. Вы получите результат, аналогичный этому:
1 2 3 4 5 6 7 8 9 10 11 |
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 playbooks, ознакомьтесь с руководством по Ansible.
Это означает, что настройка вашего сервера завершена! Ваш результат не обязательно должен быть точно таким же, но важно, чтобы у вас не было сбоев.
Когда playbook будет завершен, войдите по SSH на сервер, предоставленный Ansible, чтобы проверить, успешно ли были созданы контейнеры.
Войдите на удаленный сервер с помощью:
1 |
ssh sammy@your_remote_server_ip |
И перечисления ваших контейнеров Docker на удаленном сервере:
1 |
sudo docker ps -a |
Вы должны увидеть вывод, подобный этому:
1 2 3 4 5 6 |
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, были созданы успешно. Поскольку это была последняя задача в playbook, это также подтверждает, что playbook был полностью выполнен на этом сервере.