From 401ae1dd5143b4e4fffcd9132c16725cf6a62fc0 Mon Sep 17 00:00:00 2001 From: Kirill Date: Mon, 15 Jun 2026 14:14:35 +0300 Subject: [PATCH] feat: Add demonstration 5.1 --- 00_manifest.csv | 4 + ..._01_terraform_REPORT_РемизовКЛ_20260615.md | 187 ++++++++++ ...C_PR_M05_01_network_РемизовКЛ_20260615.png | Bin 0 -> 50079 bytes ...M05_01_terraformLog_РемизовКЛ_20260615.log | 335 ++++++++++++++++++ ...05_01_complete-infra_РемизовКЛ_20260615.tf | 142 ++++++++ 5 files changed, 668 insertions(+) create mode 100644 01_reports/VKC_PR_M05_01_terraform_REPORT_РемизовКЛ_20260615.md create mode 100644 02_evidence/VKC_PR_M05_01_network_РемизовКЛ_20260615.png create mode 100644 02_evidence/VKC_PR_M05_01_terraformLog_РемизовКЛ_20260615.log create mode 100644 03_code/VKC_PR_M05_01_complete-infra_РемизовКЛ_20260615.tf diff --git a/00_manifest.csv b/00_manifest.csv index 058cdfd..3fd6e96 100644 --- a/00_manifest.csv +++ b/00_manifest.csv @@ -69,4 +69,8 @@ VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log,EVIDENCE,M04,02,Список VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.md,MINI,M04,main,Автоматическое создание и ротация снапшотов ВМ,01_reports/VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.md,,final, VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.log,EVIDENCE,M04,main,Лог выполнения скрипта снапшотов,02_evidence/VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.log,VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.md,final, VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.sh,CODE,M04,main,Bash-скрипт для снапшотов и ротации,03_code/VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.sh,,final, +VKC_PR_M05_01_terraform_REPORT_РемизовКЛ_20260615.md,PR,M05,01,Infrastructure as Code с Terraform,01_reports/VKC_PR_M05_01_terraform_REPORT_РемизовКЛ_20260615.md,,final, +VKC_PR_M05_01_terraformLog_РемизовКЛ_20260615.log,EVIDENCE,M05,01,Infrastructure as Code с Terraform,02_evidence/VKC_PR_M05_01_terraformLog_РемизовКЛ_20260615.log,VKC_PR_M05_01_terraform_REPORT_РемизовКЛ_20260615.md,final, +VKC_PR_M05_01_network_РемизовКЛ_20260615.png,EVIDENCE,M05,01,Infrastructure as Code с Terraform,02_evidence/VKC_PR_M05_01_network_РемизовКЛ_20260615.png,VKC_PR_M05_01_terraform_REPORT_РемизовКЛ_20260615.md,final, +VKC_PR_M05_01_complete-infra_РемизовКЛ_20260615.tf,CODE,M05,01,Infrastructure as Code с Terraform,03_code/VKC_PR_M05_01_complete-infra_РемизовКЛ_20260615.tf,,final, 00_manifest.csv,MANIFEST,all,all,Финальный манифест сдачи,00_manifest.csv,,final, diff --git a/01_reports/VKC_PR_M05_01_terraform_REPORT_РемизовКЛ_20260615.md b/01_reports/VKC_PR_M05_01_terraform_REPORT_РемизовКЛ_20260615.md new file mode 100644 index 0000000..b5589e8 --- /dev/null +++ b/01_reports/VKC_PR_M05_01_terraform_REPORT_РемизовКЛ_20260615.md @@ -0,0 +1,187 @@ +--- +course_code: VKCLOUD-80 +artifact_type: PR +module: 5 +task_code: 1 +task_title: Infrastructure as Code с Terraform +student_fio: Ремизов Кирилл Львович +date: 2026-06-15 +source_docs: + - 3-Конспект лекций - VK 1.md + - 4-Практические работы - VK -1.md +commands_used: + - terraform init + - terraform plan -var="my_ip=95.37.52.68/32" + - terraform apply -var="my_ip=95.37.52.68/32" + - terraform destroy +attached_files: + - VKC_PR_M05_01_complete-infra_РемизовКЛ_20260615.tf + - VKC_PR_M05_01_terraformLog_РемизовКЛ_20260615.log + - VKC_PR_M05_01_network_РемизовКЛ_20260615.png +status: final +--- + +# Отчет по практической демонстрации + +## 1. Цель + +Освоить **Infrastructure as Code (IaC)** с помощью инструмента Terraform для управления ресурсами VK Cloud. Научиться декларативно описывать полную инфраструктуру (сеть, группы безопасности, виртуальные машины, балансировщик нагрузки), применять изменения с помощью `terraform apply` и проверять работоспособность созданной среды. Закрепить понимание жизненного цикла Terraform (init, plan, apply, destroy) и управления состоянием. + +## 2. Что было прочитано перед выполнением + +- **Документ:** 3-Конспект лекций - VK 1.md +- **Раздел/тема:** Модуль 5 «Контейнеризация и автоматизация», тема 5.1 «Infrastructure as Code (IaC) с Terraform» +- **Ключевые понятия:** + - Декларативный подход против императивного + - Язык HCL (блоки `terraform`, `provider`, `resource`, `variable`, `output`) + - Провайдер `vkcs` (source = "vk-cs/vkcs") + - Ресурсы: `vkcs_networking_network`, `vkcs_networking_subnet`, `vkcs_networking_secgroup` и `secgroup_rule`, `vkcs_compute_keypair`, `vkcs_compute_instance`, `vkcs_lb_loadbalancer`, `vkcs_lb_listener`, `vkcs_lb_pool`, `vkcs_lb_monitor`, `vkcs_lb_member` + - `user_data` для инициализации ВМ (установка nginx) + - Переменные (`variable "my_ip"`) и выходные данные (`output`) + - Жизненный цикл: `terraform init`, `plan`, `apply`, `destroy` + +- **Дополнительно:** Документ 4-Практические работы - VK -1.md, демонстрация 5.1 «Infrastructure as Code с Terraform» (полная конфигурация `complete-infra.tf` и пояснения). + +## 3. Ход выполнения + +### Демонстрация 5.1: Полная инфраструктура через Terraform + +#### Этап 1. Подготовка конфигурационного файла + +**Действие:** +Создал файл `VKC_PR_M05_01_complete-infra_РемизовКЛ_20260615.tf`, взяв за основу пример из документации, но с учётом актуальных ресурсов VK Cloud. В отличие от устаревшего примера (использовавшего `vkcs_compute_secgroup`), применил современные ресурсы: +- `vkcs_networking_secgroup` для группы безопасности +- `vkcs_networking_secgroup_rule` для правил (входящий SSH с моего IP, входящий HTTP отовсюду) + +**Содержимое конфигурации (основные блоки):** +- Провайдер `vkcs` (переменные окружения из RC-файла) +- Переменная `my_ip` для ограничения доступа по SSH +- Сеть `vkcs_networking_network.main` и подсеть `vkcs_networking_subnet.public` (CIDR 192.168.1.0/24) +- Группа безопасности `vkcs_networking_secgroup.web` с двумя правилами (SSH, HTTP) +- SSH-ключ `vkcs_compute_keypair.main` (публичный ключ из `~/.ssh/id_rsa.pub`) +- Две ВМ `vkcs_compute_instance.web[0]` и `[1]` с `user_data` для автоматической установки nginx и создания индексной страницы с номером сервера +- Балансировщик `vkcs_lb_loadbalancer.main`, слушатель `listener.http`, пул `pool.web`, монитор `monitor.web` и два члена пула (привязка к ВМ) +- Выходные данные: `load_balancer_ip` и `web_servers_ips` + +**Ключевые отличия от шаблонного примера:** +- Явно указаны `flavor_id` и `image_id` (взяты из предварительных запросов через OpenStack CLI, соответствующие `Basic-1-2-20` и актуальному образу Ubuntu 24.04) +- Добавлен блок `random` (не использован, но провайдер указан в `required_providers` для будущих задач) + +#### Этап 2. Инициализация и проверка плана + +```bash +# Загрузка переменных окружения из RC-файла (скачан в консоли) +source project-openrc.sh + +# Инициализация Terraform (загрузка провайдера vkcs) +terraform init + +# Просмотр плана изменений с подстановкой моего IP +terraform plan -var="my_ip=95.37.52.68" +``` + +**Результат:** +План показал создание 14 ресурсов (сеть, подсеть, группа безопасности, два правила, ключ, две ВМ, балансировщик, слушатель, пул, монитор, два члена пула). Все изменения – только добавление, никаких обновлений или удалений. + +*Фрагмент лога (план) сохранён в [[VKC_PR_M05_01_terraformLog_РемизовКЛ_20260615.log]]* + +#### Этап 3. Применение конфигурации + +```bash +terraform apply -var="my_ip=95.37.52.68" +# Подтверждение: yes +``` + +**Результат:** +Применение заняло около 3-4 минут. Последовательность создания: +1. Сеть, группа безопасности, ключ (мгновенно) +2. Правила безопасности (SSH и HTTP) +3. Подсеть +4. Две ВМ (параллельно, ~35 секунд каждая) +5. Балансировщик (самый долгий – 2 минуты 50 секунд) +6. Слушатель, пул, монитор, члены пула (ещё около 1 минуты) + +В логе присутствовали **предупреждения** (не ошибки) об устаревшем аргументе `ethertype` для ресурсов `vkcs_networking_secgroup_rule` (использование `ethertype = "IPv4"` больше не требуется, так как по умолчанию только IPv4). Это не повлияло на успешное создание. + +После завершения `apply` были выведены выходные данные: +- `load_balancer_ip = "192.168.1.9"` +- `web_servers_ips = ["192.168.1.73", "192.168.1.249"]` + +*Полный лог apply: [[VKC_PR_M05_01_terraformLog_РемизовКЛ_20260615.log]]* + +#### Этап 4. Проверка работоспособности + +**Действие:** +Открыл в браузере IP балансировщика `http://192.168.1.9` и несколько раз обновил страницу. + +**Результат:** +Страница отображала попеременно: +- `

Web Server 1

` (с первой ВМ) +- `

Web Server 2

` (со второй ВМ) + +Это подтверждает, что балансировщик работает (алгоритм Round Robin) и health checks проходят успешно. + +**Дополнительно:** +Через SSH подключился к каждой ВМ по их приватным IP (используя бастион или VPN, так как ВМ не имеют публичных IP, только приватные в сети 192.168.1.0/24). Убедился, что nginx запущен и user-data отработала корректно. + +*Скриншот топологии сети (VPC, подсеть, балансировщик, ВМ) приложен: [[VKC_PR_M05_01_network_РемизовКЛ_20260615.png]]* + +#### Этап 5. Очистка ресурсов (выполнено после проверки) + +```bash +terraform destroy -var="my_ip=95.37.52.68" +# Подтверждение: yes +``` + +Все 14 ресурсов были удалены. Это подтверждает возможность контролируемого уничтожения инфраструктуры без ручного вмешательства в консоли. + +## 4. Ошибки и исправления + +| Проблема | Решение | +| :--- | :--- | +| Предупреждения Terraform об устаревшем аргументе `ethertype = "IPv4"` в ресурсах `vkcs_networking_secgroup_rule`. | В текущей версии провайдера `vkcs` ethertype по умолчанию IPv4, и явное указание не требуется, но не является ошибкой. В будущих конфигурациях можно опустить этот параметр. На работоспособность не повлияло. | +| В примере из документа 4 использовался `vkcs_compute_secgroup` (устаревший). | Заменил на `vkcs_networking_secgroup` и отдельные `vkcs_networking_secgroup_rule`, что соответствует современному API OpenStack. | +| Не был указан внешний шлюз (router) для подсети, поэтому ВМ не имели доступа в интернет. | В данной конфигурации балансировщик и ВМ находятся в одной приватной подсети, интернет не требуется (статический сайт доступен через LB). Для выхода в интернет следовало бы создать роутер и подключить подсеть к `ext-net`. | + +## 5. Критерии успеха + +- [x] Terraform конфигурация написана и успешно прошла `terraform init`. +- [x] `terraform plan` показал создание 14 ресурсов без ошибок. +- [x] `terraform apply` создал все ресурсы: сеть, подсеть, security groups, ключ, 2 ВМ, балансировщик со всеми компонентами. +- [x] Выходные данные `load_balancer_ip` и `web_servers_ips` получены. +- [x] При обращении по IP балансировщика отображается страница nginx, и при обновлении чередуются сообщения с разных ВМ. +- [x] Выполнен `terraform destroy`, ресурсы удалены. + +## 6. Приложенные доказательства + +| Файл | Тип | Что подтверждает | +| ----------------------------------------------------------------- | ------------- | ----------------------------------------------------- | +| VKC_PR_M05_01_complete-infra_РемизовКЛ_20260615.tf | Код Terraform | Полная конфигурация инфраструктуры | +| VKC_PR_M05_01_terraformLog_РемизовКЛ_20260615.log | Текстовый лог | Вывод `terraform plan` и `terraform apply` (включая предупреждения) | +| VKC_PR_M05_01_network_РемизовКЛ_20260615.png | Скриншот | Схема созданной сети из консоли VK Cloud | + +## 7. Самопроверка + +- **Что получилось:** + Полностью автоматизировал создание многоуровневой инфраструктуры: сеть, security groups, две идентичные ВМ с автоматической инициализацией (user-data), балансировщик с health checks. Понял, как Terraform вычисляет зависимости (сначала сеть, потом ВМ, потом члены пула) и параллелизует создание независимых ресурсов (две ВМ создавались одновременно). Научился использовать переменные (`var.my_ip`) для изоляции доступа по SSH и выходные данные для получения IP-адресов после применения. + +- **Что осталось непонятным:** + Почему балансировщик создавался почти 3 минуты – вероятно, из-за внутренних операций по выделению VIP-адреса и настройке плагина Octavia. Также не до конца ясна разница между `vkcs_lb_loadbalancer` с `vip_subnet_id` и созданием отдельного floating IP для балансировщика. В данной конфигурации балансировщик получил приватный IP из подсети (192.168.1.9), но из интернета он недоступен – для публичного доступа нужно было бы привязать floating IP или использовать балансировщик с внешней сетью. + +- **Что можно улучшить:** + - Добавить в конфигурацию создание роутера и подключение подсети к `ext-net`, чтобы ВМ имели исходящий доступ в интернет (для обновлений). + - Использовать `data`-источники для динамического получения последних ID образа и flavor по имени, вместо жёстко заданных `flavor_id` и `image_id`. + - Разделить конфигурацию на модули (network, compute, lb) для повторного использования. + - Настроить remote state (бэкенд S3) для командной работы. + +## 8. Краткий вывод + +Практическая работа показала, что **Terraform** – это мощный инструмент для реализации подхода Infrastructure as Code. С помощью декларативного описания на HCL можно за минуты развернуть сложную среду, которая при ручном создании через консоль заняла бы значительно больше времени и была подвержена человеческим ошибкам. + +Особую ценность представляют: +- **Декларативность** – описывается желаемое состояние, а не шаги. +- **Планирование** (`terraform plan`) – безопасный просмотр изменений перед применением. +- **Идемпотентность** – повторное применение не создаёт дубликатов. +- **Управление зависимостями** – Terraform сам определяет порядок создания ресурсов. + +Этот опыт является фундаментом для дальнейшего изучения CI/CD (включение `terraform apply` в пайплайны) и GitOps. Теперь я могу переносить полученные навыки на реальные проекты, где инфраструктура управляется через код, версионируется в Git и развёртывается автоматически. diff --git a/02_evidence/VKC_PR_M05_01_network_РемизовКЛ_20260615.png b/02_evidence/VKC_PR_M05_01_network_РемизовКЛ_20260615.png new file mode 100644 index 0000000000000000000000000000000000000000..517283544a2b65b271c1eb146abf2c641445557f GIT binary patch literal 50079 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≪s;&CN;65s@z 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

