From e0b957db282b51ad6ea1af0785f3c953f1f5a511 Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Thu, 23 Oct 2025 20:57:51 +0500 Subject: [PATCH 01/30] Update hw-01.md --- 01/hw-01.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/01/hw-01.md b/01/hw-01.md index 9cc9b37c..94457628 100644 --- a/01/hw-01.md +++ b/01/hw-01.md @@ -9,9 +9,7 @@ ### Чек-лист готовности к домашнему заданию -1. Скачайте и установите **Terraform** версии >=1.8.4 . Приложите скриншот вывода команды ```terraform --version```. -2. Скачайте на свой ПК этот git-репозиторий. Исходный код для выполнения задания расположен в директории **01/src**. -3. Убедитесь, что в вашей ОС установлен docker. +image ------ From 5377b4ff854e043867a191882d0ca65576952c9b Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Thu, 23 Oct 2025 21:50:04 +0500 Subject: [PATCH 02/30] Update hw-01.md --- 01/hw-01.md | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/01/hw-01.md b/01/hw-01.md index 94457628..440bb7c4 100644 --- a/01/hw-01.md +++ b/01/hw-01.md @@ -18,20 +18,43 @@ 1. Репозиторий с ссылкой на зеркало для установки и настройки Terraform: [ссылка](https://github.com/netology-code/devops-materials). 2. Установка docker: [ссылка](https://docs.docker.com/engine/install/ubuntu/). ------ -### Внимание!! Обязательно предоставляем на проверку получившийся код в виде ссылки на ваш github-репозиторий! ------- ### Задание 1 -1. Перейдите в каталог [**src**](https://github.com/netology-code/ter-homeworks/tree/main/01/src). Скачайте все необходимые зависимости, использованные в проекте. -2. Изучите файл **.gitignore**. В каком terraform-файле, согласно этому .gitignore, допустимо сохранить личную, секретную информацию?(логины,пароли,ключи,токены итд) -3. Выполните код проекта. Найдите в state-файле секретное содержимое созданного ресурса **random_password**, пришлите в качестве ответа конкретный ключ и его значение. +1. Терраформ инициализирован, зависимости скачаны + +image + +2. Личную секретную информациюдопустимо хранить в `personal.auto.tfvars`, т.к. он игнорируется и не попадает в репозиторий. И более того, он даже подписан комментарием `# own secret vars store.` + +3. Безуспешные попытки получить пароль средствами Терраформа: +image + +При этом пароь в явном виде есть в файле `terraform.tfstate` + +image + +Пароль: AgA2Q1IDjYamAdzh + 4. Раскомментируйте блок кода, примерно расположенный на строчках 29–42 файла **main.tf**. Выполните команду ```terraform validate```. Объясните, в чём заключаются намеренно допущенные ошибки. Исправьте их. -5. Выполните код. В качестве ответа приложите: исправленный фрагмент кода и вывод команды ```docker ps```. -6. Замените имя docker-контейнера в блоке кода на ```hello_world```. Не перепутайте имя контейнера и имя образа. Мы всё ещё продолжаем использовать name = "nginx:latest". Выполните команду ```terraform apply -auto-approve```. + +Ошибка 1: +> │ Error: Missing name for resource +> │ +> │ on main.tf line 24, in resource "docker_image": +> │ 24: resource "docker_image" { +> │ +> │ All resource blocks must have 2 labels (type, name). + + +6. Выполните код. В качестве ответа приложите: исправленный фрагмент кода и вывод команды ```docker ps```. + +7. Замените имя docker-контейнера в блоке кода на ```hello_world```. Не перепутайте имя контейнера и имя образа. Мы всё ещё продолжаем использовать name = "nginx:latest". Выполните команду ```terraform apply -auto-approve```. Объясните своими словами, в чём может быть опасность применения ключа ```-auto-approve```. Догадайтесь или нагуглите зачем может пригодиться данный ключ? В качестве ответа дополнительно приложите вывод команды ```docker ps```. + 8. Уничтожьте созданные ресурсы с помощью **terraform**. Убедитесь, что все ресурсы удалены. Приложите содержимое файла **terraform.tfstate**. + 9. Объясните, почему при этом не был удалён docker-образ **nginx:latest**. Ответ **ОБЯЗАТЕЛЬНО НАЙДИТЕ В ПРЕДОСТАВЛЕННОМ КОДЕ**, а затем **ОБЯЗАТЕЛЬНО ПОДКРЕПИТЕ** строчкой из документации [**terraform провайдера docker**](https://docs.comcloud.xyz/providers/kreuzwerker/docker/latest/docs). (ищите в классификаторе resource docker_image ) From 66afa5c2b05a67712fc62b351db11751e76ade11 Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Thu, 23 Oct 2025 22:07:25 +0500 Subject: [PATCH 03/30] Update hw-01.md --- 01/hw-01.md | 65 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 9 deletions(-) diff --git a/01/hw-01.md b/01/hw-01.md index 440bb7c4..eac462c7 100644 --- a/01/hw-01.md +++ b/01/hw-01.md @@ -36,17 +36,64 @@ Пароль: AgA2Q1IDjYamAdzh -4. Раскомментируйте блок кода, примерно расположенный на строчках 29–42 файла **main.tf**. -Выполните команду ```terraform validate```. Объясните, в чём заключаются намеренно допущенные ошибки. Исправьте их. +4. Ошибка 1: Missing name for resource -Ошибка 1: -> │ Error: Missing name for resource -> │ -> │ on main.tf line 24, in resource "docker_image": -> │ 24: resource "docker_image" { -> │ -> │ All resource blocks must have 2 labels (type, name). +image +Суть ошибки - в Terraform каждый ресурс должен иметь два лейбла (type, name), а в файле только "docker_image". + +Ошибка 2: Invalid resource name + +image + +Суть ошибки: Имя ресурса не может начинаться с цифры (1nginx). Имя должно начинаться с буквы или подчёркивания. Разрешены только буквы, цифры, подчёркивание и дефис. + +Ошибка 3: Reference to undeclared resource + +image + +Суть ошибки: задано имя ресурса `random_password.random_string_FAKE`, которого нет в конфигурации (нужно убрать `_FAKE`), нужно исправить последнюю букву в слове `resulT` на строчную. +Исправление: +``` +terraform { + required_providers { + docker = { + source = "kreuzwerker/docker" + version = "~> 3.0.1" + } + } + required_version = ">=1.8.4" /*Многострочный комментарий. + Требуемая версия terraform */ +} +provider "docker" {} + +#однострочный комментарий + +resource "random_password" "random_string" { + length = 16 + special = false + min_upper = 1 + min_lower = 1 + min_numeric = 1 +} + + +resource "docker_image" "nginx" { + name = "nginx:latest" + keep_locally = true +} + + +resource "docker_container" "nginx1" { + image = docker_image.nginx.image_id + name = "example_${random_password.random_string.result}" + + ports { + internal = 80 + external = 9090 + } +} +``` 6. Выполните код. В качестве ответа приложите: исправленный фрагмент кода и вывод команды ```docker ps```. From 0c96b429e2e7ed5727d658a7b0f53ae8dd01cee3 Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Thu, 23 Oct 2025 22:42:19 +0500 Subject: [PATCH 04/30] Update hw-01.md --- 01/hw-01.md | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/01/hw-01.md b/01/hw-01.md index eac462c7..922d9586 100644 --- a/01/hw-01.md +++ b/01/hw-01.md @@ -95,23 +95,36 @@ resource "docker_container" "nginx1" { } ``` -6. Выполните код. В качестве ответа приложите: исправленный фрагмент кода и вывод команды ```docker ps```. +5. Исправленный main.tf выше. +Вывод команды `docker ps`: -7. Замените имя docker-контейнера в блоке кода на ```hello_world```. Не перепутайте имя контейнера и имя образа. Мы всё ещё продолжаем использовать name = "nginx:latest". Выполните команду ```terraform apply -auto-approve```. -Объясните своими словами, в чём может быть опасность применения ключа ```-auto-approve```. Догадайтесь или нагуглите зачем может пригодиться данный ключ? В качестве ответа дополнительно приложите вывод команды ```docker ps```. +image -8. Уничтожьте созданные ресурсы с помощью **terraform**. Убедитесь, что все ресурсы удалены. Приложите содержимое файла **terraform.tfstate**. -9. Объясните, почему при этом не был удалён docker-образ **nginx:latest**. Ответ **ОБЯЗАТЕЛЬНО НАЙДИТЕ В ПРЕДОСТАВЛЕННОМ КОДЕ**, а затем **ОБЯЗАТЕЛЬНО ПОДКРЕПИТЕ** строчкой из документации [**terraform провайдера docker**](https://docs.comcloud.xyz/providers/kreuzwerker/docker/latest/docs). (ищите в классификаторе resource docker_image ) +6. Опасность применения ключа `-auto-approve` в том, что он позволяет применить все изменения без подтверждения. Т.е. есть явный риск случайно удалить или изменить важные ресурсы без предварительной проверки. +Польза - для автоматизации, когда код заведомо работает и подтверждения не требуется, либо для тестовой среды, где нет риска удалить что-то важное. + +Новый вывод команды ```docker ps```. + +image + + +8. Ресурсы уничтожены: + +image + +Содержимое файла **terraform.tfstate**: + +image + + +9. При уничтожении ресурсов с помощью команды `terraform destroy` Docker-образ `nginx:latest` не был удалён и остался на сервере, потому что в коде нет указания его удалить. В Terraform-провайдере Docker для ресурса docker_image это управляется параметром `keep_locally`. Если `keep_locally = false`, образ будет удалён; если keep_locally = true или параметр не задан, образ останется на сервере. ------ ## Дополнительное задание (со звёздочкой*) -**Настоятельно рекомендуем выполнять все задания со звёздочкой.** Они помогут глубже разобраться в материале. -Задания со звёздочкой дополнительные, не обязательные к выполнению и никак не повлияют на получение вами зачёта по этому домашнему заданию. - ### Задание 2* 1. Создайте в облаке ВМ. Сделайте это через web-консоль, чтобы не слить по незнанию токен от облака в github(это тема следующей лекции). Если хотите - попробуйте сделать это через terraform, прочитав документацию yandex cloud. Используйте файл ```personal.auto.tfvars``` и гитигнор или иной, безопасный способ передачи токена! From 99b5bb89c621dae0486769b68575f52b1a9515ac Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Thu, 23 Oct 2025 23:47:48 +0500 Subject: [PATCH 05/30] Update hw-01.md --- 01/hw-01.md | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/01/hw-01.md b/01/hw-01.md index 922d9586..505add56 100644 --- a/01/hw-01.md +++ b/01/hw-01.md @@ -109,7 +109,7 @@ resource "docker_container" "nginx1" { image -8. Ресурсы уничтожены: +7. Ресурсы уничтожены: image @@ -117,8 +117,7 @@ resource "docker_container" "nginx1" { image - -9. При уничтожении ресурсов с помощью команды `terraform destroy` Docker-образ `nginx:latest` не был удалён и остался на сервере, потому что в коде нет указания его удалить. В Terraform-провайдере Docker для ресурса docker_image это управляется параметром `keep_locally`. Если `keep_locally = false`, образ будет удалён; если keep_locally = true или параметр не задан, образ останется на сервере. +8. При уничтожении ресурсов с помощью команды `terraform destroy` Docker-образ `nginx:latest` не был удалён и остался на сервере, потому что в коде нет указания его удалить. В Terraform-провайдере Docker для ресурса docker_image это управляется параметром `keep_locally`. Если `keep_locally = false`, образ будет удалён; если keep_locally = true или параметр не задан, образ останется на сервере. ------ @@ -130,17 +129,13 @@ resource "docker_container" "nginx1" { 1. Создайте в облаке ВМ. Сделайте это через web-консоль, чтобы не слить по незнанию токен от облака в github(это тема следующей лекции). Если хотите - попробуйте сделать это через terraform, прочитав документацию yandex cloud. Используйте файл ```personal.auto.tfvars``` и гитигнор или иной, безопасный способ передачи токена! 2. Подключитесь к ВМ по ssh и установите стек docker. 3. Найдите в документации docker provider способ настроить подключение terraform на вашей рабочей станции к remote docker context вашей ВМ через ssh. -4. Используя terraform и remote docker context, скачайте и запустите на вашей ВМ контейнер ```mysql:8``` на порту ```127.0.0.1:3306```, передайте ENV-переменные. Сгенерируйте разные пароли через random_password и передайте их в контейнер, используя интерполяцию из примера с nginx.(```name = "example_${random_password.random_string.result}"``` , двойные кавычки и фигурные скобки обязательны!) -``` - environment: - - "MYSQL_ROOT_PASSWORD=${...}" - - MYSQL_DATABASE=wordpress - - MYSQL_USER=wordpress - - "MYSQL_PASSWORD=${...}" - - MYSQL_ROOT_HOST="%" -``` +4. (Не нашёл в доке kreuzwerker/docker способа поднять контейнер именно на 127.0.0.1) +`main.tf` получился такой: + +5. Наличие секретных env-переменных в контейнере: + +image -6. Зайдите на вашу ВМ , подключитесь к контейнеру и проверьте наличие секретных env-переменных с помощью команды ```env```. Запишите ваш финальный код в репозиторий. ### Задание 3* 1. Установите [opentofu](https://opentofu.org/)(fork terraform с лицензией Mozilla Public License, version 2.0) любой версии From c84dc30609f412a0fa0a7355c77cd63c2941fa7a Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Thu, 23 Oct 2025 23:54:30 +0500 Subject: [PATCH 06/30] =?UTF-8?q?=D0=94=D0=BE=D0=BC=D0=B0=D1=88=D0=BD?= =?UTF-8?q?=D1=8F=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=BE=D0=BF=D0=BB=D0=BD=D0=B5=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 01/src/.terraformrc | 6 +++--- 01/src/main.tf | 47 ++++++++++++++++++++++++++++----------------- 2 files changed, 32 insertions(+), 21 deletions(-) diff --git a/01/src/.terraformrc b/01/src/.terraformrc index 9bc77282..1fc85eb5 100644 --- a/01/src/.terraformrc +++ b/01/src/.terraformrc @@ -1,9 +1,9 @@ provider_installation { network_mirror { - url = "https://terraform-mirror.yandexcloud.net/" - include = ["registry.terraform.io/*/*"] + url = "https://registry.comcloud.xyz/" } direct { exclude = ["registry.terraform.io/*/*"] } -} \ No newline at end of file +} + diff --git a/01/src/main.tf b/01/src/main.tf index 18f88532..3ac9c4cf 100644 --- a/01/src/main.tf +++ b/01/src/main.tf @@ -8,31 +8,42 @@ terraform { required_version = ">=1.8.4" /*Многострочный комментарий. Требуемая версия terraform */ } -provider "docker" {} -#однострочный комментарий +provider "docker" { + host = "ssh://wqtr@89.169.167.232:22" +} -resource "random_password" "random_string" { - length = 16 - special = false - min_upper = 1 - min_lower = 1 - min_numeric = 1 +resource "random_password" "mysql_root" { + length = 16 + upper = true + lower = true + numeric = true + special = false } -/* -resource "docker_image" { - name = "nginx:latest" - keep_locally = true +resource "random_password" "mysql_user" { + length = 16 + upper = true + lower = true + numeric = true + special = false } -resource "docker_container" "1nginx" { - image = docker_image.nginx.image_id - name = "example_${random_password.random_string_FAKE.resulT}" +resource "docker_container" "mysql" { + image = "mysql:8" + name = "example_${random_password.mysql_root.result}" ports { - internal = 80 - external = 9090 + internal = 3306 + external = 3306 } + + env = [ + "MYSQL_ROOT_PASSWORD=${random_password.mysql_root.result}", + "MYSQL_DATABASE=wordpress", + "MYSQL_USER=wordpress", + "MYSQL_PASSWORD=${random_password.mysql_user.result}", + "MYSQL_ROOT_HOST=%" + ] } -*/ + From 8c026d064f95dd371f23aeb978fe5f1d511156c1 Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Fri, 24 Oct 2025 00:10:10 +0500 Subject: [PATCH 07/30] Update hw-01.md --- 01/hw-01.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/01/hw-01.md b/01/hw-01.md index 505add56..cce3ff5c 100644 --- a/01/hw-01.md +++ b/01/hw-01.md @@ -131,8 +131,9 @@ resource "docker_container" "nginx1" { 3. Найдите в документации docker provider способ настроить подключение terraform на вашей рабочей станции к remote docker context вашей ВМ через ssh. 4. (Не нашёл в доке kreuzwerker/docker способа поднять контейнер именно на 127.0.0.1) `main.tf` получился такой: +https://github.com/wiqt8r/terraform-homeworks/blob/main/01/src/main.tf -5. Наличие секретных env-переменных в контейнере: +6. Наличие секретных env-переменных в контейнере: image From c05f7e09aa4f4d164dd7d75548eaa44dc37719f3 Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Fri, 24 Oct 2025 00:11:05 +0500 Subject: [PATCH 08/30] Update hw-01.md --- 01/hw-01.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/01/hw-01.md b/01/hw-01.md index cce3ff5c..137f016f 100644 --- a/01/hw-01.md +++ b/01/hw-01.md @@ -126,14 +126,12 @@ resource "docker_container" "nginx1" { ### Задание 2* -1. Создайте в облаке ВМ. Сделайте это через web-консоль, чтобы не слить по незнанию токен от облака в github(это тема следующей лекции). Если хотите - попробуйте сделать это через terraform, прочитав документацию yandex cloud. Используйте файл ```personal.auto.tfvars``` и гитигнор или иной, безопасный способ передачи токена! -2. Подключитесь к ВМ по ssh и установите стек docker. -3. Найдите в документации docker provider способ настроить подключение terraform на вашей рабочей станции к remote docker context вашей ВМ через ssh. -4. (Не нашёл в доке kreuzwerker/docker способа поднять контейнер именно на 127.0.0.1) +(Не нашёл в доке kreuzwerker/docker способа поднять контейнер именно на 127.0.0.1) + `main.tf` получился такой: https://github.com/wiqt8r/terraform-homeworks/blob/main/01/src/main.tf -6. Наличие секретных env-переменных в контейнере: +Наличие секретных env-переменных в контейнере: image From 9f411abb83a8d331728a8d2c9e7dee337cb3d57d Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Fri, 24 Oct 2025 00:12:41 +0500 Subject: [PATCH 09/30] Update hw-01.md --- 01/hw-01.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/01/hw-01.md b/01/hw-01.md index 137f016f..930a980c 100644 --- a/01/hw-01.md +++ b/01/hw-01.md @@ -34,7 +34,9 @@ image -Пароль: AgA2Q1IDjYamAdzh + +**Пароль: AgA2Q1IDjYamAdzh** + 4. Ошибка 1: Missing name for resource From 46eeeac841134fda07404c77b4c512f95f53cb68 Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Fri, 24 Oct 2025 01:03:58 +0500 Subject: [PATCH 10/30] Update hw-01.md --- 01/hw-01.md | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/01/hw-01.md b/01/hw-01.md index 930a980c..017cdd74 100644 --- a/01/hw-01.md +++ b/01/hw-01.md @@ -139,26 +139,38 @@ https://github.com/wiqt8r/terraform-homeworks/blob/main/01/src/main.tf ### Задание 3* -1. Установите [opentofu](https://opentofu.org/)(fork terraform с лицензией Mozilla Public License, version 2.0) любой версии -2. Попробуйте выполнить тот же код с помощью ```tofu apply```, а не terraform apply. ------- +1. Tofu установлен: + +image + +2. Получить провайдеры из registry.opentofu.org не вышло - видимо, санкции. +``` +Could not resolve provider kreuzwerker/docker: could not connect to registry.opentofu.org: failed to request discovery document: 403 Forbidden +``` +Скачал их с гитхаба. + +image + +Пришлось повозиться с `~/.tofurc` +``` +provider_installation { + filesystem_mirror { + path = "/home/wiqtor/.opentofu/plugins" + include = ["registry.opentofu.org/hashicorp/random", "registry.opentofu.org/kreuzwerker/docker"] + } +} +``` -### Правила приёма работы +Установил локально -Домашняя работа оформляется в отдельном GitHub-репозитории в файле README.md. -Выполненное домашнее задание пришлите ссылкой на .md-файл в вашем репозитории. +image -### Критерии оценки +Развернул: -Зачёт ставится, если: +image -* выполнены все задания, -* ответы даны в развёрнутой форме, -* приложены соответствующие скриншоты и файлы проекта, -* в выполненных заданиях нет противоречий и нарушения логики. +Работает: -На доработку работу отправят, если: +image -* задание выполнено частично или не выполнено вообще, -* в логике выполнения заданий есть противоречия и существенные недостатки. From 6c159ec65e12cbf039f1716d94fd8d638b2241d2 Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Fri, 24 Oct 2025 01:17:21 +0500 Subject: [PATCH 11/30] Update hw-01.md --- 01/hw-01.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/01/hw-01.md b/01/hw-01.md index 017cdd74..31a12726 100644 --- a/01/hw-01.md +++ b/01/hw-01.md @@ -151,7 +151,7 @@ Could not resolve provider kreuzwerker/docker: could not connect to registry.ope image -Пришлось повозиться с `~/.tofurc` +Пришлось повозиться с `~/.tofurc` и прописать явный путь к провайдерам. ``` provider_installation { filesystem_mirror { From 40bd62187f606c6320c62dd932a941758c196394 Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Fri, 24 Oct 2025 01:19:26 +0500 Subject: [PATCH 12/30] Update hw-01.md --- 01/hw-01.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/01/hw-01.md b/01/hw-01.md index 31a12726..822736f8 100644 --- a/01/hw-01.md +++ b/01/hw-01.md @@ -13,11 +13,6 @@ ------ -### Инструменты и дополнительные материалы, которые пригодятся для выполнения задания - -1. Репозиторий с ссылкой на зеркало для установки и настройки Terraform: [ссылка](https://github.com/netology-code/devops-materials). -2. Установка docker: [ссылка](https://docs.docker.com/engine/install/ubuntu/). ------- ### Задание 1 From a59d900ccde48f8fba3069e88c59431d70d120e1 Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Sat, 25 Oct 2025 15:39:18 +0500 Subject: [PATCH 13/30] Update hw-02.md --- 02/hw-02.md | 51 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/02/hw-02.md b/02/hw-02.md index aafadb13..439a1190 100644 --- a/02/hw-02.md +++ b/02/hw-02.md @@ -1,35 +1,44 @@ -# Домашнее задание к занятию «Основы Terraform. Yandex Cloud» +image# Домашнее задание к занятию «Основы Terraform. Yandex Cloud» -### Цели задания +### Задание 1 -1. Создать свои ресурсы в облаке Yandex Cloud с помощью Terraform. -2. Освоить работу с переменными Terraform. +Сервисный аккаунт и ключ созданы +image -### Чек-лист готовности к домашнему заданию +SSH-ключ есть, переменная `vms_ssh_public_root_key` записана в `personal.auto.tfvars` -1. Зарегистрирован аккаунт в Yandex Cloud. Использован промокод на грант. -2. Установлен инструмент Yandex CLI. -3. Исходный код для выполнения задания расположен в директории [**02/src**](https://github.com/netology-code/ter-homeworks/tree/main/02/src). +image + +Проект инициализируется, `terraform plan` завершается предупреждениями: +``` +Value for undeclared variable +The root module does not declare a variable named "service_account_key_file" +The root module does not declare a variable named "vms_ssh_public_root_key" +``` +То есть в personal.auto.tfvars указаны эти переменные, но в коде `variables.tf`` нет блоков variable с этими именами. Нужно добавить их: + +Возникает ошибка: + +image + +Потому что service_account_key_file задан явно, а не переменной: `service_account_key_file = file("~/.authorized_key.json")`. Надо сделать: `var.service_account_key_file`. + +image + +Возникают ошибки +"Platform "standart-v4" not found" - потому чти типа ВМ "standart-v4" в яндексе нет, нужно исправить main.tf и указать в ресурсе **platform_id = "standard-v3"** (т.е. Intel Ice Lake) +"the specified core fraction is not available" - потому что минимальный core fraction для прерываемой ВМ 20%. Нужно указать `core_fraction = 20`. +"the specified number of cores is not available" - потому что минимальное количество ядер для standard-v3 - 2 + +Ошибки в resource исправлены: +image -### Задание 0 -1. Ознакомьтесь с [документацией к security-groups в Yandex Cloud](https://cloud.yandex.ru/docs/vpc/concepts/security-groups?from=int-console-help-center-or-nav). -Этот функционал понадобится к следующей лекции. ------- -### Внимание!! Обязательно предоставляем на проверку получившийся код в виде ссылки на ваш github-репозиторий! ------- -### Задание 1 -В качестве ответа всегда полностью прикладывайте ваш terraform-код в git. -Убедитесь что ваша версия **Terraform** ~>1.8.4 -1. Изучите проект. В файле variables.tf объявлены переменные для Yandex provider. -2. Создайте сервисный аккаунт и ключ. [service_account_key_file](https://terraform-provider.yandexcloud.net). -4. Сгенерируйте новый или используйте свой текущий ssh-ключ. Запишите его открытую(public) часть в переменную **vms_ssh_public_root_key**. -5. Инициализируйте проект, выполните код. Исправьте намеренно допущенные синтаксические ошибки. Ищите внимательно, посимвольно. Ответьте, в чём заключается их суть. 6. Подключитесь к консоли ВМ через ssh и выполните команду ``` curl ifconfig.me```. Примечание: К OS ubuntu "out of a box, те из коробки" необходимо подключаться под пользователем ubuntu: ```"ssh ubuntu@vm_ip_address"```. Предварительно убедитесь, что ваш ключ добавлен в ssh-агент: ```eval $(ssh-agent) && ssh-add``` Вы познакомитесь с тем как при создании ВМ создать своего пользователя в блоке metadata в следующей лекции.; 8. Ответьте, как в процессе обучения могут пригодиться параметры ```preemptible = true``` и ```core_fraction=5``` в параметрах ВМ. From 0546a3d2f56886377c7516c1e970ef0abc6f993e Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Sat, 25 Oct 2025 15:43:38 +0500 Subject: [PATCH 14/30] Update hw-02.md --- 02/hw-02.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/02/hw-02.md b/02/hw-02.md index 439a1190..738c9912 100644 --- a/02/hw-02.md +++ b/02/hw-02.md @@ -1,4 +1,4 @@ -image# Домашнее задание к занятию «Основы Terraform. Yandex Cloud» +# Домашнее задание к занятию «Основы Terraform. Yandex Cloud» ### Задание 1 @@ -28,7 +28,7 @@ The root module does not declare a variable named "vms_ssh_public_root_key" Возникают ошибки "Platform "standart-v4" not found" - потому чти типа ВМ "standart-v4" в яндексе нет, нужно исправить main.tf и указать в ресурсе **platform_id = "standard-v3"** (т.е. Intel Ice Lake) -"the specified core fraction is not available" - потому что минимальный core fraction для прерываемой ВМ 20%. Нужно указать `core_fraction = 20`. +"the specified core fraction is not available" - потому что минимальная доля ЦПУ для ВМ 20%. Нужно указать `core_fraction = 20`. "the specified number of cores is not available" - потому что минимальное количество ядер для standard-v3 - 2 Ошибки в resource исправлены: From 009be4cb2fd085ceb4f2dbd4af9f31415455c238 Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Sat, 25 Oct 2025 16:07:53 +0500 Subject: [PATCH 15/30] Update hw-02.md --- 02/hw-02.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/02/hw-02.md b/02/hw-02.md index 738c9912..2c206c69 100644 --- a/02/hw-02.md +++ b/02/hw-02.md @@ -34,13 +34,19 @@ The root module does not declare a variable named "vms_ssh_public_root_key" Ошибки в resource исправлены: image +Также в main.tf указано `ssh-keys = "ubuntu:${var.vms_ssh_root_key}"`, исправлено на `${var.vms_ssh_public_root_key}"`, чтобы ключ корректно подкидывался в создаваемую ВМ. +После исправления -код исполняется, ресурс создан: +image + + +Посл подключения по SSH: + +image -6. Подключитесь к консоли ВМ через ssh и выполните команду ``` curl ifconfig.me```. -Примечание: К OS ubuntu "out of a box, те из коробки" необходимо подключаться под пользователем ubuntu: ```"ssh ubuntu@vm_ip_address"```. Предварительно убедитесь, что ваш ключ добавлен в ssh-агент: ```eval $(ssh-agent) && ssh-add``` Вы познакомитесь с тем как при создании ВМ создать своего пользователя в блоке metadata в следующей лекции.; 8. Ответьте, как в процессе обучения могут пригодиться параметры ```preemptible = true``` и ```core_fraction=5``` в параметрах ВМ. В качестве решения приложите: From 3358556eef792760572dd05d0b96a5da94c7f2c9 Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Sat, 25 Oct 2025 16:14:13 +0500 Subject: [PATCH 16/30] Update hw-02.md --- 02/hw-02.md | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/02/hw-02.md b/02/hw-02.md index 2c206c69..961b00e9 100644 --- a/02/hw-02.md +++ b/02/hw-02.md @@ -46,14 +46,10 @@ The root module does not declare a variable named "vms_ssh_public_root_key" image - -8. Ответьте, как в процессе обучения могут пригодиться параметры ```preemptible = true``` и ```core_fraction=5``` в параметрах ВМ. - -В качестве решения приложите: - -- скриншот ЛК Yandex Cloud с созданной ВМ, где видно внешний ip-адрес; -- скриншот консоли, curl должен отобразить тот же внешний ip-адрес; -- ответы на вопросы. +По поводу `preemptible = true` и `core_fraction=5` объяснялось на вебинаре. +- preemptible это прерываемая ВМ с ограниченным временем работы (до 24 часов), может быть автоматически остановлена в любой момент для высвобожения ресурсов. +- core fraction ограничивает гарантированную долю процессорного времени, которое доступно ВМ. Полезно для легких задач, не требующих значительной вычислительной мощности. +Оба параметра позволяют существенно экономить средства и запускать легковесные ВМ для экспериментов при учёбе. ### Задание 2 From 44e59dfdcb393bbe7f749b409648f6fd3445be6a Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Sat, 25 Oct 2025 17:10:36 +0500 Subject: [PATCH 17/30] Update hw-02.md --- 02/hw-02.md | 282 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 278 insertions(+), 4 deletions(-) diff --git a/02/hw-02.md b/02/hw-02.md index 961b00e9..1ae11cdc 100644 --- a/02/hw-02.md +++ b/02/hw-02.md @@ -56,14 +56,288 @@ The root module does not declare a variable named "vms_ssh_public_root_key" 1. Замените все хардкод-**значения** для ресурсов **yandex_compute_image** и **yandex_compute_instance** на **отдельные** переменные. К названиям переменных ВМ добавьте в начало префикс **vm_web_** . Пример: **vm_web_name**. 2. Объявите нужные переменные в файле variables.tf, обязательно указывайте тип переменной. Заполните их **default** прежними значениями из main.tf. -3. Проверьте terraform plan. Изменений быть не должно. +3. Проверьте terraform plan. Изменений быть не должно. + +Хардкод-значения в main.tf такие: +- name = "netology-develop-platform-web" - будет переменная vm_web_name +- platform_id = "standard-v3" - будет переменная vm_web_platform_id +- cores = 2 - будет переменная vm_web_cores +- memory = 1 - будет переменная vm_web_memory +- core_fraction = 20 - будет переменная vm_web_core_fraction +- preemptible = true - будет переменная vm_web_preemptible +- image_id в boot_disk.initialize_params - здесь использую data.yandex_compute_image.ubuntu.family через переменную vm_web_image_family + +Добавляю в `variables.tf`: +``` +variable "vm_web_name" { + type = string + default = "netology-develop-platform-web" +} + +variable "vm_web_platform_id" { + type = string + default = "standard-v3" +} + +variable "vm_web_cores" { + type = number + default = 2 +} + +variable "vm_web_memory" { + type = number + default = 1 +} + +variable "vm_web_core_fraction" { + type = number + default = 20 +} + +variable "vm_web_preemptible" { + type = bool + default = true +} + +variable "vm_web_image_family" { + type = string + default = "ubuntu-2004-lts" +} +``` + +Меняю `yandex_compute_image` и `yandex_compute_instance` в main.tf: +``` +data "yandex_compute_image" "ubuntu" { + family = var.vm_web_image_family +} + +resource "yandex_compute_instance" "platform" { + name = var.vm_web_name + platform_id = var.vm_web_platform_id + + resources { + cores = var.vm_web_cores + memory = var.vm_web_memory + core_fraction = var.vm_web_core_fraction + } + + boot_disk { + initialize_params { + image_id = data.yandex_compute_image.ubuntu.id + } + } + + scheduling_policy { + preemptible = var.vm_web_preemptible + } + + network_interface { + subnet_id = yandex_vpc_subnet.develop.id + nat = true + } + + metadata = { + serial-port-enable = 1 + ssh-keys = "ubuntu:${var.vms_ssh_public_root_key}" + } +} +``` + +В результате `terraform plan` отрабатывает корректно, `terraform apply` создаёт такую же ВМ: + +image + ### Задание 3 -1. Создайте в корне проекта файл 'vms_platform.tf' . Перенесите в него все переменные первой ВМ. -2. Скопируйте блок ресурса и создайте с его помощью вторую ВМ в файле main.tf: **"netology-develop-platform-db"** , ```cores = 2, memory = 2, core_fraction = 20```. Объявите её переменные с префиксом **vm_db_** в том же файле ('vms_platform.tf'). ВМ должна работать в зоне "ru-central1-b" -3. Примените изменения. +Изменения применены, разворачивается две ВМ в двух зонах доступности: + +image + +Текущий main.tf: +``` +resource "yandex_vpc_network" "develop" { + name = var.vpc_name +} + +# Первая подсеть для первой ВМ +resource "yandex_vpc_subnet" "develop" { + name = var.vpc_name + zone = var.default_zone + network_id = yandex_vpc_network.develop.id + v4_cidr_blocks = var.default_cidr +} + +# Вторая подсеть для второй ВМ +resource "yandex_vpc_subnet" "develop_b" { + name = "${var.vpc_name}-b" + zone = var.vm_db_zone + network_id = yandex_vpc_network.develop.id + v4_cidr_blocks = var.vm_db_cidr +} + +# Первая ВМ +data "yandex_compute_image" "ubuntu" { + family = var.vm_web_image_family +} + +resource "yandex_compute_instance" "platform" { + name = var.vm_web_name + platform_id = var.vm_web_platform_id + + resources { + cores = var.vm_web_cores + memory = var.vm_web_memory + core_fraction = var.vm_web_core_fraction + } + + boot_disk { + initialize_params { + image_id = data.yandex_compute_image.ubuntu.id + } + } + + scheduling_policy { + preemptible = var.vm_web_preemptible + } + + network_interface { + subnet_id = yandex_vpc_subnet.develop.id + nat = true + } + + metadata = { + serial-port-enable = 1 + ssh-keys = "ubuntu:${var.vms_ssh_public_root_key}" + } +} + +# Вторая ВМ +data "yandex_compute_image" "ubuntu_db" { + family = var.vm_db_image_family +} + +resource "yandex_compute_instance" "platform_db" { + name = var.vm_db_name + platform_id = var.vm_db_platform_id + + resources { + cores = var.vm_db_cores + memory = var.vm_db_memory + core_fraction = var.vm_db_core_fraction + } + + boot_disk { + initialize_params { + image_id = data.yandex_compute_image.ubuntu_db.id + } + } + + scheduling_policy { + preemptible = var.vm_db_preemptible + } + + network_interface { + subnet_id = yandex_vpc_subnet.develop_b.id + nat = true + } + + zone = var.vm_db_zone + + metadata = { + serial-port-enable = 1 + ssh-keys = "ubuntu:${var.vms_ssh_public_root_key}" + } +} +``` + +Текущий vms_platform.tf: +``` +# Переменные первой ВМ + +variable "vm_web_name" { + type = string + default = "netology-develop-platform-web" +} + +variable "vm_web_platform_id" { + type = string + default = "standard-v3" +} + +variable "vm_web_cores" { + type = number + default = 2 +} + +variable "vm_web_memory" { + type = number + default = 1 +} + +variable "vm_web_core_fraction" { + type = number + default = 20 +} + +variable "vm_web_preemptible" { + type = bool + default = true +} + +variable "vm_web_image_family" { + type = string + default = "ubuntu-2004-lts" +} + +# Переменные второй ВМ + +variable "vm_db_name" { + type = string + default = "netology-develop-platform-db" +} + +variable "vm_db_platform_id" { + type = string + default = "standard-v3" +} + +variable "vm_db_cores" { + type = number + default = 2 +} + +variable "vm_db_memory" { + type = number + default = 2 +} + +variable "vm_db_core_fraction" { + type = number + default = 20 +} + +variable "vm_db_preemptible" { + type = bool + default = true +} + +variable "vm_db_image_family" { + type = string + default = "ubuntu-2004-lts" +} + +variable "vm_db_zone" { + type = string + default = "ru-central1-b" +} + +variable "vm_db_cidr" { + type = list(string) + default = ["10.0.2.0/24"] +} +``` ### Задание 4 From c6fa2103b17b9765fd1f80867dc7639b31901121 Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Sat, 25 Oct 2025 17:32:58 +0500 Subject: [PATCH 18/30] Update hw-02.md --- 02/hw-02.md | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/02/hw-02.md b/02/hw-02.md index 1ae11cdc..9a522b41 100644 --- a/02/hw-02.md +++ b/02/hw-02.md @@ -342,10 +342,29 @@ variable "vm_db_cidr" { ### Задание 4 -1. Объявите в файле outputs.tf **один** output , содержащий: instance_name, external_ip, fqdn для каждой из ВМ в удобном лично для вас формате.(без хардкода!!!) -2. Примените изменения. +Содержимое outputs.tf: +``` +output "vms_info" { + description = "Созданные ВМ - результат:" + value = [ + { + instance_name = yandex_compute_instance.platform.name + external_ip = yandex_compute_instance.platform.network_interface[0].nat_ip_address + fqdn = yandex_compute_instance.platform.fqdn + }, + { + instance_name = yandex_compute_instance.platform_db.name + external_ip = yandex_compute_instance.platform_db.network_interface[0].nat_ip_address + fqdn = yandex_compute_instance.platform_db.fqdn + } + ] +} +``` + +Вывод `terraform output`: + +image -В качестве решения приложите вывод значений ip-адресов команды ```terraform output```. ### Задание 5 From da0f85cbd66e022cdaca0bd912a4f3a128e9fb42 Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Sun, 26 Oct 2025 16:03:08 +0500 Subject: [PATCH 19/30] Update hw-02.md --- 02/hw-02.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/02/hw-02.md b/02/hw-02.md index 9a522b41..cad56e2d 100644 --- a/02/hw-02.md +++ b/02/hw-02.md @@ -374,6 +374,33 @@ output "vms_info" { 3. Примените изменения. +Можно задвть в variables.tf переменные, из которых будем собирать имя: +``` +variable "environment" { + type = string + default = "develop" +} + +variable "role_web" { + type = string + default = "web" +} + +variable "role_db" { + type = string + default = "db" +} +``` +После этого в locals.tf задать блок с именами: +``` +locals { + vm_web_full_name = "${var.vpc_name}-${var.environment}-platform-${var.role_web}" + vm_db_full_name = "${var.vpc_name}-${var.environment}-platform-${var.role_db}" +} +``` + + + ### Задание 6 1. Вместо использования трёх переменных ".._cores",".._memory",".._core_fraction" в блоке resources {...}, объедините их в единую map-переменную **vms_resources** и внутри неё конфиги обеих ВМ в виде вложенного map(object). From fc08a5a414d002c417b3bd877706c830753b6e7e Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Sun, 26 Oct 2025 16:17:19 +0500 Subject: [PATCH 20/30] Update hw-02.md --- 02/hw-02.md | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/02/hw-02.md b/02/hw-02.md index cad56e2d..d343d63c 100644 --- a/02/hw-02.md +++ b/02/hw-02.md @@ -369,12 +369,7 @@ output "vms_info" { ### Задание 5 -1. В файле locals.tf опишите в **одном** local-блоке имя каждой ВМ, используйте интерполяцию ${..} с НЕСКОЛЬКИМИ переменными по примеру из лекции. -2. Замените переменные внутри ресурса ВМ на созданные вами local-переменные. -3. Примените изменения. - - -Можно задвть в variables.tf переменные, из которых будем собирать имя: +Поскольку задача использовать имменно несколько переменных - можно задвть в variables.tf переменные, из которых будем собирать имя: ``` variable "environment" { type = string @@ -398,6 +393,20 @@ locals { vm_db_full_name = "${var.vpc_name}-${var.environment}-platform-${var.role_db}" } ``` +А затем в main.tf прописать в name виртуальных машин поля из locals: +- В блоке `resource "yandex_compute_instance" "platform"`: +``` +name = local.vm_web_full_name +``` +- В блоке `resource "yandex_compute_instance" "platform_db"`: +``` +name = local.vm_db_full_name +``` + +В итоге получаем имена ВМ в аутпуте: + +image + From a193980c2816fe6d56c2f9530185aa9cbff4fa3c Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Sun, 26 Oct 2025 16:17:45 +0500 Subject: [PATCH 21/30] Update hw-02.md --- 02/hw-02.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/02/hw-02.md b/02/hw-02.md index d343d63c..f89d889d 100644 --- a/02/hw-02.md +++ b/02/hw-02.md @@ -373,7 +373,7 @@ output "vms_info" { ``` variable "environment" { type = string - default = "develop" + default = "env" } variable "role_web" { From 29cc866c6e26dc75a5c370ecfd33af5a5e1d78de Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Sun, 26 Oct 2025 16:34:17 +0500 Subject: [PATCH 22/30] Update hw-02.md --- 02/hw-02.md | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/02/hw-02.md b/02/hw-02.md index f89d889d..4776558e 100644 --- a/02/hw-02.md +++ b/02/hw-02.md @@ -446,6 +446,61 @@ name = local.vm_db_full_name 5. Найдите и закоментируйте все, более не используемые переменные проекта. 6. Проверьте terraform plan. Изменений быть не должно. +Добавляем в `vms_platform.tf` блок с map переменной: +``` +variable "vms_resources" { + description = "Параметры ресурсов для каждой ВМ" + type = map(object({ + cores = number + memory = number + core_fraction = number + hdd_size = number + hdd_type = string + preemptible = bool + })) + default = { + web = { + cores = 2 + memory = 1 + core_fraction = 20 + hdd_size = 10 + hdd_type = "network-hdd" + preemptible = true + }, + db = { + cores = 2 + memory = 2 + core_fraction = 20 + hdd_size = 10 + hdd_type = "network-ssd" + preemptible = true + } + } +} +``` +Туда же добавляем блок метадаты +``` +variable "vms_metadata" { + description = "Общая метадата для всех ВМ" + type = map(string) + default = { + serial-port-enable = "1" + ssh-keys = "ubuntu:${var.vms_ssh_public_root_key}" + } +} +``` +После этого в variables можно закоммеентировать эти переменные - они больше не нужны: +``` +variable "vm_web_cores" +variable "vm_web_memory" +variable "vm_web_core_fraction" +variable "vm_web_preemptible" +variable "vm_db_cores" +variable "vm_db_memory" +variable "vm_db_core_fraction" +variable "vm_db_preemptible" +``` + ------ ## Дополнительное задание (со звёздочкой*) From a8c3010ada183a804405999bef2f9367739cbae2 Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Sun, 26 Oct 2025 17:27:34 +0500 Subject: [PATCH 23/30] Update hw-02.md --- 02/hw-02.md | 167 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 97 insertions(+), 70 deletions(-) diff --git a/02/hw-02.md b/02/hw-02.md index 4776558e..53abe625 100644 --- a/02/hw-02.md +++ b/02/hw-02.md @@ -412,84 +412,60 @@ name = local.vm_db_full_name ### Задание 6 -1. Вместо использования трёх переменных ".._cores",".._memory",".._core_fraction" в блоке resources {...}, объедините их в единую map-переменную **vms_resources** и внутри неё конфиги обеих ВМ в виде вложенного map(object). - ``` - пример из terraform.tfvars: - vms_resources = { - web={ - cores=2 - memory=2 - core_fraction=5 - hdd_size=10 - hdd_type="network-hdd" - ... - }, - db= { - cores=2 - memory=4 - core_fraction=20 - hdd_size=10 - hdd_type="network-ssd" - ... - } - } - ``` -3. Создайте и используйте отдельную map(object) переменную для блока metadata, она должна быть общая для всех ваших ВМ. - ``` - пример из terraform.tfvars: - metadata = { - serial-port-enable = 1 - ssh-keys = "ubuntu:ssh-ed25519 AAAAC..." - } - ``` - -5. Найдите и закоментируйте все, более не используемые переменные проекта. -6. Проверьте terraform plan. Изменений быть не должно. - -Добавляем в `vms_platform.tf` блок с map переменной: +Создаем `terraform.tfvars`: ``` -variable "vms_resources" { - description = "Параметры ресурсов для каждой ВМ" - type = map(object({ - cores = number - memory = number - core_fraction = number - hdd_size = number - hdd_type = string - preemptible = bool - })) - default = { - web = { - cores = 2 - memory = 1 - core_fraction = 20 - hdd_size = 10 - hdd_type = "network-hdd" - preemptible = true - }, - db = { - cores = 2 - memory = 2 - core_fraction = 20 - hdd_size = 10 - hdd_type = "network-ssd" - preemptible = true - } +# конфигурации ресурсов ВМ +vms_resources = { + web = { + cores = 2 + memory = 1 + core_fraction = 20 + hdd_size = 5 + hdd_type = "network-hdd" + preemptible = true } + + db = { + cores = 2 + memory = 2 + core_fraction = 20 + hdd_size = 5 + hdd_type = "network-hdd" + preemptible = true + } +} +``` +Добавляем метадату в personal.auto.tfvars, чтобы не светить лишнего в коде +``` +# метадата для ВМ +vms_metadata = { + serial-port-enable = 1 + ssh-keys = "ubuntu:ssh-ed25519 AAAAневажно wiqtor@home-server" } ``` -Туда же добавляем блок метадаты + +Добавляем в `vms_platform.tf` блок переменных для ресурсов и метадаты: ``` +# переменная для ресурсов ВМ +variable "vms_resources" { + description = "Ресурсы для ВМ" + type = map(object({ + cores = number + memory = number + core_fraction = number + hdd_size = number + hdd_type = string + preemptible = bool + })) +} + +# переменная для metadata variable "vms_metadata" { - description = "Общая метадата для всех ВМ" - type = map(string) - default = { - serial-port-enable = "1" - ssh-keys = "ubuntu:${var.vms_ssh_public_root_key}" - } + description = "метадата для ВМ" + type = map(string) } ``` -После этого в variables можно закоммеентировать эти переменные - они больше не нужны: +После этого там же в vms_platform нужно закоммеентировать эти переменные - они больше не нужны: ``` variable "vm_web_cores" variable "vm_web_memory" @@ -501,6 +477,57 @@ variable "vm_db_core_fraction" variable "vm_db_preemptible" ``` +Затем нужно поменять блоки ресурсов в main.tf, чтобы он брал новые переменные: +Для первой ВМ platform: +``` +resources { + cores = var.vms_resources["web"].cores + memory = var.vms_resources["web"].memory + core_fraction = var.vms_resources["web"].core_fraction +} + +boot_disk { + initialize_params { + image_id = data.yandex_compute_image.ubuntu.id + size = var.vms_resources["web"].hdd_size + type = var.vms_resources["web"].hdd_type + } +} + +scheduling_policy { + preemptible = var.vms_resources["web"].preemptible +} + +metadata = var.vms_metadata +``` +Для второй ВМ platform_db: +``` +resources { + cores = var.vms_resources["db"].cores + memory = var.vms_resources["db"].memory + core_fraction = var.vms_resources["db"].core_fraction +} + +boot_disk { + initialize_params { + image_id = data.yandex_compute_image.ubuntu_db.id + size = var.vms_resources["db"].hdd_size + type = var.vms_resources["db"].hdd_type + } +} + +scheduling_policy { + preemptible = var.vms_resources["db"].preemptible +} + +metadata = var.vms_metadata +``` +Проверяем, что всё правильно через `terraform plan` - всё сходится, изменений нет: + +image + + + ------ ## Дополнительное задание (со звёздочкой*) From a0990b823dfd59aea850fe985bde14a45f7d5ce6 Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Sun, 26 Oct 2025 17:47:57 +0500 Subject: [PATCH 24/30] Update hw-02.md --- 02/hw-02.md | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/02/hw-02.md b/02/hw-02.md index 53abe625..7520f194 100644 --- a/02/hw-02.md +++ b/02/hw-02.md @@ -531,24 +531,19 @@ metadata = var.vms_metadata ------ ## Дополнительное задание (со звёздочкой*) - -**Настоятельно рекомендуем выполнять все задания со звёздочкой.** -Они помогут глубже разобраться в материале. Задания со звёздочкой дополнительные, не обязательные к выполнению и никак не повлияют на получение вами зачёта по этому домашнему заданию. - - ------ ### Задание 7* -Изучите содержимое файла console.tf. Откройте terraform console, выполните следующие задания: - -1. Напишите, какой командой можно отобразить **второй** элемент списка test_list. -2. Найдите длину списка test_list с помощью функции length(<имя переменной>). -3. Напишите, какой командой можно отобразить значение ключа admin из map test_map. +1. Напишите, какой командой можно отобразить **второй** элемент списка test_list. `local.test_list[1]` +2. Найдите длину списка test_list с помощью функции length(<имя переменной>). `length(local.test_list)` +3. Напишите, какой командой можно отобразить значение ключа admin из map test_map. `` 4. Напишите interpolation-выражение, результатом которого будет: "John is admin for production server based on OS ubuntu-20-04 with X vcpu, Y ram and Z virtual disks", используйте данные из переменных test_list, test_map, servers и функцию length() для подстановки значений. +`"${local.test_map["admin"]} is admin for ${local.test_list[2]} server based on OS ${local.servers.production.image} with ${local.servers.production.cpu} vcpu, ${local.servers.production.ram} ram and ${length(local.servers.production.disks)} virtual disks"` + +Результат с сервера: -**Примечание**: если не догадаетесь как вычленить слово "admin", погуглите: "terraform get keys of map" +image -В качестве решения предоставьте необходимые команды и их вывод. ------ @@ -577,7 +572,23 @@ test = [ ] ``` 2. Напишите выражение в terraform console, которое позволит вычленить строку "ssh -o 'StrictHostKeyChecking=no' ubuntu@62.84.124.117" из этой переменной. ------- + +Добавляем указанное значение в terraform.tfvars. +После этого ззадаем переменную в variables.tf +``` +variable "test" { + description = "тестовая переменная для получения строки SSH подключения" + type = list( + map( + list(string) + ) + ) +} +``` +Теперь можно использовать выражение в terraform console для получения нужного результата: + +image + ------ From 8f6850a94bc61bb489d3691ac767229e19b0c748 Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Sun, 26 Oct 2025 17:49:02 +0500 Subject: [PATCH 25/30] Update hw-02.md --- 02/hw-02.md | 27 +-------------------------- 1 file changed, 1 insertion(+), 26 deletions(-) diff --git a/02/hw-02.md b/02/hw-02.md index 7520f194..869ffc9e 100644 --- a/02/hw-02.md +++ b/02/hw-02.md @@ -536,7 +536,7 @@ metadata = var.vms_metadata 1. Напишите, какой командой можно отобразить **второй** элемент списка test_list. `local.test_list[1]` 2. Найдите длину списка test_list с помощью функции length(<имя переменной>). `length(local.test_list)` -3. Напишите, какой командой можно отобразить значение ключа admin из map test_map. `` +3. Напишите, какой командой можно отобразить значение ключа admin из map test_map. `local.test_map["admin"]` 4. Напишите interpolation-выражение, результатом которого будет: "John is admin for production server based on OS ubuntu-20-04 with X vcpu, Y ram and Z virtual disks", используйте данные из переменных test_list, test_map, servers и функцию length() для подстановки значений. `"${local.test_map["admin"]} is admin for ${local.test_list[2]} server based on OS ${local.servers.production.image} with ${local.servers.production.cpu} vcpu, ${local.servers.production.ram} ram and ${length(local.servers.production.disks)} virtual disks"` @@ -548,31 +548,6 @@ metadata = var.vms_metadata ------ ### Задание 8* -1. Напишите и проверьте переменную test и полное описание ее type в соответствии со значением из terraform.tfvars: -``` -test = [ - { - "dev1" = [ - "ssh -o 'StrictHostKeyChecking=no' ubuntu@62.84.124.117", - "10.0.1.7", - ] - }, - { - "dev2" = [ - "ssh -o 'StrictHostKeyChecking=no' ubuntu@84.252.140.88", - "10.0.2.29", - ] - }, - { - "prod1" = [ - "ssh -o 'StrictHostKeyChecking=no' ubuntu@51.250.2.101", - "10.0.1.30", - ] - }, -] -``` -2. Напишите выражение в terraform console, которое позволит вычленить строку "ssh -o 'StrictHostKeyChecking=no' ubuntu@62.84.124.117" из этой переменной. - Добавляем указанное значение в terraform.tfvars. После этого ззадаем переменную в variables.tf ``` From aa20ba991d782f75fca0779e4d294512e6ef8738 Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Sun, 26 Oct 2025 17:56:43 +0500 Subject: [PATCH 26/30] =?UTF-8?q?=D0=A0=D0=B5=D0=B7=D1=83=D0=BB=D1=8C?= =?UTF-8?q?=D1=82=D0=B0=D1=82=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?=20=D1=81=201=20=D0=BF=D0=BE=208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 02/src/locals.tf | 4 ++ 02/src/main.tf | 83 +++++++++++++++++++++++++++----- 02/src/main.tf.old | 88 ++++++++++++++++++++++++++++++++++ 02/src/outputs.tf | 15 ++++++ 02/src/providers.tf | 2 +- 02/src/terraform.tfvars | 44 +++++++++++++++++ 02/src/variables.tf | 44 ++++++++++++++--- 02/src/vms_platform.tf | 103 ++++++++++++++++++++++++++++++++++++++++ 8 files changed, 365 insertions(+), 18 deletions(-) create mode 100644 02/src/main.tf.old create mode 100644 02/src/terraform.tfvars create mode 100644 02/src/vms_platform.tf diff --git a/02/src/locals.tf b/02/src/locals.tf index e69de29b..2b6f28b9 100644 --- a/02/src/locals.tf +++ b/02/src/locals.tf @@ -0,0 +1,4 @@ +locals { + vm_web_full_name = "${var.vpc_name}-${var.environment}-platform-${var.role_web}" + vm_db_full_name = "${var.vpc_name}-${var.environment}-platform-${var.role_db}" +} diff --git a/02/src/main.tf b/02/src/main.tf index 49baf600..9a40676c 100644 --- a/02/src/main.tf +++ b/02/src/main.tf @@ -1,6 +1,8 @@ resource "yandex_vpc_network" "develop" { name = var.vpc_name } + +# Первая подсеть для первой ВМ resource "yandex_vpc_subnet" "develop" { name = var.vpc_name zone = var.default_zone @@ -8,34 +10,93 @@ resource "yandex_vpc_subnet" "develop" { v4_cidr_blocks = var.default_cidr } +# Вторая подсеть для второй ВМ +resource "yandex_vpc_subnet" "develop_b" { + name = "${var.vpc_name}-b" + zone = var.vm_db_zone + network_id = yandex_vpc_network.develop.id + v4_cidr_blocks = var.vm_db_cidr +} +# Первая ВМ data "yandex_compute_image" "ubuntu" { - family = "ubuntu-2004-lts" + family = var.vm_web_image_family } + resource "yandex_compute_instance" "platform" { - name = "netology-develop-platform-web" - platform_id = "standart-v4" + name = local.vm_web_full_name + platform_id = var.vm_web_platform_id + resources { - cores = 1 - memory = 1 - core_fraction = 5 + cores = var.vms_resources["web"].cores + memory = var.vms_resources["web"].memory + core_fraction = var.vms_resources["web"].core_fraction } + boot_disk { initialize_params { - image_id = data.yandex_compute_image.ubuntu.image_id + image_id = data.yandex_compute_image.ubuntu.id + size = var.vms_resources["web"].hdd_size + type = var.vms_resources["web"].hdd_type } } + scheduling_policy { - preemptible = true + preemptible = var.vms_resources["web"].preemptible } + network_interface { subnet_id = yandex_vpc_subnet.develop.id nat = true } - metadata = { - serial-port-enable = 1 - ssh-keys = "ubuntu:${var.vms_ssh_root_key}" +# metadata = { +# serial-port-enable = 1 +# ssh-keys = "ubuntu:${var.vms_ssh_public_root_key}" +# } + metadata = var.vms_metadata + +} + +# Вторая ВМ +data "yandex_compute_image" "ubuntu_db" { + family = var.vm_db_image_family +} + +resource "yandex_compute_instance" "platform_db" { + name = local.vm_db_full_name + platform_id = var.vm_db_platform_id + + resources { + cores = var.vms_resources["db"].cores + memory = var.vms_resources["db"].memory + core_fraction = var.vms_resources["db"].core_fraction + } + + boot_disk { + initialize_params { + image_id = data.yandex_compute_image.ubuntu_db.id + size = var.vms_resources["db"].hdd_size + type = var.vms_resources["db"].hdd_type + } + } + + scheduling_policy { + preemptible = var.vms_resources["db"].preemptible } + network_interface { + subnet_id = yandex_vpc_subnet.develop_b.id + nat = true + } + + zone = var.vm_db_zone + +# metadata = { +# serial-port-enable = 1 +# ssh-keys = "ubuntu:${var.vms_ssh_public_root_key}" +# } + + metadata = var.vms_metadata } + diff --git a/02/src/main.tf.old b/02/src/main.tf.old new file mode 100644 index 00000000..554b8042 --- /dev/null +++ b/02/src/main.tf.old @@ -0,0 +1,88 @@ +resource "yandex_vpc_network" "develop" { + name = var.vpc_name +} +resource "yandex_vpc_subnet" "develop" { + name = var.vpc_name + zone = var.default_zone + network_id = yandex_vpc_network.develop.id + v4_cidr_blocks = var.default_cidr +} + +data "yandex_compute_image" "ubuntu" { + family = var.vm_web_image_family +} + +resource "yandex_compute_instance" "platform" { + name = var.vm_web_name + platform_id = var.vm_web_platform_id + + resources { + cores = var.vm_web_cores + memory = var.vm_web_memory + core_fraction = var.vm_web_core_fraction + } + + boot_disk { + initialize_params { + image_id = data.yandex_compute_image.ubuntu.id + } + } + + scheduling_policy { + preemptible = var.vm_web_preemptible + } + + network_interface { + subnet_id = yandex_vpc_subnet.develop.id + nat = true + } + + metadata = { + serial-port-enable = 1 + ssh-keys = "ubuntu:${var.vms_ssh_public_root_key}" + } +} + +# Вторая ВМ + +resource "yandex_compute_instance" "platform_db" { + name = var.vm_db_name + platform_id = "standard-v3" + + resources { + cores = var.vm_db_cores + memory = var.vm_db_memory + core_fraction = var.vm_db_core_fraction + } + + boot_disk { + initialize_params { + image_id = data.yandex_compute_image.ubuntu.image_id + } + } + + scheduling_policy { + preemptible = true + } + + network_interface { + subnet_id = yandex_vpc_subnet.develop_b.id + nat = true + } + + zone = "ru-central1-b" + + metadata = { + serial-port-enable = 1 + ssh-keys = "ubuntu:${var.vms_ssh_public_root_key}" + } +} + +# Подсеть для второй ВМ +resource "yandex_vpc_subnet" "develop_b" { + name = "${var.vpc_name}-b" + zone = "ru-central1-b" + network_id = yandex_vpc_network.develop.id + v4_cidr_blocks = ["10.0.2.0/24"] # отдельный диапазон для второй подсети +} + diff --git a/02/src/outputs.tf b/02/src/outputs.tf index e69de29b..abe291b2 100644 --- a/02/src/outputs.tf +++ b/02/src/outputs.tf @@ -0,0 +1,15 @@ +output "vms_info" { + description = "Созданные ВМ - результат:" + value = [ + { + instance_name = yandex_compute_instance.platform.name + external_ip = yandex_compute_instance.platform.network_interface[0].nat_ip_address + fqdn = yandex_compute_instance.platform.fqdn + }, + { + instance_name = yandex_compute_instance.platform_db.name + external_ip = yandex_compute_instance.platform_db.network_interface[0].nat_ip_address + fqdn = yandex_compute_instance.platform_db.fqdn + } + ] +} diff --git a/02/src/providers.tf b/02/src/providers.tf index fae4dc37..45e1272e 100644 --- a/02/src/providers.tf +++ b/02/src/providers.tf @@ -12,5 +12,5 @@ provider "yandex" { cloud_id = var.cloud_id folder_id = var.folder_id zone = var.default_zone - service_account_key_file = file("~/.authorized_key.json") + service_account_key_file = var.service_account_key_file } diff --git a/02/src/terraform.tfvars b/02/src/terraform.tfvars new file mode 100644 index 00000000..f0caa7c2 --- /dev/null +++ b/02/src/terraform.tfvars @@ -0,0 +1,44 @@ +# конфигурации ресурсов ВМ +vms_resources = { + web = { + cores = 2 + memory = 1 + core_fraction = 20 + hdd_size = 5 + hdd_type = "network-hdd" + preemptible = true + } + + db = { + cores = 2 + memory = 2 + core_fraction = 20 + hdd_size = 5 + hdd_type = "network-hdd" + preemptible = true + } +} + +# переменная для теста + +test = [ + { + "dev1" = [ + "ssh -o 'StrictHostKeyChecking=no' ubuntu@62.84.124.117", + "10.0.1.7", + ] + }, + { + "dev2" = [ + "ssh -o 'StrictHostKeyChecking=no' ubuntu@84.252.140.88", + "10.0.2.29", + ] + }, + { + "prod1" = [ + "ssh -o 'StrictHostKeyChecking=no' ubuntu@51.250.2.101", + "10.0.1.30", + ] + }, +] + diff --git a/02/src/variables.tf b/02/src/variables.tf index 8e1bb4f1..ad1f0afb 100644 --- a/02/src/variables.tf +++ b/02/src/variables.tf @@ -1,5 +1,4 @@ -###cloud vars - +# cloud vars variable "cloud_id" { type = string @@ -29,10 +28,43 @@ variable "vpc_name" { } -###ssh vars +# ssh vars + +variable "service_account_key_file" { + type = string + description = "Путь к ключу яндекса" +} -variable "vms_ssh_root_key" { +variable "vms_ssh_public_root_key" { type = string - default = "" - description = "ssh-keygen -t ed25519" + description = "Публичный ключ SSH для root-пользователя" +} + +# name vars + +variable "environment" { + type = string + default = "env" +} + +variable "role_web" { + type = string + default = "web" +} + +variable "role_db" { + type = string + default = "db" +} + +# new "test" var + +variable "test" { + description = "тестовая переменная для получения строки SSH подключения" + type = list( + map( + list(string) + ) + ) } + diff --git a/02/src/vms_platform.tf b/02/src/vms_platform.tf new file mode 100644 index 00000000..b00d873e --- /dev/null +++ b/02/src/vms_platform.tf @@ -0,0 +1,103 @@ +# Переменные первой ВМ + +variable "vm_web_name" { + type = string + default = "netology-develop-platform-web" +} + +variable "vm_web_platform_id" { + type = string + default = "standard-v3" +} + +#variable "vm_web_cores" { +# type = number +# default = 2 +#} + +#variable "vm_web_memory" { +# type = number +# default = 1 +#} + +#variable "vm_web_core_fraction" { +# type = number +# default = 20 +#} + +#variable "vm_web_preemptible" { +# type = bool +# default = true +#} + +variable "vm_web_image_family" { + type = string + default = "ubuntu-2004-lts" +} + +# Переменные второй ВМ + +variable "vm_db_name" { + type = string + default = "netology-develop-platform-db" +} + +variable "vm_db_platform_id" { + type = string + default = "standard-v3" +} + +#variable "vm_db_cores" { +# type = number +# default = 2 +#} + +#variable "vm_db_memory" { +# type = number +# default = 2 +#} + +#variable "vm_db_core_fraction" { +# type = number +# default = 20 +#} + +#variable "vm_db_preemptible" { +# type = bool +# default = true +#} + +variable "vm_db_image_family" { + type = string + default = "ubuntu-2004-lts" +} + +variable "vm_db_zone" { + type = string + default = "ru-central1-b" +} + +variable "vm_db_cidr" { + type = list(string) + default = ["10.0.2.0/24"] +} + +# переменная для ресурсов ВМ +variable "vms_resources" { + description = "Ресурсы для ВМ" + type = map(object({ + cores = number + memory = number + core_fraction = number + hdd_size = number + hdd_type = string + preemptible = bool + })) +} + +# переменная для metadata +variable "vms_metadata" { + description = "метадата для ВМ" + type = map(string) +} + From be0b4097125e9bfcbf4f7a1581ddec27e0466e21 Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Sun, 26 Oct 2025 18:03:30 +0500 Subject: [PATCH 27/30] =?UTF-8?q?=D0=A0=D0=B5=D0=B7=D1=83=D0=BB=D1=8C?= =?UTF-8?q?=D1=82=D0=B0=D1=82=20=D0=BF=D0=BE=20=D0=B7=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=D0=BC=201-8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 10 ++++++++-- 01/src/main.tf | 5 ++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 551c1a05..46f9f650 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,13 @@ # own secret vars store. personal.auto.tfvars +# в этом файле ничег осекретного, поэтому добавляю в гит без опасений +#terraform.tfvars -terraform.tfvars +# а вот тут секретики, поэтому не показываю +personal.auto.tfvars + +tfplan -tfplan \ No newline at end of file +# тут ключ от квартиры, где деньги лежат +yc-terraform-training-acc-key.json diff --git a/01/src/main.tf b/01/src/main.tf index 3ac9c4cf..8cc8df19 100644 --- a/01/src/main.tf +++ b/01/src/main.tf @@ -2,11 +2,10 @@ terraform { required_providers { docker = { source = "kreuzwerker/docker" - version = "~> 3.0.1" + version = "~> 3.8.0" } } - required_version = ">=1.8.4" /*Многострочный комментарий. - Требуемая версия terraform */ + required_version = ">=1.8.4" } provider "docker" { From 3545d6466ce2ac90f3b22dabce57dfead58d7de7 Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Tue, 28 Oct 2025 00:16:59 +0500 Subject: [PATCH 28/30] Update hw-02.md --- 02/hw-02.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/02/hw-02.md b/02/hw-02.md index 869ffc9e..4f79f387 100644 --- a/02/hw-02.md +++ b/02/hw-02.md @@ -569,7 +569,11 @@ variable "test" { ### Задание 9* -Используя инструкцию https://cloud.yandex.ru/ru/docs/vpc/operations/create-nat-gateway#tf_1, настройте для ваших ВМ nat_gateway. Для проверки уберите внешний IP адрес (nat=false) у ваших ВМ и проверьте доступ в интернет с ВМ, подключившись к ней через serial console. Для подключения предварительно через ssh измените пароль пользователя: ```sudo passwd ubuntu``` +NAT gateway настроен, внешний IP адрес у ВМ отключен (nat=false), из серийной консоли восьмёрки пингуются: + +image + + ### Правила приёма работыДля подключения предварительно через ssh измените пароль пользователя: sudo passwd ubuntu В качестве результата прикрепите ссылку на MD файл с описанием выполненой работы в вашем репозитории. Так же в репозитории должен присутсвовать ваш финальный код проекта. From 661c996def3d488ba899d6509a3d4965b93d2f80 Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Tue, 28 Oct 2025 00:18:22 +0500 Subject: [PATCH 29/30] =?UTF-8?q?=D0=A0=D0=B5=D0=B7=D1=83=D0=BB=D1=8C?= =?UTF-8?q?=D1=82=D0=B0=D1=82=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=209?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 02/src/main.tf | 22 +++++++++++++++ 02/src/main.tf.old | 70 +++++++++++++++++++++++++++------------------- 2 files changed, 64 insertions(+), 28 deletions(-) diff --git a/02/src/main.tf b/02/src/main.tf index 9a40676c..dfb57f52 100644 --- a/02/src/main.tf +++ b/02/src/main.tf @@ -2,12 +2,32 @@ resource "yandex_vpc_network" "develop" { name = var.vpc_name } +# NAT-шлюз +resource "yandex_vpc_gateway" "nat_gateway" { + name = "${var.vpc_name}-nat-gateway" + folder_id = var.folder_id + shared_egress_gateway {} +} + +# Таблица маршрутизации для NAT +resource "yandex_vpc_route_table" "nat_route" { + name = "${var.vpc_name}-route-table" + folder_id = var.folder_id + network_id = yandex_vpc_network.develop.id + + static_route { + destination_prefix = "0.0.0.0/0" + gateway_id = yandex_vpc_gateway.nat_gateway.id + } +} + # Первая подсеть для первой ВМ resource "yandex_vpc_subnet" "develop" { name = var.vpc_name zone = var.default_zone network_id = yandex_vpc_network.develop.id v4_cidr_blocks = var.default_cidr + route_table_id = yandex_vpc_route_table.nat_route.id } # Вторая подсеть для второй ВМ @@ -16,6 +36,7 @@ resource "yandex_vpc_subnet" "develop_b" { zone = var.vm_db_zone network_id = yandex_vpc_network.develop.id v4_cidr_blocks = var.vm_db_cidr + route_table_id = yandex_vpc_route_table.nat_route.id } # Первая ВМ @@ -100,3 +121,4 @@ resource "yandex_compute_instance" "platform_db" { metadata = var.vms_metadata } + diff --git a/02/src/main.tf.old b/02/src/main.tf.old index 554b8042..9a40676c 100644 --- a/02/src/main.tf.old +++ b/02/src/main.tf.old @@ -1,6 +1,8 @@ resource "yandex_vpc_network" "develop" { name = var.vpc_name } + +# Первая подсеть для первой ВМ resource "yandex_vpc_subnet" "develop" { name = var.vpc_name zone = var.default_zone @@ -8,28 +10,39 @@ resource "yandex_vpc_subnet" "develop" { v4_cidr_blocks = var.default_cidr } +# Вторая подсеть для второй ВМ +resource "yandex_vpc_subnet" "develop_b" { + name = "${var.vpc_name}-b" + zone = var.vm_db_zone + network_id = yandex_vpc_network.develop.id + v4_cidr_blocks = var.vm_db_cidr +} + +# Первая ВМ data "yandex_compute_image" "ubuntu" { family = var.vm_web_image_family } resource "yandex_compute_instance" "platform" { - name = var.vm_web_name + name = local.vm_web_full_name platform_id = var.vm_web_platform_id resources { - cores = var.vm_web_cores - memory = var.vm_web_memory - core_fraction = var.vm_web_core_fraction + cores = var.vms_resources["web"].cores + memory = var.vms_resources["web"].memory + core_fraction = var.vms_resources["web"].core_fraction } boot_disk { initialize_params { image_id = data.yandex_compute_image.ubuntu.id + size = var.vms_resources["web"].hdd_size + type = var.vms_resources["web"].hdd_type } } scheduling_policy { - preemptible = var.vm_web_preemptible + preemptible = var.vms_resources["web"].preemptible } network_interface { @@ -37,32 +50,39 @@ resource "yandex_compute_instance" "platform" { nat = true } - metadata = { - serial-port-enable = 1 - ssh-keys = "ubuntu:${var.vms_ssh_public_root_key}" - } +# metadata = { +# serial-port-enable = 1 +# ssh-keys = "ubuntu:${var.vms_ssh_public_root_key}" +# } + metadata = var.vms_metadata + } # Вторая ВМ +data "yandex_compute_image" "ubuntu_db" { + family = var.vm_db_image_family +} resource "yandex_compute_instance" "platform_db" { - name = var.vm_db_name - platform_id = "standard-v3" + name = local.vm_db_full_name + platform_id = var.vm_db_platform_id resources { - cores = var.vm_db_cores - memory = var.vm_db_memory - core_fraction = var.vm_db_core_fraction + cores = var.vms_resources["db"].cores + memory = var.vms_resources["db"].memory + core_fraction = var.vms_resources["db"].core_fraction } boot_disk { initialize_params { - image_id = data.yandex_compute_image.ubuntu.image_id + image_id = data.yandex_compute_image.ubuntu_db.id + size = var.vms_resources["db"].hdd_size + type = var.vms_resources["db"].hdd_type } } scheduling_policy { - preemptible = true + preemptible = var.vms_resources["db"].preemptible } network_interface { @@ -70,19 +90,13 @@ resource "yandex_compute_instance" "platform_db" { nat = true } - zone = "ru-central1-b" + zone = var.vm_db_zone - metadata = { - serial-port-enable = 1 - ssh-keys = "ubuntu:${var.vms_ssh_public_root_key}" - } -} +# metadata = { +# serial-port-enable = 1 +# ssh-keys = "ubuntu:${var.vms_ssh_public_root_key}" +# } -# Подсеть для второй ВМ -resource "yandex_vpc_subnet" "develop_b" { - name = "${var.vpc_name}-b" - zone = "ru-central1-b" - network_id = yandex_vpc_network.develop.id - v4_cidr_blocks = ["10.0.2.0/24"] # отдельный диапазон для второй подсети + metadata = var.vms_metadata } From 373af04c6244a35e0a8adb5d0608971502afa467 Mon Sep 17 00:00:00 2001 From: wiqt8r Date: Tue, 28 Oct 2025 22:29:38 +0500 Subject: [PATCH 30/30] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2?= =?UTF-8?q?=20=D1=81=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B9=20=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D1=81=D0=B8=D0=B5=D0=B9=20=D0=A2=D0=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 03/demo/providers.tf | 2 +- 03/hw-03.md | 2 +- 03/src/providers.tf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/03/demo/providers.tf b/03/demo/providers.tf index c9e7d5a6..bcce36df 100644 --- a/03/demo/providers.tf +++ b/03/demo/providers.tf @@ -4,7 +4,7 @@ terraform { source = "yandex-cloud/yandex" } } - required_version = ">=1.8.4" + required_version = "~>1.12.0" } provider "yandex" { diff --git a/03/hw-03.md b/03/hw-03.md index 25863404..5ad17b40 100644 --- a/03/hw-03.md +++ b/03/hw-03.md @@ -17,7 +17,7 @@ ------ ### Внимание!! Обязательно предоставляем на проверку получившийся код в виде ссылки на ваш github-репозиторий! -Убедитесь что ваша версия **Terraform** ~>1.8.4 +Убедитесь что ваша версия **Terraform** ~>1.12.0 Теперь пишем красивый код, хардкод значения не допустимы! ------ diff --git a/03/src/providers.tf b/03/src/providers.tf index 1f337849..5eb52596 100644 --- a/03/src/providers.tf +++ b/03/src/providers.tf @@ -4,7 +4,7 @@ terraform { source = "yandex-cloud/yandex" } } - required_version = "~>1.8.4" + required_version = "~>1.12.0" } provider "yandex" {