Одноразовая локальная тестовая среда для DevOps / системного администратора
Экспериментировать с Docker Swarm и иметь только один узел немного грустно 😞. К счастью, в моем предыдущем уроке вы узнали, как создать Одноразовую локальную тестовую среду с использованием Vagrant и Ansible. Если вы следили за нами, вы знаете немного больше о Vagrant и Ansible, но нечего хвастаться🤯, так что бросьте нашу игру и создайте мультивиртуальную машину Кластер Docker Swarm.
Это включает в себя использование Vagrant для создания нескольких виртуальных машин, затем использование Ansible для установки Docker на каждую машину перед созданием кластера Docker Swarm со всеми нашими узлами. На этом у вас есть прочная основа для экспериментов с Docker.

Я хочу напомнить вам, что цель этой серии руководств — задокументировать то, что я считаю абсолютным минимумом для небольшого самостоятельного стороннего проекта. Я приглашаю вас посетить мой репозиторий для получения дополнительной информации: https://github.com/xNok/infra-bootstrap-tools. На данный момент мы делаем основу для настройки сервера для размещения приложения, которое мы развернем позже в виде контейнеров Docker.
Инициализация нескольких виртуальных машин с помощью Vagrant
Как и в предыдущем уроке, мы используем Vagrant для создания виртуальных машин. Разница в том, что на этот раз мы выделяем 3 виртуальные машины, поэтому файл стал заметно больше. Я объясню содержание этого файла в следующем разделе.
Вот новый обновленный Vagrantfile . Перед запуском vagrant up вам нужно настроить еще две вещи: ansible.cfg и inventory Код будет ниже этого большого Vagrantfile .
Итак, две последние вещи, которые вам нужны 😅. Создайте файл ansible.cfg, мы настраиваем конфигурацию ansible для работы с нашей установкой. У вас не будет интерактивной оболочки, поэтому мы не сможем принимать отпечатки SSH. Эта конфигурация также будет необходима для обеспечения возможности вашей работы в вашей CI / CD, поскольку мы сталкиваемся с тем же ограничением.
[defaults] host_key_checking = no[ssh_connection] ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes
Наконец, нам нужно вручную определить файл инвентаризации. Поскольку мы выбрали IP-адреса в частной сети, это простая задача. Не то чтобы мы также использовали преимущества нашего synced_folder для получения SSH-ключей, необходимых для подключения ansible к node1 и node2.
node1 ansible_host=172.17.177.21 ansible_ssh_private_key_file=/vagrant/.vagrant/machines/node1/virtualbox/private_key node2 ansible_host=172.17.177.22 ansible_ssh_private_key_file=/vagrant/.vagrant/machines/node2/virtualbox/private_key controller ansible_host=172.17.177.11 ansible_connection=local[nodes] node[1:2][managers] controller
Теперь вы можете подготовить инфраструктуру с помощью Vagrant.
Vagrant up
Сосредоточьтесь на Vagrantfile
Во-первых, мы выбираем коробку Vagrant, которую используем в качестве основы. На этот раз вместо этого я использую Ubuntu (generic/ubuntu2004). Мне было проще установить последнюю версию Ansible на контроллер. Обратите внимание, что я добавил virtualbox определенных конфигураций. Поскольку вы используете несколько виртуальных машин, важно контролировать размер каждой виртуальной машины, чтобы не истощать ресурсы ПК. Кроме того, я использовал параметр linked_clone, чтобы ускорить процесс, таким образом, VirtualBox создаст виртуальную машину base (которая останется выключенной) и клонирует эту виртуальную машину для создания трех других.
Далее у нас есть определение двух рабочих узлов. Этот шаг прост. Новым здесь является то, что мы устанавливаем фиксированные IP-адреса для нашей виртуальной машины, это упрощает создание статической инвентаризации Ansible.
Прежде чем начать с контроллера, я хочу, чтобы вы просмотрели документацию Vagrant и заметили, что существует два поставщика Ansible ansible и ansible_local . Я использовал второй, поэтому мне не нужно возиться с установкой ansible, и я считаю, что этот подход ближе к подходу CI/CD, который вы будете использовать позже в этой серии. В результате для создания двух узлов мы предоставим три машины, одна из которых является контроллером и отвечает за запуск и подготовку других машин.
Во-первых, мы создаем два synced_folder, чтобы предоставить виртуальной машине доступ к нашему плейбуку и ролям. Таким образом, мы можем обновить любой код Ansible и сразу же использовать его в виртуальной машине. Обратите внимание, что во избежание проблем с разрешениями я принудительно установил uid и guid, а также ограничил доступ к файлам на чтение/запись только для пользователя. Причина в том, что Ansible использует ключи SSH, хранящиеся в этой папке (см. файл инвентаризации), и разрешение для этих ключей должно быть таким.
Более сложная часть находится в разделе provision. Я хочу использовать последнюю версию 2.x для использования последних версий модулей docker_swarm и docker_swarm_info. Проблема в том, что ansible внес много структурных изменений между 2.7 и 2.10. Поэтому для установки нужной версии требуется немного взлома. Я нашел этот метод на Github, и он работает как шарм.
Настройка Docker с помощью Ansible
Наш плейбук скоро станет немного сложнее, кроме того, установка докера — это то, что вы, возможно, захотите повторно использовать в нескольких проектах. Я предполагаю, что вы немного знакомы с Ansible и нашли время, чтобы немного поиграть с игрой hello-world, которую вы использовали в первом уроке.
Существует несколько способов создания ролей с помощью ansibles, но я хочу, чтобы они были максимально простыми. Но вы должны знать, что рекомендуемый способ создания ролей — использовать ansible-galaxy init. См. документацию здесь. Недостатком этого подхода является то, что он создает папку и файлы, которые вы не можете использовать. Давайте не будем усложнять и создадим минимальную структуру.
Ansible ищет папку с именем roles, а затем подпапку с именем этой роли здесь docker, и, наконец, первое, что делает Ansible, — это считывает main.yml из папки meta этой роли, чтобы получить метаданные о ней.
mkdir -p roles/docker/meta
touch roles/docker/meta/main.yml
meta/main.yml требует, чтобы вы указали зависимости только для этой роли, что означает другие роли, которые вы ожидаете выполнить до этой.
dependencies: []
# List your role dependencies here, one per line. Be sure to remove the '[]' above,
# if you add dependencies to this list.
Наконец, нам нужно определить задачи для завершения установки докера. Рекомендуется просмотреть официальную документацию по установке докера и превратить ее в роль Ansible: https://docs.docker.com/install/linux/docker-ce/debian/. Создайте файл /tasks/main.yaml
mkdir -p roles/docker/tasks
touch roles/docker/tasks/main.yml
Тогда содержимое main.yml должно выглядеть следующим образом:
Обновите файл playbook.yml, чтобы указать, что мы хотим использовать эту роль для всех наших виртуальных машин.
Теперь пришло время запустить Vagrant
vagrant up
После завершения подготовки у вас должно быть три виртуальных машины с настройкой Docker.
Настройка Docker Swarm с помощью Ansible
Чтобы завершить нашу настройку, нам нужно создать еще три роли:
docker-swarm-controllerустановит необходимый пакет python на хосте, на котором работает Ansible для контроллера, и будет управлять роем. Это включает в себя, в частности, пакет докеров python.docker-swarm-managerинициализирует swam и присоединит все целевые узлы в качестве менеджераdocker-swarm-nodeприсоединит все целевые узлы в качестве рабочих узлов.
Вот окончательный плейбук Ansible:
docker-swarm-controller role
Эта роль проста, я не думаю, что мне нужно ее комментировать.
docker-swarm-manager role
Вам нужно быть осторожным, вы можете запустить рой докеров только один раз. По соглашению первый узел группы managers будет использоваться в качестве основателя роя. Обратите внимание, что эта роль использует переменную swarm_managers_inventory_group_name. Мне нравится, чтобы мои переменные были подробными 😂. Нам нужно прочитать факты о наших узлах, эта переменная говорит нам, какая группа в инвентаре используется для менеджеров.
Вам может быть интересно, что делают hostvars[groups[swarm_managers_inventory_group_name][0]].result.swarm_facts.JoinTokens.Manager? Когда Ansible выполнил Init a new swarm with default parameters, мы попросили Ansible зарегистрировать некоторую информацию с помощью register: result, это просто путь для сбора информации о токене присоединения, который необходим другим узлам для присоединения к рою в качестве менеджера. Get join-token for manager nodes эффективно сохранял токен присоединения на каждом из менеджеров как факт. Подробнее о фактах и переменных Ansible здесь.
docker-swarm-node role
Эта роль очень похожа на предыдущую, за исключением того, что на этот раз мы получаем токен воркера присоединения и регистрируем нашу ноду в качестве воркеров.
Проверка работы Docker Swarm
Посмотрим, все ли в порядке в нашем кластере. SSH к узлу контроллера:
vagrant ssh controller
Используйте команду docker node ls, чтобы увидеть свой кластер
vagrant@ubuntu2004:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
odumha179h5qbtln5jfoql9xc * ubuntu2004.localdomain Ready Active Leader 20.10.12
opeigd4zdccyzam3yjaakdfzk ubuntu2004.localdomain Ready Active 20.10.12
yjy282nbmzcr5gx90rvvacla2 ubuntu2004.localdomain Ready Active 20.10.12
Заключение
Быстрая настройка виртуальных машин и создание ролей Ansible — это самый быстрый способ бесплатно протестировать простую настройку. Вот почему Vagrant и Ansible создали такую замечательную команду для создания одноразовой локальной тестовой среды.
На данный момент ваш Docker Swarm совершенно пуст. В будущих руководствах давайте создадим простой стек, который вы сможете повторно использовать почти во всех своих проектах. Вы можете проверить мой репозиторий Github https://github.com/xNok/infra-bootstrap-tools, чтобы найти больше руководств и создать следующую инфраструктуру.