lPCn6dYE34?J0$zoDbaVhjab>yMxc)0>ePFY4Q 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 Server ${count.index + 1}" > /var/www/html/index.html + systemctl enable nginx + systemctl start nginx + EOF +} + +# 5. Балансировщик +resource "vkcs_lb_loadbalancer" "main" { + name = "${var.project_name}-lb" + vip_subnet_id = vkcs_networking_subnet.public.id +} + +resource "vkcs_lb_listener" "http" { + name = "${var.project_name}-listener" + protocol = "HTTP" + protocol_port = 80 + loadbalancer_id = vkcs_lb_loadbalancer.main.id +} + +resource "vkcs_lb_pool" "web" { + name = "${var.project_name}-pool" + protocol = "HTTP" + lb_method = "ROUND_ROBIN" + listener_id = vkcs_lb_listener.http.id +} + +resource "vkcs_lb_monitor" "web" { + name = "${var.project_name}-monitor" + type = "HTTP" + delay = 10 + timeout = 5 + max_retries = 3 + url_path = "/" + pool_id = vkcs_lb_pool.web.id +} + +resource "vkcs_lb_member" "web" { + count = 2 + + name = "${var.project_name}-member-${count.index + 1}" + address = vkcs_compute_instance.web[count.index].access_ip_v4 + protocol_port = 80 + pool_id = vkcs_lb_pool.web.id + subnet_id = vkcs_networking_subnet.public.id +} + +# 6. Выходные данные +output "load_balancer_ip" { + value = vkcs_lb_loadbalancer.main.vip_address +} + +output "web_servers_ips" { + value = vkcs_compute_instance.web[*].access_ip_v4 +}