Самостоятельная работа

Курс «DevOps: Управление инфраструктурой»

Ранее вы могли создавать инфраструктуру в облаке и вероятно делали это руками. Чем больше ручного участия, тем больше риск совершить ошибку или потратить на задачу больше времени. В современные технологи позволяют создавать необходимое количество серверов одной-двумя командами, меняя только переменные.

В этом задании научимся создавать инфраструктуру в Digital Ocean используя для этого коллекцию модулей. Внутри себя эти модули обращаются к API облака. Примерно по такому же принципу работает инструмент Terraform с которыми вы познакомитесь позднее.

  • Создайте 2 дроплета в Digital Ocean с параметрами, указанными ниже:

    • Образ - docker-20-04 (Ubuntu с предустановленным Docker)

    • Размер - s-1vcpu-1gb

    • Регион - ams3

    • Имя - as-a-code-homework-XX, где XX - это номер сервера. Пример итогового имени сервера - as-a-code-homework-02. Имя должно быть уникально

    • Состояние - active

  • Сформируйте инвентори файл с группой digital-ocean

  • Создайте в Makefile команду ping, которая с помощью ad-hoc Ansible пингует созданную группу серверов. Проверьте, что команда выполняется успешно, созданные сервера должны ответить pong

Урок «Облака»

Облачные хостинги позволяют не только создавать виртуальные сервера. Они могут хранить и раздавать пользователям файлы: архивы, css, html, картинки и так далее.

В этом задании вам предстоит захостить небольшой сайт, который состоит из HTML страницы с картинкой и стилями. Для этого воспользуемся облаками AWS или Яндекс Cloud.

На примере AWS рассмотрим следующие сервисы:

  • Amazon Simple Storage Service (Amazon S3) – это сервис хранения объектов (архивов, исполняемых файлов, css, html, картинки и т.д.) любых размеров.

  • Amazon CloudFront — веб-сервис для доставки контента (CDN). Он позволяет доставлять пользователям по всему миру контент с высокой скоростью и доступностью, также предоставляет кеширование.

У Яндекса есть аналогичные сервисы.

  • Зарегистрируйтесь в Яндекс Облаке или AWS

  • Изучите сервис для хранения данных. Склонируйте к себе локально репозиторий с сайтом и загрузите все файлы в хранилище

  • Подключите CDN и раздачу контента

В результате загруженный сайт будет доступен по ссылке типа clouds-homework.s3-website.eu-central-1.amazonaws.com если он загружен в сервис S3. А для CloudFront ссылка будет в виде abca12345.cloudfront.net.

Урок «Ansible-for-servers»

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

Процесс создания инфраструктуры и настройки окружения может выглядеть следующим образом:

  1. Этап подготовки. Создание файла переменных для Terraform, установка необходимых зависимостей

  2. Создание инфраструктуры

  3. Установка необходимых пакетов на серверах

  4. Деплой проекта

Опишите инфраструктуру и задеплойте приложение. При этом должно соблюдаться требование: все чувствительные данные (токены, пароли) должны быть зашифрованы, а все необходимые данные должны находиться в одном источнике данных и готовиться для Terraform с помощью Ansible. Например такой подход используется в проекте hexlet-basics

Урок «Security»

Цель этого задания — создать простую изолированную инфраструктуру веб-приложения.

Доступ напрямую к веб-серверам будет запрещен. HTTP доступ предоставляется через балансировщик нагрузки, а ssh — через сервер-бастион. Сами приложения могут общаться со внешним миром, например чтобы что-то сделать на внешних сервисах. Бастион выступает проводником между инфраструктурой приложения и внешним миром. По сути это обычный сервер с самой минимальной конфигурацией и на нём ничего нет кроме ssh. Чтобы что-то выполнить на веб-серверах, то сперва подключаются к бастиону, а с него на сервера внутри сети.

                          |
                        https
                          |
                          v
                +--------------------+
                |    Load Balancer   |
   +----------------------------------------------------+
   |            |                    |                  |
   |            +--------------------+                  |
   |                     |                              |
   |                     |                              |
   |                    http                +---------+ |
   |                     |                  |         | |
   |                     |                  |         | |
   |                     +-------SSH--------| Bastion |<--------SSH-------
   |                     |                  |         | |
   |                     |                  |         | |
   |                     |                  +---------+ |
   |          +----------+----------+                   |
   |          |                     |                   |
   |          v                     v                   |
   |      +-------+             +-------+               |
   |      |  web  |             |  web  |               |
   |      +---+---+             +---+---+               |
   +----------------------------------------------------+

Для выполнения деплоя через бастион необходимо подготовить конфигурацию SSH. Использование другого конфига для SSH выполняется следующим образом -

ssh -F /path/to/config

Для того чтобы Ansible использовал дополнительные флаги, используется флаг ssh-extra-args. Пример:

ansible -i hosts webservers -m ping --ssh-extra-args "-F /path/to/file"

SSH позволяет проксировать запросы с одного сервера на другой. Таким образом мы можем подключиться к веб-серверам по приватным IP адресам. Пример такой конфигурации и его использования

Host bastion
  Hostname 188.166.54.71 // публичный IP-адрес бастиона
  User root

Host 192.168.10.3 // IP-адрес полученный из созданной VPC
    ProxyJump bastion
    User root

Host 192.168.10.4
    ProxyJump bastion
    User root
ssh -F /path/to/config 192.168.10.4
  • С помощью Terraform опишите инфраструктуру, которая нарисована на диаграмме. Должны быть выполнены следующие требования:

    • Бастион — сервер с минимальной конфигурацией.

    • Веб-сервера — серверы на которых будет работать приложение. Могут изначально содержать Docker

    • Балансировщик — принимает запросы по HTTP и HTTPS и перенаправляет запросы на веб-сервера

    • Бастион, балансировщик нагрузки, веб-серверы находятся внутри одной приватной сети (VPC)

    • Внутри приватной сети у фаервола веб-серверов внутри сети открыты все порты на входящие и исходящие соединения, а также по протоколу ICMP

    • Правила работы с исходящими запросами (outbound rule): должна быть открыт доступ по ICMP. Остальные правила настраиваются по необходимости, если они требуются для работы приложения - например 53 порт (DNS), 80, 443 (для скачивания образов, обновлений кеша и тд)

    • На фаерволе бастиона открыт только ICMP и порт для ssh (22)

  • Подключитесь по ssh к бастиону и зайди на любой веб-сервер. Для того чтобы использовать приватный ключ на удаленном сервере (для дальнейшего подключения) ssh выполняют с опцией -A (ssh agent forwarding):

    ssh -A username@remote_host
  • Выполните деплой приложения

  • Откройте приложение по IP адресу веб-сервера — приложение должно быть недоступно. Доступ по HTTP предоставляется только с балансировщика

Урок «Service-discovery»

Вы на опыте познакомитесь с Consul. В данной практике мы описали небольшую инфраструктуру из нескольких серверов. Представим, что эти сервера периодически добавляются в инфраструктуру и убираются из нее (например, для обновления), а перед нами стоит задача понять, какие из серверов доступны. Допустим, у нас есть приложение, которое делает некие вычисления на этих серверах. Для того чтобы сделать эти вычисления, нужно знать ip адрес сервера и убедиться, что он готов к нужной нам работе (например, на нем запущен docker или любая другая программа необходимая для вычислений). Эта задача может быть решена следующими способами:

  1. После добавления очередного сервера, копируем его ip адрес в конфиг нашего приложения и перезапускаем его. При удалении сервера делаем все то же самое. Минусы - ручные операции, перезагрузка приложения и тд.

  2. Устанавливаем consul и настраиваем service discovery. На каждом сервере устанавливается consul agent, который подключается к другим агентам в известной ему сети. После этого, он начинает передавать всю известную ему информацию остальным агентам в сети. Таким образом происходит быстрый обмен информацией, а при остановке сервера или появлении нового, другие агенты об этом узнают практически мгновенно. Когда мы хотим узнать ip адреса доступных серверов в нашей сети, мы делаем http запрос в Consul агент (О котором мы знаем. Например, в локальный агент.) и получаем список живых серверов вместе с ip адресами. Минусы такого подхода тоже есть. Самый значимый для нас на этом этапе - сложность настройки и обилие новых концепций.

В этой практике сервера и консул агенты на них практически полностью настроены за вас. Ваша задача заключается в том, чтобы установить инфраструктуру и увидеть, как это все работает. В практике нет сложного сервиса, которому требуется знать ip адреса других серверов в сети. Вместо этого вы являетесь этим сервисом, а тестирование происходит через утилиту curl. Поэтому успехом будет считаться получение списка серверов после выполнения всех действий, а так же обзор инфраструктуры и понимание роли consul в ней.

Подготовка

  • Форкните или склонируйте репозиторий с примером инфраструктуры

  • Выполните инициализацию Terraform в директории terraform и создайте инфраструктуру.

  • Скопируйте IP адреса серверов в ansible/hosts из вывода Terraform. В каждой группе должно быть по одному хосту. В группе серверов с алиас хоста — server1, в группе клиентов — client1.

  • Выполните подготовку серверов командой make setup-servers. Команда выполнит подготовку серверов: установит необходимые модули для Docker и отключит фаервол (Для простоты тестирования данной практики - в реальном проекте не отключайте, а настраивайте фаервол. Подробнее это разбиралось в уроке Безопасность).

Подготовка окружения завершена, теперь необходимо связать клиент Consul с сервером. Агенты Consul будут запускаться внутри Docker контейнеров. Для того чтобы они могли между собой общаться, им необходимо указать IP адреса из приватной подсети. В качестве такой сети будем использовать VPC которая предоставляется Digital Ocean.

Настройка Service Discovery

  • В файле ansible/group_vars/all.yml опишите переменную advertise_ip, в которой будет храниться IP адрес из предоставляемой VPC. Чтобы это сделать, вам необходимо собрать факты о сервере и отфильтровать IP адреса по верной подсети. Этот IP адрес будет выставлять агент Consul, чтобы его могли найти другие агенты.

  • В файле ansible/common/register_consul_server_ip.yml опишите задачу, которая зарегистрирует в переменную consul_server_ip IP адрес в приватной подсети. Принцип такой же, как и на предыдущем шаге, только данные нужно взять из consul_server_facts

  • Выполните команду make setup-consul-server. Откройте в браузере http://&lt;server_ip&gt;:8500. По этому адресу открывается страница с дашбордом Consul. Убедитесь, что отображается запущенный сервер Consul и других нод нет

  • Зайдите по ssh на сервер с сервером Consul. Выполните docker exec consul-server consul members и убедитесь, что запущена одна нода

  • Выполните запрос с помощью curl по адресу http://&lt;server_ip&gt;:8500/v1/catalog/nodes Убедитесь, что в списке только нода сервера

  • Выполните команду make setup-consul-client. Команда запустит на втором сервере Consul, который будет клиентом. Выполните предыдущие действия: посмотрите изменения в дашборде Consul, выполните consul members (выполните эту команду в контейнере на сервере и с клиентом), выполните запрос к API сервера Consul.

  • Выполните команду make register-consul-service. Команда запустит контейнер с приложением, скопирует конфиг и перезапустит контейнер с клиентом Consul. Теперь наше приложение будет доступно в дашборде и по api сервера Consul по адресу http://&lt;server_ip&gt;:8500/v1/catalog/service/devops

Урок «Serverless»

Lambda — сервис Amazon, который позволяет создавать простые бессерверные приложения. Особенности и преимущества Lambda описаны на странице продукта.

В данном задании используется Serverless.com — фреймворк, который позволяет создавать serverless-приложения не только на Amazon, но и на других облачных провайдерах. В данном задании задеплоим на AWS Lambda бота для Telegram, который возвращает сообщение, введённое пользователем. Подобная задача — это лишь пример того, что можно сделать, например среди предлагаемых функций ``из коробки'' Amazon Lambda предлагает обработку изображений (сжатие, создание превью).

Яндекс Клауд предлагает аналогичные функци для работы с бессерверными приложениями. Если по каким-то причинам вы не сможете использовать Serverless.com и AWS, вы сможете всё сделать и на Яндексе. Serverless позволяет это сделать более автоматизированно.

  • Создайте аккаунт в AWS, если у вас его ещё нет

  • Зарегистрируйтесь в Telegram, если у вас нет аккаунта

  • Подготовьте окружение для работы с Serverless. Вам потребуется NodeJS 12+ версии и глобально установленная утилита

