Перейти к содержимому
Главная страница » Установка Docker с помощью Ansible в Ubuntu 22.04

Установка Docker с помощью Ansible в Ubuntu 22.04

Автоматизация серверов в настоящее время играет важную роль в системном администрировании из-за одноразовости современных прикладных сред. Инструменты для управления конфигурацией, такие как 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:

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

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

Для начала войдите под именем sudo разрешенного пользователя на вашем сервере Ansible control node server.

Подготовка вашего playbook

В playbook.yml файле определены все ваши задачи. Задача — это наименьшая единица действия, которую вы можете автоматизировать с помощью Ansible playbook. Но сначала создайте файл playbook, используя предпочитаемый вами текстовый редактор:

nano playbook.yml

При этом откроется пустой файл YAML. Прежде чем приступить к добавлению задач в playbook, начните с добавления следующего:

playbook.yml

---
- hosts: all
  become: true
  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

  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.

Добавление задач по установке Docker в ваш Playbook

Ваша задача — установить последнюю версию Docker из официального репозитория. Добавлен GPG-ключ Docker для подтверждения загрузки, добавлен официальный репозиторий в качестве источника нового пакета, и Docker будет установлен. Кроме того, также будет установлен модуль Docker для Python:

playbook.yml

    - 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: true

    - 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

    - 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

---
- 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 jammy 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
      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, вы можете использовать следующую команду:

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 playbooks, ознакомьтесь с руководством по Ansible.

Это означает, что настройка вашего сервера завершена! Ваш результат не обязательно должен быть точно таким же, но важно, чтобы у вас не было сбоев.

Когда 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, были созданы успешно. Поскольку это была последняя задача в playbook, это также подтверждает, что playbook был полностью выполнен на этом сервере.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *