Поиск по сайту:

Как использовать 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:

  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.

Шаг 1 — Подготовка вашего Playbook

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

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

  1. 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, чтобы проверить, успешно ли созданы контейнеры.

Войдите на удаленный сервер с помощью:

  1. ssh sammy@your_remote_server_ip

И перечислите свои контейнеры Docker на удаленном сервере:

  1. sudo docker ps -a

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

Output
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

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

Заключение

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

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

Если вы хотите включить в этот сборник другие задачи для дальнейшей настройки первоначальной настройки сервера, обратитесь к нашему вводному руководству по Ansible Управление конфигурацией 101: Написание Ansible Playbooks.