npm install -g serverless
  • Создайте IAM пользователя в AWS

    • Войдите в IAM https://console.aws.amazon.com/iam/home#/home

    • AWS access type — Programmatic access

    • Выберите Attach existing policies directly, permissions - AdministratorAccess

    • Теги по желанию

    • Сохраните Access key ID и Secret access key, они требуются для доступа к AWS через утилиту

  • Создайте бота в Telegram — @BotFather. Отправьте боту @BotFather сообщение /newbot, чтобы начать создание бота. После ответов на несколько вопросов бот пришлет токен, который используется для бота

  • Склонируйте или форкните репозиторий и выполните установку зависимостей командой make install

  • Для деплоя нам потребуются созданные ключи. Их можно экспортировать или использовать в команде деплоя

export AWS_ACCESS_KEY_ID=<key_id>
export AWS_SECRET_ACCESS_KEY=<access_key>
cd echobot
make deploy

# либо
AWS_ACCESS_KEY_ID=<key_id> AWS_SECRET_ACCESS_KEY=<access_key> make deploy
  • Если все выполнено корректно, наше приложение будет задеплоено в AWS Lambda, и оно будет отображаться в интерфейсе (в каждом регионе отображаются свои приложения). Вывод сообщит информацию о приложении, пример:

Serverless: Stack update finished...
Service Information
service: hexlet-telegram-echo-bot
stage: dev
region: us-east-1
stack: hexlet-telegram-echo-bot-dev
resources: 11
api keys:
  None
endpoints:
  POST - https://ogarnze2r3.execute-api.us-east-1.amazonaws.com/dev/webhook
functions:
  webhook: hexlet-telegram-echo-bot-dev-webhook
layers:
  None
  • Чтобы бот отправлял запросы на наш бекенд, необходимо изменить вебхук бота. Выполните команду:

make set-webhook BOT_TOKEN=<token> URL=<webhook_endpoint>
  • В AWS Lambda используется переменная окружения для подключения к Telegram. Необходимо указать эту переменную. Войдите в AWS Lambda, на вкладке Applications найдите приложение. На вкладке будут созданные ресурсы для этого приложения. Код исполняется с помощью function. Откройте ресурс WebhookLambdaFunction на вкладке Configuration откройте раздел Environment variables и добавьте переменную BOT_TOKEN

  • Отправьте сообщение вашему боту. Если все сделано правильно, то он будет возвращать сообщение, которое ему отправили

Serverless.com — это обёртка над другими сервисами. Код бота, который был сформирован и задеплоен попал на AWS. Serverless создал несколько ресурсов используя сервисы Amazon:

  • Lambda Function для выполнения кода

  • S3 Bucket для деплоя исходного кода

  • ApiGateway для получения запросов от Telegram по HTTP

  • CloudWatch для выполнения логирования

Урок «Zerocoding»

Zerocoding, no-code, low-code — это направление в котором вы почти не пишите или не пишете код, а собираете команды из блоков, соединяя между собой разные компоненты. Примеры сервисов, которые позволяют это сделать — IFTT, Zapier, Pipedream. Для чего это нужно? Это позволяет решить небольшие задачи по интеграции нескольких сервисов между собой. К примеру, IFTT расшифровывается как If This Then That — Если это, то это. Два сервиса соединяются между собой, на первом сервисе происходит триггер (происходит событие), что приводит к какому-то действию на другом, при этом сервисы могут быть разные (например Github, Trello), так и один и тот же. Некоторые сервисы, например Workflow Builder в мессенджере Slack позволяют строить не просто связку событие и действие, но и цепочку действий, которые строятся друг за другом. Более сложные сервисы могут предлагать условные ветвления.

На Хекслете используются Zapier и Pipedream. С их помощью мы получаем различные уведомления об оплатах, результаты опросов, различную аналитику (открытые тикеты). Вся эта информация отправляется нам в Slack в отдельные каналы, где сбор информации автоматизирован. Данные интеграции могут создавать не только разработчики, но и любые участники команды — карьерные консультанты, кураторы, менеджеры по продажам, агенты поддержки.

  • Зарегистрируйтесь в zapier.com и создайте интеграцию между двумя сервисами любыми сервисами. Примеры интеграций:

  • Github и Google Spreadsheets — добавлять в таблицу все issue, которые назначаются на пользователя (во всех репозиториях или в одном репозитории). Ссылка на пример

  • Github и Twitter — отправление твита при закрытии issue, при создании релиза или коммита в ветку

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