Решение общих проблем
Иногда при подготовке нескольких компьютеров возникают проблемы. Вы не должны перезапускать все с нуля, а использовать возможности Ansible и Vagrant, чтобы возобновить работу с того места, где возникла проблема.
Когда подготовка завершается сбоем (неизбежная ошибка), вы можете перезапустить подготовку с помощью:
vagrant provision controller
Со мной случилось, что на узле произошла ошибка (ошибки SSH или узел недоступен), в этом случае перезагрузите только тот узел, который создает проблемы.
vagrant reload node1
Рекомендации
- https://github.com/geerlingguy/ansible-role-docker
- https://github.com/ruanbekker/ansible-docker-swarm
- https://github.com/atosatto/ansible-dockerswarm
- Модуль Docker_swarm — параметр join_token для ansible не работает
- https://stackoverflow.com/questions/58232506/docker-swarm-module-join-token-parameter-for-ansible-not-working

Присоединяйтесь к FAUN: Сайт💻|Подкаст🎙️|Twitter🐦|Facebook👥 |Instagram📷|Группа Facebook🗣️|Группа Linkedin💬| Slack 📱|Cloud Native Новости📰|Дополнительно.
Если этот пост был полезен, пожалуйста, несколько раз нажмите кнопку аплодисментов 👏 ниже, чтобы выразить свою поддержку автору 👇