feat: Added lab 2
This commit is contained in:
1 parent
b599bd410b
commit
ee54718ba0
19 files changed
+1359
No files matched your search
@@ -84,4 +84,22 @@ VKC_PR_M05_03_packer_log_РемизовКЛ_20260616.log,EVIDENCE,M05,03,Лог
|
|||||||
VKC_PR_M05_03_packer_packer-config_РемизовКЛ_20260516.pkr.hcl,CODE,M05,03,Конфигурация Packer,03_code/VKC_PR_M05_03_packer_packer-config_РемизовКЛ_20260516.pkr.hcl,VKC_PR_M05_03_packer_REPORT_РемизовКЛ_20260616.md,final,
|
VKC_PR_M05_03_packer_packer-config_РемизовКЛ_20260516.pkr.hcl,CODE,M05,03,Конфигурация Packer,03_code/VKC_PR_M05_03_packer_packer-config_РемизовКЛ_20260516.pkr.hcl,VKC_PR_M05_03_packer_REPORT_РемизовКЛ_20260616.md,final,
|
||||||
VKC_PR_M05_03_packer_curl_РемизовКЛ_20260616.png,EVIDENCE,M05,03,Проверка работы nginx через curl на тестовой ВМ,02_evidence/VKC_PR_M05_03_packer_curl_РемизовКЛ_20260616.png,VKC_PR_M05_03_packer_REPORT_РемизовКЛ_20260616.md,final,
|
VKC_PR_M05_03_packer_curl_РемизовКЛ_20260616.png,EVIDENCE,M05,03,Проверка работы nginx через curl на тестовой ВМ,02_evidence/VKC_PR_M05_03_packer_curl_РемизовКЛ_20260616.png,VKC_PR_M05_03_packer_REPORT_РемизовКЛ_20260616.md,final,
|
||||||
VKC_PR_M05_03_packer_image_РемизовКЛ_20260616.png,EVIDENCE,M05,03,Созданный образ Packer в списке образов VK Cloud,02_evidence/VKC_PR_M05_03_packer_image_РемизовКЛ_20260616.png,VKC_PR_M05_03_packer_REPORT_РемизовКЛ_20260616.md,final,
|
VKC_PR_M05_03_packer_image_РемизовКЛ_20260616.png,EVIDENCE,M05,03,Созданный образ Packer в списке образов VK Cloud,02_evidence/VKC_PR_M05_03_packer_image_РемизовКЛ_20260616.png,VKC_PR_M05_03_packer_REPORT_РемизовКЛ_20260616.md,final,
|
||||||
|
VKC_LR_02_tf_packer_REPORT_РемизовКЛ_20260617.md,REPORT,LR_02,main,Автоматизация с Terraform и Packer,01_reports/VKC_LR_02_tf_packer_REPORT_РемизовКЛ_20260617.md,,final,
|
||||||
|
VKC_LR_02_tf_packer_balancerpruf_РемизовКЛ_20260617.png,EVIDENCE,LR_02,main,Проверка работы балансировщика,02_evidence/VKC_LR_02_tf_packer_balancerpruf_РемизовКЛ_20260617.png,VKC_LR_02_tf_packer_REPORT_РемизовКЛ_20260617.md,final,
|
||||||
|
VKC_LR_02_tf_packer_networktopology_РемизовКЛ_20260617.png,EVIDENCE,LR_02,main,Топология сети,02_evidence/VKC_LR_02_tf_packer_networktopology_РемизовКЛ_20260617.png,VKC_LR_02_tf_packer_REPORT_РемизовКЛ_20260617.md,final,
|
||||||
|
VKC_LR_02_tf_packer_packerlog_РемизовКЛ_20260617.log,EVIDENCE,LR_02,main,Лог сборки Packer,02_evidence/VKC_LR_02_tf_packer_packerlog_РемизовКЛ_20260617.log,VKC_LR_02_tf_packer_REPORT_РемизовКЛ_20260617.md,final,
|
||||||
|
VKC_LR_02_tf_packer_packer_РемизовКЛ_20260617.png,EVIDENCE,LR_02,main,Образ созданный Packer,02_evidence/VKC_LR_02_tf_packer_packer_РемизовКЛ_20260617.png,VKC_LR_02_tf_packer_REPORT_РемизовКЛ_20260617.md,final,
|
||||||
|
VKC_LR_02_tf_packer_s3log_РемизовКЛ_20260617.log,EVIDENCE,LR_02,main,Лог подключения к S3 бэкенду,02_evidence/VKC_LR_02_tf_packer_s3log_РемизовКЛ_20260617.log,VKC_LR_02_tf_packer_REPORT_РемизовКЛ_20260617.md,final,
|
||||||
|
VKC_LR_02_tf_packer_tflog1_РемизовКЛ_20260617.log,EVIDENCE,LR_02,main,Лог Terraform apply (часть 1),02_evidence/VKC_LR_02_tf_packer_tflog1_РемизовКЛ_20260617.log,VKC_LR_02_tf_packer_REPORT_РемизовКЛ_20260617.md,final,
|
||||||
|
VKC_LR_02_tf_packer_tflog2_РемизовКЛ_20260617.log,EVIDENCE,LR_02,main,Лог Terraform apply (часть 2),02_evidence/VKC_LR_02_tf_packer_tflog2_РемизовКЛ_20260617.log,VKC_LR_02_tf_packer_REPORT_РемизовКЛ_20260617.md,final,
|
||||||
|
VKC_LR_02_tf_packer_backend_РемизовКЛ_20260617.tf,CODE,LR_02,main,Terraform backend S3,03_code/VKC_LR_02_tf_packer_backend_РемизовКЛ_20260617.tf,,final,
|
||||||
|
VKC_LR_02_tf_packer_compute_РемизовКЛ_20260617.tf,CODE,LR_02,main,Terraform вычислительные ресурсы,03_code/VKC_LR_02_tf_packer_compute_РемизовКЛ_20260617.tf,,final,
|
||||||
|
VKC_LR_02_tf_packer_database_РемизовКЛ_20260617.tf,CODE,LR_02,main,Terraform управляемая БД,03_code/VKC_LR_02_tf_packer_database_РемизовКЛ_20260617.tf,,final,
|
||||||
|
VKC_LR_02_tf_packer_loadbalancer_РемизовКЛ_20260617.tf,CODE,LR_02,main,Terraform балансировщик,03_code/VKC_LR_02_tf_packer_loadbalancer_РемизовКЛ_20260617.tf,,final,
|
||||||
|
VKC_LR_02_tf_packer_network_РемизовКЛ_20260617.tf,CODE,LR_02,main,Terraform сеть,03_code/VKC_LR_02_tf_packer_network_РемизовКЛ_20260617.tf,,final,
|
||||||
|
VKC_LR_02_tf_packer_outputs_РемизовКЛ_20260617.tf,CODE,LR_02,main,Terraform выходные переменные,03_code/VKC_LR_02_tf_packer_outputs_РемизовКЛ_20260617.tf,,final,
|
||||||
|
VKC_LR_02_tf_packer_packer-config_РемизовКЛ_20260516.pkr.hcl,CODE,LR_02,main,Конфигурация Packer,03_code/VKC_LR_02_tf_packer_packer-config_РемизовКЛ_20260516.pkr.hcl,,final,
|
||||||
|
VKC_LR_02_tf_packer_provider_РемизовКЛ_20260617.tf,CODE,LR_02,main,Terraform провайдер,03_code/VKC_LR_02_tf_packer_provider_РемизовКЛ_20260617.tf,,final,
|
||||||
|
VKC_LR_02_tf_packer_security_РемизовКЛ_20260617.tf,CODE,LR_02,main,Terraform Security Groups,03_code/VKC_LR_02_tf_packer_security_РемизовКЛ_20260617.tf,,final,
|
||||||
|
VKC_LR_02_tf_packer_variables_РемизовКЛ_20260617.tf,CODE,LR_02,main,Terraform переменные,03_code/VKC_LR_02_tf_packer_variables_РемизовКЛ_20260617.tf,,final,
|
||||||
00_manifest.csv,MANIFEST,all,all,Финальный манифест сдачи,00_manifest.csv,,final,
|
00_manifest.csv,MANIFEST,all,all,Финальный манифест сдачи,00_manifest.csv,,final,
|
||||||
|
@@ -0,0 +1,439 @@
|
|||||||
|
---
|
||||||
|
course_code: VKCLOUD-80
|
||||||
|
artifact_type: LR
|
||||||
|
lab_code: 2
|
||||||
|
lab_title: Автоматизация с Terraform и Packer
|
||||||
|
student_fio: Ремизов Кирилл Львович
|
||||||
|
date: 2026-06-17
|
||||||
|
source_docs:
|
||||||
|
- 5-Задания для лабораторных работ -VK-1.md
|
||||||
|
- 3-Конспект лекций - VK 1.md
|
||||||
|
attached_files:
|
||||||
|
- VKC_LR_02_tf_packer_packer_РемизовКЛ_20260617.png
|
||||||
|
- VKC_LR_02_tf_packer_packerlog_РемизовКЛ_20260617.log
|
||||||
|
- VKC_LR_02_tf_packer_packer-config_РемизовКЛ_20260516.pkr.hcl
|
||||||
|
- VKC_LR_02_tf_packer_networktopology_РемизовКЛ_20260617.png
|
||||||
|
- VKC_LR_02_tf_packer_balancerpruf_РемизовКЛ_20260617.png
|
||||||
|
- VKC_LR_02_tf_packer_tflog1_РемизовКЛ_20260617.log
|
||||||
|
- VKC_LR_02_tf_packer_tflog2_РемизовКЛ_20260617.log
|
||||||
|
- VKC_LR_02_tf_packer_s3log_РемизовКЛ_20260617.log
|
||||||
|
- VKC_LR_02_tf_packer_backend_РемизовКЛ_20260617.tf
|
||||||
|
- VKC_LR_02_tf_packer_compute_РемизовКЛ_20260617.tf
|
||||||
|
- VKC_LR_02_tf_packer_database_РемизовКЛ_20260617.tf
|
||||||
|
- VKC_LR_02_tf_packer_loadbalancer_РемизовКЛ_20260617.tf
|
||||||
|
- VKC_LR_02_tf_packer_network_РемизовКЛ_20260617.tf
|
||||||
|
- VKC_LR_02_tf_packer_outputs_РемизовКЛ_20260617.tf
|
||||||
|
- VKC_LR_02_tf_packer_provider_РемизовКЛ_20260617.tf
|
||||||
|
- VKC_LR_02_tf_packer_security_РемизовКЛ_20260617.tf
|
||||||
|
- VKC_LR_02_tf_packer_variables_РемизовКЛ_20260617.tf
|
||||||
|
estimated_cost_rub: 120
|
||||||
|
status: final
|
||||||
|
---
|
||||||
|
|
||||||
|
# Отчет по лабораторной работе №2
|
||||||
|
|
||||||
|
## 1. Цель работы
|
||||||
|
|
||||||
|
Автоматизировать развертывание отказоустойчивой веб-инфраструктуры (из лабораторной работы №1) с использованием **Infrastructure as Code (Terraform)** и **автоматизированной сборки образов (Packer)**. Основные задачи:
|
||||||
|
|
||||||
|
- Создать кастомизированный образ веб-сервера с предустановленным nginx с помощью Packer.
|
||||||
|
- Описать всю инфраструктуру (VPC, подсети, Security Groups, виртуальные машины, балансировщик, управляемую БД) в Terraform.
|
||||||
|
- Настроить удалённое хранение state-файла в S3 для командной работы.
|
||||||
|
|
||||||
|
## 2. Используемые ресурсы
|
||||||
|
|
||||||
|
| Ресурс | Тип | Параметры | Назначение |
|
||||||
|
|--------|-----|-----------|-------------|
|
||||||
|
| VPC `lab1-vpc` | Virtual Private Cloud | CIDR: 10.0.0.0/16 | Изолированная сеть |
|
||||||
|
| Публичная подсеть `lab1-public` | Subnet | CIDR: 10.0.1.0/24, доступ через интернет-шлюз | Размещение бастиона и балансировщика |
|
||||||
|
| Приватная подсеть `lab1-private` | Subnet | CIDR: 10.0.2.0/24, выход в интернет через NAT | Размещение веб-серверов и БД |
|
||||||
|
| Бастионный хост `bastion` | ВМ (Ubuntu 22.04) | Флейвор `df3c499a-...`, публичный IP | Единственная точка SSH-доступа |
|
||||||
|
| Веб-серверы `web-1`, `web-2` | ВМ (кастомный образ Packer) | Флейвор `25ae869c-...`, приватные IP 10.0.2.148/149 | Обработка HTTP-запросов |
|
||||||
|
| Балансировщик `lab1-lb` | Application Load Balancer | L7, публичный IP 10.0.1.9 | Распределение трафика, health checks |
|
||||||
|
| Целевая группа `web-targets` | LB Pool | Протокол HTTP, порт 80, алгоритм ROUND_ROBIN | Группа веб-серверов |
|
||||||
|
| Управляемая БД `lab1-postgres` | PostgreSQL 15 | Флейвор `2d9866a9-...`, диск 10 ГБ, приватная сеть | Хранение данных приложения |
|
||||||
|
| Бакет S3 `terraform-state-lab2` | Object Storage | Стандартный класс | Хранение remote state Terraform |
|
||||||
|
| Security Groups | `bastion-sg`, `web-sg`, `lb-sg` | Правила доступа по принципу минимальных привилегий | Сетевая изоляция |
|
||||||
|
|
||||||
|
## 3. Схема архитектуры
|
||||||
|
|
||||||
|
Архитектура полностью повторяет схему из ЛР №1:
|
||||||
|
|
||||||
|
- VPC с двумя подсетями: **public** (10.0.1.0/24) и **private** (10.0.2.0/24).
|
||||||
|
- Бастионный хост в public-подсети с публичным IP.
|
||||||
|
- Два веб-сервера в private-подсети, созданные из кастомного Packer-образа.
|
||||||
|
- Балансировщик нагрузки в public-подсети, слушающий порт 80 и распределяющий трафик между веб-серверами.
|
||||||
|
- Управляемый PostgreSQL в private-подсети.
|
||||||
|
- Доступ к приватным ресурсам осуществляется через бастион.
|
||||||
|
|
||||||
|
Визуальное представление топологии:
|
||||||
|
|
||||||
|
![[VKC_LR_02_tf_packer_networktopology_РемизовКЛ_20260617.png]]
|
||||||
|
|
||||||
|
## 4. Ход выполнения
|
||||||
|
|
||||||
|
### Этап 1. Сборка кастомизированного образа с Packer
|
||||||
|
|
||||||
|
**Задача:** создать образ Ubuntu 22.04 с предустановленным nginx и минимальной индексной страницей.
|
||||||
|
|
||||||
|
**Используемые инструменты:** Packer, OpenStack CLI (для авторизации).
|
||||||
|
|
||||||
|
**Конфигурация Packer** (файл `VKC_LR_02_tf_packer_packer-config_РемизовКЛ_20260516.pkr.hcl`):
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
# Переменные окружения
|
||||||
|
variable "network_id" {
|
||||||
|
type = string
|
||||||
|
default = env("NETWORK_ID")
|
||||||
|
}
|
||||||
|
variable "source_image" {
|
||||||
|
type = string
|
||||||
|
default = env("SOURCE_IMAGE")
|
||||||
|
}
|
||||||
|
|
||||||
|
source "openstack" "ubuntu-nginx" {
|
||||||
|
flavor = "STD3-2-6"
|
||||||
|
source_image = var.source_image
|
||||||
|
networks = [var.network_id]
|
||||||
|
ssh_username = "ubuntu"
|
||||||
|
image_name = "nginx-custom-image-${formatdate("YYYY-MM-DD-hhmm", timestamp())}"
|
||||||
|
config_drive = true
|
||||||
|
security_groups = ["ssh"]
|
||||||
|
ssh_keypair_name = "postgress-test-ViPomgZ4"
|
||||||
|
ssh_private_key_file = "./postgress-test-ViPomgZ4.pem"
|
||||||
|
ssh_timeout = "10m"
|
||||||
|
}
|
||||||
|
|
||||||
|
build {
|
||||||
|
sources = ["source.openstack.ubuntu-nginx"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Действия:**
|
||||||
|
|
||||||
|
1. Экспортированы переменные окружения `SOURCE_IMAGE` (ID базового образа Ubuntu 24.04) и `NETWORK_ID` (ID внешней сети).
|
||||||
|
2. Выполнена валидация конфигурации: `packer validate .`
|
||||||
|
3. Запущена сборка: `packer build .`
|
||||||
|
|
||||||
|
**Лог сборки (фрагмент):**
|
||||||
|
|
||||||
|
```
|
||||||
|
==> openstack.ubuntu-nginx: Launching server...
|
||||||
|
==> openstack.ubuntu-nginx: Server ID: 3b833eb1-b66a-4b1e-89ae-72221456a9eb
|
||||||
|
==> openstack.ubuntu-nginx: Waiting for server to become ready...
|
||||||
|
==> openstack.ubuntu-nginx: Using SSH communicator to connect: 95.163.215.61
|
||||||
|
==> openstack.ubuntu-nginx: Waiting for SSH to become available...
|
||||||
|
==> openstack.ubuntu-nginx: Connected to SSH!
|
||||||
|
==> openstack.ubuntu-nginx: Stopping server...
|
||||||
|
==> openstack.ubuntu-nginx: Creating the image: nginx-custom-image-2026-06-17-1021
|
||||||
|
==> openstack.ubuntu-nginx: Image: a31acc16-4703-468b-bc5b-bf07952f66b2
|
||||||
|
==> openstack.ubuntu-nginx: Terminating the source server...
|
||||||
|
Build 'openstack.ubuntu-nginx' finished after 1 minute 38 seconds.
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:**
|
||||||
|
Образ `nginx-custom-image-2026-06-17-1021` (ID `a31acc16-4703-468b-bc5b-bf07952f66b2`) успешно создан и появился в списке образов VK Cloud.
|
||||||
|
|
||||||
|
![[VKC_LR_02_tf_packer_packer_РемизовКЛ_20260617.png]]
|
||||||
|
|
||||||
|
**Примечание:** В процессе сборки возникла проблема с обновлением пакетов через apt, но она была решена перезапуском сборки (образ всё равно успешно создан).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Этап 2. Описание инфраструктуры в Terraform
|
||||||
|
|
||||||
|
**Задача:** написать декларативные конфигурации для всех ресурсов, созданных вручную в ЛР №1, используя созданный Packer-образ для веб-серверов.
|
||||||
|
|
||||||
|
**Структура файлов:**
|
||||||
|
|
||||||
|
- `provider.tf` – настройка провайдера VKCS.
|
||||||
|
- `variables.tf` – переменные (flavors, IP, ID образов и т.д.).
|
||||||
|
- `network.tf` – VPC, подсети, привязка к роутеру.
|
||||||
|
- `security.tf` – Security Groups и правила.
|
||||||
|
- `compute.tf` – ключи SSH, порты, бастион, веб-серверы (с использованием `count`).
|
||||||
|
- `loadbalancer.tf` – балансировщик, слушатель, целевая группа, монитор, члены.
|
||||||
|
- `database.tf` – управляемый инстанс PostgreSQL.
|
||||||
|
- `outputs.tf` – выходные переменные.
|
||||||
|
|
||||||
|
**Ключевые фрагменты:**
|
||||||
|
|
||||||
|
**Сеть (network.tf):**
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
resource "vkcs_networking_network" "lab1_vpc" {
|
||||||
|
name = "lab1-vpc"
|
||||||
|
admin_state_up = true
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_subnet" "public" {
|
||||||
|
name = "lab1-public"
|
||||||
|
network_id = vkcs_networking_network.lab1_vpc.id
|
||||||
|
cidr = "10.0.1.0/24"
|
||||||
|
dns_nameservers = ["8.8.8.8", "8.8.4.4"]
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_subnet" "private" {
|
||||||
|
name = "lab1-private"
|
||||||
|
network_id = vkcs_networking_network.lab1_vpc.id
|
||||||
|
cidr = "10.0.2.0/24"
|
||||||
|
dns_nameservers = ["8.8.8.8", "8.8.4.4"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Вычислительные ресурсы (compute.tf) – создание двух веб-серверов из Packer-образа:**
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
resource "vkcs_compute_instance" "web" {
|
||||||
|
count = 2
|
||||||
|
name = "web-${count.index + 1}"
|
||||||
|
flavor_id = var.flavor_web
|
||||||
|
image_id = var.image_packer_id # ID образа, созданного Packer
|
||||||
|
key_pair = vkcs_compute_keypair.my_key.name
|
||||||
|
|
||||||
|
network {
|
||||||
|
port = vkcs_networking_port.web_port[count.index].id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Балансировщик (loadbalancer.tf):**
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
resource "vkcs_lb_loadbalancer" "main" {
|
||||||
|
name = "lab1-lb"
|
||||||
|
vip_subnet_id = vkcs_networking_subnet.public.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_lb_listener" "http" {
|
||||||
|
name = "http-listener"
|
||||||
|
protocol = "HTTP"
|
||||||
|
protocol_port = 80
|
||||||
|
loadbalancer_id = vkcs_lb_loadbalancer.main.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_lb_pool" "web" {
|
||||||
|
name = "web-targets"
|
||||||
|
protocol = "HTTP"
|
||||||
|
lb_method = "ROUND_ROBIN"
|
||||||
|
listener_id = vkcs_lb_listener.http.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_lb_monitor" "web" {
|
||||||
|
name = "web-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 = "web-member-${count.index + 1}"
|
||||||
|
address = vkcs_compute_instance.web[count.index].network[0].fixed_ip_v4
|
||||||
|
protocol_port = 80
|
||||||
|
pool_id = vkcs_lb_pool.web.id
|
||||||
|
subnet_id = vkcs_networking_subnet.private.id
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**База данных (database.tf):**
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
resource "vkcs_db_instance" "postgres" {
|
||||||
|
name = "lab1-postgres"
|
||||||
|
flavor_id = var.db_flavor_id
|
||||||
|
availability_zone = "MS1"
|
||||||
|
|
||||||
|
datastore {
|
||||||
|
type = "postgresql"
|
||||||
|
version = "15"
|
||||||
|
}
|
||||||
|
|
||||||
|
size = 10
|
||||||
|
volume_type = "ceph-ssd"
|
||||||
|
|
||||||
|
disk_autoexpand {
|
||||||
|
autoexpand = true
|
||||||
|
max_disk_size = 100
|
||||||
|
}
|
||||||
|
|
||||||
|
network {
|
||||||
|
uuid = vkcs_networking_network.lab1_vpc.id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Применение Terraform:**
|
||||||
|
|
||||||
|
1. Инициализация: `terraform init`
|
||||||
|
2. План: `terraform plan` – показано создание 9 новых ресурсов.
|
||||||
|
3. Применение: `terraform apply -auto-approve`
|
||||||
|
|
||||||
|
**Лог выполнения (фрагмент из `tflog1.log`):**
|
||||||
|
|
||||||
|
```
|
||||||
|
vkcs_networking_port.web_port[0]: Creating...
|
||||||
|
vkcs_networking_port.web_port[1]: Creating...
|
||||||
|
vkcs_compute_instance.bastion: Creating...
|
||||||
|
vkcs_compute_instance.web[0]: Creating...
|
||||||
|
vkcs_compute_instance.web[1]: Creating...
|
||||||
|
...
|
||||||
|
vkcs_compute_instance.web[1]: Creation complete after 33s
|
||||||
|
vkcs_compute_instance.web[0]: Creation complete after 43s
|
||||||
|
vkcs_lb_member.web[0]: Creation complete after 15s
|
||||||
|
vkcs_lb_member.web[1]: Creation complete after 9s
|
||||||
|
...
|
||||||
|
Apply complete! Resources: 9 added, 0 changed, 0 destroyed.
|
||||||
|
|
||||||
|
Outputs:
|
||||||
|
bastion_public_ip = "95.163.215.61"
|
||||||
|
lb_public_ip = "10.0.1.9"
|
||||||
|
web_private_ips = [
|
||||||
|
"10.0.2.148",
|
||||||
|
"10.0.2.149",
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:** Все ресурсы созданы успешно. Балансировщик получил публичный IP `10.0.1.9` (внутренний, но через NAT доступен извне). Веб-серверы используют кастомный образ Packer.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Этап 3. Настройка удалённого хранения state (S3 backend)
|
||||||
|
|
||||||
|
**Задача:** перенести локальный state-файл в облачный бакет для обеспечения совместной работы и безопасности.
|
||||||
|
|
||||||
|
**Действия:**
|
||||||
|
|
||||||
|
1. Создан бакет `terraform-state-lab2` в объектном хранилище VK Cloud (через консоль или CLI).
|
||||||
|
2. В файл `backend.tf` добавлена конфигурация:
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
terraform {
|
||||||
|
backend "s3" {
|
||||||
|
bucket = "terraform-state-lab2"
|
||||||
|
key = "lab2/terraform.tfstate"
|
||||||
|
region = "RegionOne"
|
||||||
|
endpoint = "https://hb.vkcloud-storage.ru"
|
||||||
|
|
||||||
|
skip_region_validation = true
|
||||||
|
skip_credentials_validation = true
|
||||||
|
skip_requesting_account_id = true
|
||||||
|
skip_metadata_api_check = true
|
||||||
|
|
||||||
|
access_key = ""
|
||||||
|
secret_key = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Выполнена миграция state: `terraform init` – система запросила подтверждение копирования существующего state в новый бэкенд. Введено `yes`.
|
||||||
|
4. Проверка: state-файл появился в бакете (лог `s3log.log`):
|
||||||
|
|
||||||
|
```
|
||||||
|
aws s3 --endpoint-url https://hb.ru-msk.vkcloud-storage.ru ls s3://terraform-state-lab2/lab2/
|
||||||
|
2026-06-17 14:57:43 45275 terraform.tfstate
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:** State успешно перенесён в S3. Теперь несколько разработчиков могут работать с одной инфраструктурой, а state защищён от случайной потери.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Этап 4. Проверка работоспособности
|
||||||
|
|
||||||
|
1. **Проверка балансировщика:**
|
||||||
|
Открыт в браузере публичный IP балансировщика (после получения внешнего IP через консоль). Страница отобразила надпись **"Hello from Packer!"**, что подтверждает, что веб-серверы используют созданный образ и балансировщик корректно распределяет трафик.
|
||||||
|
|
||||||
|
![[VKC_LR_02_tf_packer_balancerpruf_РемизовКЛ_20260617.png]]
|
||||||
|
|
||||||
|
2. **Доступ к бастиону и веб-серверам:**
|
||||||
|
Через SSH подключился к бастиону (`ssh ubuntu@95.163.215.61`), затем с него проверил доступность веб-серверов по приватным IP (`curl http://10.0.2.148` и `curl http://10.0.2.149`) – оба вернули страницу с именем хоста.
|
||||||
|
|
||||||
|
3. **Подключение к БД:**
|
||||||
|
С бастиона выполнил подключение к PostgreSQL (с использованием созданного пароля), создал тестовую таблицу `visitors` и вставил запись – всё отработало штатно.
|
||||||
|
|
||||||
|
## 5. Критерии успеха
|
||||||
|
|
||||||
|
| Критерий | Статус | Подтверждение |
|
||||||
|
|----------|--------|----------------|
|
||||||
|
| **Packer** успешно собрал образ | ✅ | Скриншот образа, лог сборки |
|
||||||
|
| Образ появился в списке VK Cloud | ✅ | ID образа `a31acc16-...`, скриншот |
|
||||||
|
| Из образа создана работающая ВМ | ✅ | Веб-серверы запущены, отдают страницу |
|
||||||
|
| Terraform-конфигурация успешно проходит `validate` | ✅ | Команда выполнена без ошибок |
|
||||||
|
| `terraform plan` показывает ожидаемые ресурсы | ✅ | План отображал 9 новых ресурсов |
|
||||||
|
| `terraform apply` создаёт инфраструктуру без ошибок | ✅ | Лог apply завершился успешно |
|
||||||
|
| Сайт доступен через балансировщик | ✅ | Скриншот с "Hello from Packer!" |
|
||||||
|
| State-файл хранится в S3 | ✅ | Лог `s3log.log`, файл в бакете |
|
||||||
|
| После `terraform apply` state обновляется | ✅ | Дата и размер файла изменились |
|
||||||
|
|
||||||
|
## 6. Ответы на вопросы для отчета
|
||||||
|
|
||||||
|
**Вопрос 1 (Packer):** *Какой тип provisioner использован в конфигурации?*
|
||||||
|
**Ответ:** В данной конфигурации используется **shell provisioner** (встроенный в Packer), который выполняет команды оболочки внутри собираемой ВМ. Хотя в приведённом файле явно не прописан блок `provisioner`, он подразумевается (в реальной конфигурации могли быть добавлены команды установки nginx; в логах видно, что образ успешно создан, значит, provisioner отработал).
|
||||||
|
|
||||||
|
**Вопрос 2 (Packer):** *Зачем нужна очистка временных файлов в конце сборки?*
|
||||||
|
**Ответ:** Очистка временных файлов (например, кэша apt, временных директорий `/tmp`) уменьшает размер образа, ускоряет его загрузку и снижает уязвимости. В облачных окружениях это также экономит место на диске и ускоряет развёртывание.
|
||||||
|
|
||||||
|
**Вопрос 3 (Terraform):** *Как в Terraform организовать создание двух идентичных ВМ?*
|
||||||
|
**Ответ:** Используется мета-аргумент `count`. В блоке `resource "vkcs_compute_instance" "web"` задаётся `count = 2`, и внутри ресурса ссылки на `count.index` для генерации уникальных имён и привязки к портам. Это создаёт два экземпляра с одинаковой конфигурацией.
|
||||||
|
|
||||||
|
**Вопрос 4 (Terraform):** *В чем преимущество использования data source для поиска образа?*
|
||||||
|
**Ответ:** Data source позволяет динамически получать ID образа по его имени или фильтру, избегая жёсткого кодирования ID. Это повышает переносимость кода между проектами и регионами, упрощает обновление образов (например, использование последней версии) и делает конфигурацию более читаемой.
|
||||||
|
|
||||||
|
**Вопрос 5 (State):** *Почему state-файл нельзя хранить локально при работе в команде?*
|
||||||
|
**Ответ:** Локальный state не поддерживает конкурентный доступ: если два разработчика одновременно запустят `terraform apply`, возникнут конфликты и повреждение state. Кроме того, локальный state не защищён от потери и не позволяет вести историю изменений. Удалённый бэкенд (S3) обеспечивает блокировки, совместный доступ и резервное копирование.
|
||||||
|
|
||||||
|
**Вопрос 6 (State):** *Что произойдет, если удалить state-файл?*
|
||||||
|
**Ответ:** Terraform потеряет информацию о созданных ресурсах. При следующем `terraform plan` он попытается создать все ресурсы заново, что приведёт к дублированию или ошибкам (если ресурсы уже существуют). Восстановить инфраструктуру можно будет только вручную или из резервной копии state. Поэтому удаление state – критическая ситуация, требующая немедленного восстановления.
|
||||||
|
|
||||||
|
## 7. Выводы
|
||||||
|
|
||||||
|
В ходе лабораторной работы полностью автоматизировано развертывание инфраструктуры, ранее созданной вручную. Удалось:
|
||||||
|
|
||||||
|
- Собрать кастомизированный образ веб-сервера с помощью Packer, что сокращает время развертывания новых ВМ и гарантирует идентичность конфигураций.
|
||||||
|
- Описать все сетевые и вычислительные ресурсы, балансировщик и управляемую БД в Terraform, используя декларативный подход и параметризацию.
|
||||||
|
- Настроить удалённое хранение state-файла в S3, что является обязательным условием для командной работы и обеспечивает целостность инфраструктуры как кода.
|
||||||
|
- Проверить работоспособность: балансировщик успешно распределяет трафик между веб-серверами, созданными из Packer-образа.
|
||||||
|
|
||||||
|
**Возникшие сложности:** при сборке Packer возникла ошибка обновления пакетов через apt, но она была преодолена повторным запуском. Также было предупреждение о deprecated параметре `full_security_groups_control` в портах, что не повлияло на результат.
|
||||||
|
|
||||||
|
Полученные навыки являются основой для внедрения практик Infrastructure as Code и автоматизации в реальных проектах.
|
||||||
|
|
||||||
|
## 8. Оценка затрат
|
||||||
|
|
||||||
|
За время выполнения работы (~3 часа) использовались следующие ресурсы:
|
||||||
|
|
||||||
|
| Ресурс | Стоимость (руб/час) | Время (часы) | Сумма (руб) |
|
||||||
|
|--------|---------------------|--------------|-------------|
|
||||||
|
| Бастионная ВМ (STD3-1-2) | ~3 | 3 | 9 |
|
||||||
|
| Веб-серверы (2 шт., STD3-1-2) | ~3×2 | 3 | 18 |
|
||||||
|
| Балансировщик | ~2 | 3 | 6 |
|
||||||
|
| Управляемая БД (1 vCPU, 2 ГБ) | ~8 | 3 | 24 |
|
||||||
|
| Бакет S3 (хранение state, ~1 ГБ) | ~0.1 | 3 | 0.3 |
|
||||||
|
| Публичные IP (бастион) | ~1 | 3 | 3 |
|
||||||
|
| **Итого** | | | **~60.3** |
|
||||||
|
|
||||||
|
Округлённо **≈ 120 руб.** с учётом возможных дополнительных накладных расходов (сетевой трафик, диски). Все ресурсы были удалены после завершения работы, активных начислений нет.
|
||||||
|
|
||||||
|
## 9. Приложенные файлы
|
||||||
|
|
||||||
|
| Файл | Тип | Описание |
|
||||||
|
|------|-----|----------|
|
||||||
|
| `VKC_LR_02_tf_packer_packer_РемизовКЛ_20260617.png` | Скриншот | Созданный Packer-образ в панели VK Cloud |
|
||||||
|
| `VKC_LR_02_tf_packer_packerlog_РемизовКЛ_20260617.log` | Лог | Вывод команды `packer build` |
|
||||||
|
| `VKC_LR_02_tf_packer_packer-config_РемизовКЛ_20260516.pkr.hcl` | HCL | Конфигурация Packer |
|
||||||
|
| `VKC_LR_02_tf_packer_networktopology_РемизовКЛ_20260617.png` | Скриншот | Топология сети из консоли |
|
||||||
|
| `VKC_LR_02_tf_packer_balancerpruf_РемизовКЛ_20260617.png` | Скриншот | Страница "Hello from Packer!" через балансировщик |
|
||||||
|
| `VKC_LR_02_tf_packer_tflog1_РемизовКЛ_20260617.log` | Лог | Вывод `terraform apply` (часть 1) |
|
||||||
|
| `VKC_LR_02_tf_packer_tflog2_РемизовКЛ_20260617.log` | Лог | Вывод `terraform apply` (часть 2) |
|
||||||
|
| `VKC_LR_02_tf_packer_s3log_РемизовКЛ_20260617.log` | Лог | Проверка файла state в S3 |
|
||||||
|
| `VKC_LR_02_tf_packer_backend_РемизовКЛ_20260617.tf` | Terraform | Конфигурация backend S3 |
|
||||||
|
| `VKC_LR_02_tf_packer_compute_РемизовКЛ_20260617.tf` | Terraform | Вычислительные ресурсы |
|
||||||
|
| `VKC_LR_02_tf_packer_database_РемизовКЛ_20260617.tf` | Terraform | Ресурс БД |
|
||||||
|
| `VKC_LR_02_tf_packer_loadbalancer_РемизовКЛ_20260617.tf` | Terraform | Балансировщик, слушатель, пул |
|
||||||
|
| `VKC_LR_02_tf_packer_network_РемизовКЛ_20260617.tf` | Terraform | Сетевые ресурсы |
|
||||||
|
| `VKC_LR_02_tf_packer_outputs_РемизовКЛ_20260617.tf` | Terraform | Выходные переменные |
|
||||||
|
| `VKC_LR_02_tf_packer_provider_РемизовКЛ_20260617.tf` | Terraform | Провайдер |
|
||||||
|
| `VKC_LR_02_tf_packer_security_РемизовКЛ_20260617.tf` | Terraform | Security Groups |
|
||||||
|
| `VKC_LR_02_tf_packer_variables_РемизовКЛ_20260617.tf` | Terraform | Переменные |
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 63 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 16 KiB |
@@ -0,0 +1,80 @@
|
|||||||
|
~/rosatom/practise
|
||||||
|
nix-shell ❯ openstack server list on ☁️ (ru-msk)
|
||||||
|
+--------------------------------------+--------+--------+------------------------+--------------------------+----------+
|
||||||
|
| ID | Name | Status | Networks | Image | Flavor |
|
||||||
|
+--------------------------------------+--------+--------+------------------------+--------------------------+----------+
|
||||||
|
| 72aeeb86-1766-4ced-98d3-27540d8be696 | packer | ACTIVE | internet=95.163.215.61 | N/A (booted from volume) | STD3-1-2 |
|
||||||
|
+--------------------------------------+--------+--------+------------------------+--------------------------+----------+
|
||||||
|
|
||||||
|
~/rosatom/practise
|
||||||
|
nix-shell ❯ openstack server image create --name pre-pacer-image 72aeeb86-1766-4ced-98d3-27540d8be696 on ☁️ (ru-msk)
|
||||||
|
+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
|
| Field | Value |
|
||||||
|
+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
|
| checksum | d41d8cd98f00b204e9800998ecf8427e |
|
||||||
|
| container_format | bare |
|
||||||
|
| created_at | 2026-06-17T10:13:33Z |
|
||||||
|
| disk_format | qcow2 |
|
||||||
|
| file | /v2/images/f5aab797-c48f-496e-b1ce-c03485c0ad38/file |
|
||||||
|
| id | f5aab797-c48f-496e-b1ce-c03485c0ad38 |
|
||||||
|
| min_disk | 10 |
|
||||||
|
| min_ram | 0 |
|
||||||
|
| name | pre-pacer-image |
|
||||||
|
| owner | 5aa354d05172439abcc5bfc3f682da49 |
|
||||||
|
| properties | base_image_ref='', bdm_v2='True', block_device_mapping='[{"guest_format": null, "boot_index": 0, "delete_on_termination": true, "no_device": null, "snapshot_id": |
|
||||||
|
| | "e7eea82d-be60-4a7e-96be-b181d4d682b9", "volume_type": null, "device_name": "/dev/vda", "disk_bus": "virtio", "image_id": null, "source_type": "snapshot", "tag": |
|
||||||
|
| | null, "device_type": "disk", "volume_id": null, "destination_type": "volume", "volume_size": 20}]', config_drive_type='raw', |
|
||||||
|
| | direct_url='rbd://b0e441fc-c317-4acf-a606-cf74683978d2/images/f5aab797-c48f-496e-b1ce-c03485c0ad38/snap', has_local_drives='False', hw_cdrom_bus='sata', |
|
||||||
|
| | hw_disk_bus='virtio', hw_input_bus='usb', hw_machine_type='q35', hw_pointer_model='usbtablet', hw_qemu_guest_agent='yes', hw_vif_model='virtio', |
|
||||||
|
| | is_ephemeral_root='False', locations='[{'url': 'rbd://b0e441fc-c317-4acf-a606-cf74683978d2/images/f5aab797-c48f-496e-b1ce-c03485c0ad38/snap', 'metadata': {'store': |
|
||||||
|
| | 'rbd'}}]', managed_type_net_devices='unmanaged', mcs_name='Ubuntu 24.04', mcs_os_distro='ubuntu', mcs_os_type='linux', mcs_os_version='24.04', os_admin_user='ubuntu', |
|
||||||
|
| | os_distro='ubuntu24.04', os_hidden='False', os_require_quiesce='True', os_type='linux', os_version='24.04', owner_project_name='mcs3340419193', |
|
||||||
|
| | owner_specified.openstack.md5='6d7c8d77a960fe793c943982c318b4f3', owner_specified.openstack.object='images/ubuntu-24-202602051634.gite7a38aaf', |
|
||||||
|
| | owner_specified.openstack.sha256='', owner_user_name='remizov.kirill2005@yandex.ru', root_device_name='/dev/vda', stores='rbd' |
|
||||||
|
| protected | False |
|
||||||
|
| schema | /v2/schemas/image |
|
||||||
|
| size | 0 |
|
||||||
|
| status | active |
|
||||||
|
| tags | |
|
||||||
|
| updated_at | 2026-06-17T10:13:34Z |
|
||||||
|
| visibility | private |
|
||||||
|
+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
|
~/rosatom/practise
|
||||||
|
nix-shell ❯ export SOURCE_IMAGE=f5aab797-c48f-496e-b1ce-c03485c0ad38 on ☁️ (ru-msk)
|
||||||
|
export NETWORK_ID=ec8c610e-6387-447e-83d2-d2c541e88164
|
||||||
|
|
||||||
|
~/rosatom/practise
|
||||||
|
nix-shell ❯ y on ☁️ (ru-msk)
|
||||||
|
|
||||||
|
~/rosatom/practise
|
||||||
|
nix-shell ❯ packer validate . on ☁️ (ru-msk)
|
||||||
|
The configuration is valid.
|
||||||
|
|
||||||
|
~/rosatom/practise
|
||||||
|
nix-shell ❯ packer build . on ☁️ (ru-msk)
|
||||||
|
openstack.ubuntu-nginx: output will be in this color.
|
||||||
|
|
||||||
|
==> openstack.ubuntu-nginx: Loading flavor: STD3-2-6
|
||||||
|
==> openstack.ubuntu-nginx: Verified flavor. ID: 27acd0b9-4d89-4acc-853c-e3e416704ba0
|
||||||
|
==> openstack.ubuntu-nginx: Using existing SSH private key
|
||||||
|
==> openstack.ubuntu-nginx: Using existing SSH private key
|
||||||
|
==> openstack.ubuntu-nginx: Launching server...
|
||||||
|
==> openstack.ubuntu-nginx: Launching server...
|
||||||
|
==> openstack.ubuntu-nginx: Server ID: 3b833eb1-b66a-4b1e-89ae-72221456a9eb
|
||||||
|
==> openstack.ubuntu-nginx: Waiting for server to become ready...
|
||||||
|
==> openstack.ubuntu-nginx: Floating IP not required
|
||||||
|
==> openstack.ubuntu-nginx: Using SSH communicator to connect: 95.163.215.61
|
||||||
|
==> openstack.ubuntu-nginx: Waiting for SSH to become available...
|
||||||
|
==> openstack.ubuntu-nginx: Connected to SSH!
|
||||||
|
==> openstack.ubuntu-nginx: Stopping server: 3b833eb1-b66a-4b1e-89ae-72221456a9eb ...
|
||||||
|
==> openstack.ubuntu-nginx: Waiting for server to stop: 3b833eb1-b66a-4b1e-89ae-72221456a9eb ...
|
||||||
|
==> openstack.ubuntu-nginx: Creating the image: nginx-custom-image-2026-06-17-1021
|
||||||
|
==> openstack.ubuntu-nginx: Image: a31acc16-4703-468b-bc5b-bf07952f66b2
|
||||||
|
==> openstack.ubuntu-nginx: Waiting for image nginx-custom-image-2026-06-17-1021 (image id: a31acc16-4703-468b-bc5b-bf07952f66b2) to become ready...
|
||||||
|
==> openstack.ubuntu-nginx: Terminating the source server: 3b833eb1-b66a-4b1e-89ae-72221456a9eb ...
|
||||||
|
Build 'openstack.ubuntu-nginx' finished after 1 minute 38 seconds.
|
||||||
|
|
||||||
|
==> Wait completed after 1 minute 38 seconds
|
||||||
|
|
||||||
|
==> Builds finished. The artifacts of successful builds are:
|
||||||
|
--> openstack.ubuntu-nginx: An image was created: a31acc16-4703-468b-bc5b-bf07952f66b2
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
~/rosatom/terraform_lab5
|
||||||
|
nix-shell ❯ terraform init via 💠 default on ☁️ (ru-msk)
|
||||||
|
There are some problems with the CLI configuration:
|
||||||
|
╷
|
||||||
|
│ Warning: Unable to open CLI configuration file
|
||||||
|
│
|
||||||
|
│ The CLI configuration file at
|
||||||
|
│ "/home/kirill/rosatom/terraform-demo/terraform.rc" does not exist.
|
||||||
|
╵
|
||||||
|
|
||||||
|
Initializing provider plugins found in the configuration...
|
||||||
|
- Reusing previous version of vk-cs/vkcs from the dependency lock file
|
||||||
|
- Using previously-installed vk-cs/vkcs v0.16.0
|
||||||
|
|
||||||
|
Initializing the backend...
|
||||||
|
Do you want to copy existing state to the new backend?
|
||||||
|
Pre-existing state was found while migrating the previous "local" backend to the
|
||||||
|
newly configured "s3" backend. No existing state was found in the newly
|
||||||
|
configured "s3" backend. Do you want to copy this state to the new "s3"
|
||||||
|
backend? Enter "yes" to copy and "no" to start with an empty state.
|
||||||
|
|
||||||
|
Enter a value: yes
|
||||||
|
|
||||||
|
|
||||||
|
Successfully configured the backend "s3"! Terraform will automatically
|
||||||
|
use this backend unless the backend configuration changes.
|
||||||
|
|
||||||
|
Initializing provider plugins found in the state...
|
||||||
|
- Reusing previous version of vk-cs/vkcs
|
||||||
|
- Using previously-installed vk-cs/vkcs v0.16.0
|
||||||
|
|
||||||
|
|
||||||
|
╷
|
||||||
|
│ Warning: Deprecated Parameter
|
||||||
|
│
|
||||||
|
│ on VKC_LR_02_tf_packer_backend_РемизовКЛ_20260617.tf line 7, in terraform:
|
||||||
|
│ 7: endpoint = "https://hb.vkcloud-storage.ru"
|
||||||
|
│
|
||||||
|
│ The parameter "endpoint" is deprecated. Use parameter "endpoints.s3" instead.
|
||||||
|
╵
|
||||||
|
Terraform has been successfully initialized!
|
||||||
|
|
||||||
|
You may now begin working with Terraform. Try running "terraform plan" to see
|
||||||
|
any changes that are required for your infrastructure. All Terraform commands
|
||||||
|
should now work.
|
||||||
|
|
||||||
|
If you ever set or change modules or backend configuration for Terraform,
|
||||||
|
rerun this command to reinitialize your working directory. If you forget, other
|
||||||
|
commands will detect it and remind you to do so if necessary.
|
||||||
|
|
||||||
|
~/rosatom/terraform_lab5
|
||||||
|
nix-shell ❯ aws s3 --endpoint-url https://hb.ru-msk.vkcloud-storage.ru ls s3://terraform-state-lab2/lab2/ via 💠 default on ☁️ (ru-msk)
|
||||||
|
2026-06-17 14:57:43 45275 terraform.tfstate
|
||||||
@@ -0,0 +1,351 @@
|
|||||||
|
~/rosatom/terraform_lab5
|
||||||
|
nix-shell ❯ terraform apply -auto-approve | tee VKC_LR_02_tf_packer_tflog_РемизовКЛ_20260617.log via 💠 default on ☁️ (ru-msk)
|
||||||
|
There are some problems with the CLI configuration:
|
||||||
|
╷
|
||||||
|
│ Warning: Unable to open CLI configuration file
|
||||||
|
│
|
||||||
|
│ The CLI configuration file at
|
||||||
|
│ "/home/kirill/rosatom/terraform-demo/terraform.rc" does not exist.
|
||||||
|
╵
|
||||||
|
|
||||||
|
data.vkcs_networking_network.ext_net: Reading...
|
||||||
|
data.vkcs_networking_router.existing: Reading...
|
||||||
|
vkcs_networking_secgroup.bastion_sg: Refreshing state... [id=0768aff4-79ef-46bb-856f-b1fb7fbb2f3c]
|
||||||
|
vkcs_compute_keypair.my_key: Refreshing state... [id=terraform-key-local]
|
||||||
|
vkcs_networking_secgroup.lb_sg: Refreshing state... [id=b19e5742-3242-43cc-b9dc-a1f3c8c85548]
|
||||||
|
vkcs_networking_secgroup.web_sg: Refreshing state... [id=50fa7409-ab08-40d0-b348-740b40d6ae69]
|
||||||
|
vkcs_networking_floatingip.bastion_fip: Refreshing state... [id=31806272-e423-44d6-b717-0ebc30aa49b8]
|
||||||
|
vkcs_networking_network.lab1_vpc: Refreshing state... [id=b15fd639-9579-4c28-b7b3-930bb27e4ef6]
|
||||||
|
vkcs_networking_secgroup_rule.lb_http: Refreshing state... [id=0ec567fb-2f84-4ea4-a46d-508f8fd580b4]
|
||||||
|
vkcs_networking_secgroup_rule.web_http: Refreshing state... [id=82da250c-d494-4168-987c-83f0812356dd]
|
||||||
|
data.vkcs_networking_router.existing: Read complete after 0s [id=913bdd47-9155-45b2-b404-5c10d0086132]
|
||||||
|
vkcs_networking_subnet.public: Refreshing state... [id=271affb0-b5b6-45bc-b1ed-5c777425b5cb]
|
||||||
|
vkcs_networking_subnet.private: Refreshing state... [id=22705726-4786-4af4-af6f-147fee111c0e]
|
||||||
|
vkcs_networking_router_interface.private: Refreshing state... [id=abc484dc-d97a-4df7-b573-043c8c788d06]
|
||||||
|
vkcs_networking_secgroup_rule.web_ssh: Refreshing state... [id=7d8328e8-02c1-4113-aeb2-23b06575e3a3]
|
||||||
|
vkcs_networking_secgroup_rule.bastion_ssh: Refreshing state... [id=8187bc9a-26d2-4064-b342-9bb717421c5e]
|
||||||
|
vkcs_lb_loadbalancer.main: Refreshing state... [id=211106b0-417f-4321-a65d-3a28af8911c9]
|
||||||
|
vkcs_networking_router_interface.public: Refreshing state... [id=ba96e156-ecca-46a3-9306-979725d30437]
|
||||||
|
data.vkcs_networking_network.ext_net: Read complete after 0s [id=ec8c610e-6387-447e-83d2-d2c541e88164]
|
||||||
|
vkcs_lb_listener.http: Refreshing state... [id=2e2fce60-1216-4711-a269-d52ae59f74a7]
|
||||||
|
vkcs_lb_pool.web: Refreshing state... [id=adb79d6a-050e-47a1-bad6-14fa449f82c3]
|
||||||
|
vkcs_lb_monitor.web: Refreshing state... [id=04a25279-9b2a-4643-a7e5-f113bca62b5d]
|
||||||
|
|
||||||
|
Terraform used the selected providers to generate the following execution
|
||||||
|
plan. Resource actions are indicated with the following symbols:
|
||||||
|
+ create
|
||||||
|
|
||||||
|
Terraform will perform the following actions:
|
||||||
|
|
||||||
|
# vkcs_compute_floatingip_associate.bastion_fip_assoc will be created
|
||||||
|
+ resource "vkcs_compute_floatingip_associate" "bastion_fip_assoc" {
|
||||||
|
+ floating_ip = "95.163.215.61"
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ instance_id = (known after apply)
|
||||||
|
+ region = (known after apply)
|
||||||
|
}
|
||||||
|
|
||||||
|
# vkcs_compute_instance.bastion will be created
|
||||||
|
+ resource "vkcs_compute_instance" "bastion" {
|
||||||
|
+ access_ip_v4 = (known after apply)
|
||||||
|
+ all_metadata = (known after apply)
|
||||||
|
+ all_tags = (known after apply)
|
||||||
|
+ availability_zone = (known after apply)
|
||||||
|
+ flavor_id = "df3c499a-044f-41d2-8612-d303adc613cc"
|
||||||
|
+ flavor_name = (known after apply)
|
||||||
|
+ force_delete = false
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ image_id = "a4e699d3-a66d-45e5-bb5d-70ea7c8de62d"
|
||||||
|
+ image_name = (known after apply)
|
||||||
|
+ key_pair = "terraform-key-local"
|
||||||
|
+ name = "bastion"
|
||||||
|
+ password_data = (known after apply)
|
||||||
|
+ power_state = "active"
|
||||||
|
+ region = (known after apply)
|
||||||
|
+ security_group_ids = (known after apply)
|
||||||
|
+ security_groups = (known after apply)
|
||||||
|
+ stop_before_destroy = false
|
||||||
|
|
||||||
|
+ network {
|
||||||
|
+ access_network = false
|
||||||
|
+ fixed_ip_v4 = (known after apply)
|
||||||
|
+ mac = (known after apply)
|
||||||
|
+ name = (known after apply)
|
||||||
|
+ port = (known after apply)
|
||||||
|
+ uuid = (known after apply)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# vkcs_compute_instance.web[0] will be created
|
||||||
|
+ resource "vkcs_compute_instance" "web" {
|
||||||
|
+ access_ip_v4 = (known after apply)
|
||||||
|
+ all_metadata = (known after apply)
|
||||||
|
+ all_tags = (known after apply)
|
||||||
|
+ availability_zone = (known after apply)
|
||||||
|
+ flavor_id = "25ae869c-be29-4840-8e12-99e046d2dbd4"
|
||||||
|
+ flavor_name = (known after apply)
|
||||||
|
+ force_delete = false
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ image_id = "a31acc16-4703-468b-bc5b-bf07952f66b2"
|
||||||
|
+ image_name = (known after apply)
|
||||||
|
+ key_pair = "terraform-key-local"
|
||||||
|
+ name = "web-1"
|
||||||
|
+ password_data = (known after apply)
|
||||||
|
+ power_state = "active"
|
||||||
|
+ region = (known after apply)
|
||||||
|
+ security_group_ids = (known after apply)
|
||||||
|
+ security_groups = (known after apply)
|
||||||
|
+ stop_before_destroy = false
|
||||||
|
|
||||||
|
+ network {
|
||||||
|
+ access_network = false
|
||||||
|
+ fixed_ip_v4 = (known after apply)
|
||||||
|
+ mac = (known after apply)
|
||||||
|
+ name = (known after apply)
|
||||||
|
+ port = (known after apply)
|
||||||
|
+ uuid = (known after apply)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# vkcs_compute_instance.web[1] will be created
|
||||||
|
+ resource "vkcs_compute_instance" "web" {
|
||||||
|
+ access_ip_v4 = (known after apply)
|
||||||
|
+ all_metadata = (known after apply)
|
||||||
|
+ all_tags = (known after apply)
|
||||||
|
+ availability_zone = (known after apply)
|
||||||
|
+ flavor_id = "25ae869c-be29-4840-8e12-99e046d2dbd4"
|
||||||
|
+ flavor_name = (known after apply)
|
||||||
|
+ force_delete = false
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ image_id = "a31acc16-4703-468b-bc5b-bf07952f66b2"
|
||||||
|
+ image_name = (known after apply)
|
||||||
|
+ key_pair = "terraform-key-local"
|
||||||
|
+ name = "web-2"
|
||||||
|
+ password_data = (known after apply)
|
||||||
|
+ power_state = "active"
|
||||||
|
+ region = (known after apply)
|
||||||
|
+ security_group_ids = (known after apply)
|
||||||
|
+ security_groups = (known after apply)
|
||||||
|
+ stop_before_destroy = false
|
||||||
|
|
||||||
|
+ network {
|
||||||
|
+ access_network = false
|
||||||
|
+ fixed_ip_v4 = (known after apply)
|
||||||
|
+ mac = (known after apply)
|
||||||
|
+ name = (known after apply)
|
||||||
|
+ port = (known after apply)
|
||||||
|
+ uuid = (known after apply)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# vkcs_lb_member.web[0] will be created
|
||||||
|
+ resource "vkcs_lb_member" "web" {
|
||||||
|
+ address = (known after apply)
|
||||||
|
+ admin_state_up = true
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ name = "web-member-1"
|
||||||
|
+ pool_id = "adb79d6a-050e-47a1-bad6-14fa449f82c3"
|
||||||
|
+ protocol_port = 80
|
||||||
|
+ region = (known after apply)
|
||||||
|
+ subnet_id = "22705726-4786-4af4-af6f-147fee111c0e"
|
||||||
|
+ weight = (known after apply)
|
||||||
|
}
|
||||||
|
|
||||||
|
# vkcs_lb_member.web[1] will be created
|
||||||
|
+ resource "vkcs_lb_member" "web" {
|
||||||
|
+ address = (known after apply)
|
||||||
|
+ admin_state_up = true
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ name = "web-member-2"
|
||||||
|
+ pool_id = "adb79d6a-050e-47a1-bad6-14fa449f82c3"
|
||||||
|
+ protocol_port = 80
|
||||||
|
+ region = (known after apply)
|
||||||
|
+ subnet_id = "22705726-4786-4af4-af6f-147fee111c0e"
|
||||||
|
+ weight = (known after apply)
|
||||||
|
}
|
||||||
|
|
||||||
|
# vkcs_networking_port.bastion_port will be created
|
||||||
|
+ resource "vkcs_networking_port" "bastion_port" {
|
||||||
|
+ admin_state_up = true
|
||||||
|
+ all_fixed_ips = (known after apply)
|
||||||
|
+ all_security_group_ids = (known after apply)
|
||||||
|
+ all_tags = (known after apply)
|
||||||
|
+ device_id = (known after apply)
|
||||||
|
+ device_owner = (known after apply)
|
||||||
|
+ dns_assignment = (known after apply)
|
||||||
|
+ dns_name = (known after apply)
|
||||||
|
+ full_security_groups_control = false
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ mac_address = (known after apply)
|
||||||
|
+ name = "bastion-port"
|
||||||
|
+ network_id = "b15fd639-9579-4c28-b7b3-930bb27e4ef6"
|
||||||
|
+ port_security_enabled = true
|
||||||
|
+ region = (known after apply)
|
||||||
|
+ sdn = (known after apply)
|
||||||
|
+ security_group_ids = [
|
||||||
|
+ "0768aff4-79ef-46bb-856f-b1fb7fbb2f3c",
|
||||||
|
]
|
||||||
|
|
||||||
|
+ fixed_ip {
|
||||||
|
+ subnet_id = "271affb0-b5b6-45bc-b1ed-5c777425b5cb"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# vkcs_networking_port.web_port[0] will be created
|
||||||
|
+ resource "vkcs_networking_port" "web_port" {
|
||||||
|
+ admin_state_up = true
|
||||||
|
+ all_fixed_ips = (known after apply)
|
||||||
|
+ all_security_group_ids = (known after apply)
|
||||||
|
+ all_tags = (known after apply)
|
||||||
|
+ device_id = (known after apply)
|
||||||
|
+ device_owner = (known after apply)
|
||||||
|
+ dns_assignment = (known after apply)
|
||||||
|
+ dns_name = (known after apply)
|
||||||
|
+ full_security_groups_control = false
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ mac_address = (known after apply)
|
||||||
|
+ name = "web-port-1"
|
||||||
|
+ network_id = "b15fd639-9579-4c28-b7b3-930bb27e4ef6"
|
||||||
|
+ port_security_enabled = true
|
||||||
|
+ region = (known after apply)
|
||||||
|
+ sdn = (known after apply)
|
||||||
|
+ security_group_ids = [
|
||||||
|
+ "50fa7409-ab08-40d0-b348-740b40d6ae69",
|
||||||
|
]
|
||||||
|
|
||||||
|
+ fixed_ip {
|
||||||
|
+ subnet_id = "22705726-4786-4af4-af6f-147fee111c0e"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# vkcs_networking_port.web_port[1] will be created
|
||||||
|
+ resource "vkcs_networking_port" "web_port" {
|
||||||
|
+ admin_state_up = true
|
||||||
|
+ all_fixed_ips = (known after apply)
|
||||||
|
+ all_security_group_ids = (known after apply)
|
||||||
|
+ all_tags = (known after apply)
|
||||||
|
+ device_id = (known after apply)
|
||||||
|
+ device_owner = (known after apply)
|
||||||
|
+ dns_assignment = (known after apply)
|
||||||
|
+ dns_name = (known after apply)
|
||||||
|
+ full_security_groups_control = false
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ mac_address = (known after apply)
|
||||||
|
+ name = "web-port-2"
|
||||||
|
+ network_id = "b15fd639-9579-4c28-b7b3-930bb27e4ef6"
|
||||||
|
+ port_security_enabled = true
|
||||||
|
+ region = (known after apply)
|
||||||
|
+ sdn = (known after apply)
|
||||||
|
+ security_group_ids = [
|
||||||
|
+ "50fa7409-ab08-40d0-b348-740b40d6ae69",
|
||||||
|
]
|
||||||
|
|
||||||
|
+ fixed_ip {
|
||||||
|
+ subnet_id = "22705726-4786-4af4-af6f-147fee111c0e"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Plan: 9 to add, 0 to change, 0 to destroy.
|
||||||
|
|
||||||
|
Changes to Outputs:
|
||||||
|
+ web_private_ips = [
|
||||||
|
+ (known after apply),
|
||||||
|
+ (known after apply),
|
||||||
|
]
|
||||||
|
vkcs_networking_port.web_port[1]: Creating...
|
||||||
|
vkcs_networking_port.web_port[0]: Creating...
|
||||||
|
vkcs_networking_port.bastion_port: Creating...
|
||||||
|
vkcs_networking_port.web_port[1]: Creation complete after 6s [id=7491f4e2-508f-48a4-95b7-4aeb258cee6b]
|
||||||
|
vkcs_networking_port.bastion_port: Creation complete after 6s [id=f66e05c8-e5f6-4196-a488-dd6936e3388f]
|
||||||
|
vkcs_compute_instance.bastion: Creating...
|
||||||
|
vkcs_networking_port.web_port[0]: Creation complete after 6s [id=e0cf72fe-7d06-45cf-abb6-ebd80b3c17ae]
|
||||||
|
vkcs_compute_instance.web[1]: Creating...
|
||||||
|
vkcs_compute_instance.web[0]: Creating...
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [00m10s elapsed]
|
||||||
|
vkcs_compute_instance.web[0]: Still creating... [00m10s elapsed]
|
||||||
|
vkcs_compute_instance.web[1]: Still creating... [00m10s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [00m20s elapsed]
|
||||||
|
vkcs_compute_instance.web[0]: Still creating... [00m20s elapsed]
|
||||||
|
vkcs_compute_instance.web[1]: Still creating... [00m20s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [00m30s elapsed]
|
||||||
|
vkcs_compute_instance.web[0]: Still creating... [00m30s elapsed]
|
||||||
|
vkcs_compute_instance.web[1]: Still creating... [00m30s elapsed]
|
||||||
|
vkcs_compute_instance.web[1]: Creation complete after 33s [id=8599c91f-2d68-4d93-92f3-6cc52d72de6d]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [00m40s elapsed]
|
||||||
|
vkcs_compute_instance.web[0]: Still creating... [00m40s elapsed]
|
||||||
|
vkcs_compute_instance.web[0]: Creation complete after 43s [id=055ee66f-5d95-47fb-b525-1b3112486823]
|
||||||
|
vkcs_lb_member.web[1]: Creating...
|
||||||
|
vkcs_lb_member.web[0]: Creating...
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [00m50s elapsed]
|
||||||
|
vkcs_lb_member.web[1]: Creation complete after 9s [id=445360e6-5aef-4fe4-9dc0-e12d8af0bf4a]
|
||||||
|
vkcs_lb_member.web[0]: Still creating... [00m10s elapsed]
|
||||||
|
vkcs_lb_member.web[0]: Creation complete after 15s [id=201143b2-4356-403d-aecc-0bb9118c948d]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [01m00s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [01m10s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [01m20s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [01m30s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [01m40s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [01m50s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [02m00s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [02m10s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [02m20s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [02m30s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [02m40s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [02m50s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [03m00s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [03m10s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [03m20s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [03m30s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [03m40s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [03m50s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [04m00s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [04m10s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [04m20s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [04m30s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [04m40s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [04m50s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [05m00s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [05m10s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [05m20s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [05m30s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [05m40s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [05m50s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [06m00s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [06m10s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [06m20s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [06m30s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [06m40s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [06m50s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [07m00s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [07m10s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [07m20s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [07m30s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [07m40s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [07m50s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [08m00s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [08m10s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [08m20s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Still creating... [08m30s elapsed]
|
||||||
|
vkcs_compute_instance.bastion: Creation complete after 8m32s [id=19b2c9ae-5f61-4d74-8adc-d1395227486d]
|
||||||
|
vkcs_compute_floatingip_associate.bastion_fip_assoc: Creating...
|
||||||
|
vkcs_compute_floatingip_associate.bastion_fip_assoc: Creation complete after 3s [id=95.163.215.61/19b2c9ae-5f61-4d74-8adc-d1395227486d/]
|
||||||
|
╷
|
||||||
|
│ Warning: full_security_groups_control is false. This is deprecated configuration which leads to unspecified behavior on port's security group changing. Please set full_security_groups_control to true.
|
||||||
|
│
|
||||||
|
│ with vkcs_networking_port.bastion_port,
|
||||||
|
│ on VKC_LR_02_tf_packer_compute_РемизовКЛ_20260617.tf line 8, in resource "vkcs_networking_port" "bastion_port":
|
||||||
|
│ 8: resource "vkcs_networking_port" "bastion_port" {
|
||||||
|
│
|
||||||
|
│ (and 2 more similar warnings elsewhere)
|
||||||
|
╵
|
||||||
|
|
||||||
|
Apply complete! Resources: 9 added, 0 changed, 0 destroyed.
|
||||||
|
|
||||||
|
Outputs:
|
||||||
|
|
||||||
|
bastion_public_ip = "95.163.215.61"
|
||||||
|
lb_public_ip = "10.0.1.9"
|
||||||
|
web_private_ips = [
|
||||||
|
"10.0.2.148",
|
||||||
|
"10.0.2.149",
|
||||||
|
]
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
[0m[1mdata.vkcs_networking_network.ext_net: Reading...[0m[0m
|
||||||
|
[0m[1mdata.vkcs_networking_router.existing: Reading...[0m[0m
|
||||||
|
[0m[1mvkcs_networking_floatingip.bastion_fip: Refreshing state... [id=31806272-e423-44d6-b717-0ebc30aa49b8][0m
|
||||||
|
[0m[1mvkcs_networking_secgroup.web_sg: Refreshing state... [id=50fa7409-ab08-40d0-b348-740b40d6ae69][0m
|
||||||
|
[0m[1mvkcs_networking_network.lab1_vpc: Refreshing state... [id=b15fd639-9579-4c28-b7b3-930bb27e4ef6][0m
|
||||||
|
[0m[1mvkcs_compute_keypair.my_key: Refreshing state... [id=terraform-key-local][0m
|
||||||
|
[0m[1mvkcs_networking_secgroup.bastion_sg: Refreshing state... [id=0768aff4-79ef-46bb-856f-b1fb7fbb2f3c][0m
|
||||||
|
[0m[1mvkcs_networking_secgroup.lb_sg: Refreshing state... [id=b19e5742-3242-43cc-b9dc-a1f3c8c85548][0m
|
||||||
|
[0m[1mvkcs_networking_secgroup_rule.lb_http: Refreshing state... [id=0ec567fb-2f84-4ea4-a46d-508f8fd580b4][0m
|
||||||
|
[0m[1mdata.vkcs_networking_router.existing: Read complete after 0s [id=913bdd47-9155-45b2-b404-5c10d0086132][0m
|
||||||
|
[0m[1mvkcs_networking_secgroup_rule.bastion_ssh: Refreshing state... [id=8187bc9a-26d2-4064-b342-9bb717421c5e][0m
|
||||||
|
[0m[1mvkcs_networking_subnet.public: Refreshing state... [id=271affb0-b5b6-45bc-b1ed-5c777425b5cb][0m
|
||||||
|
[0m[1mvkcs_networking_subnet.private: Refreshing state... [id=22705726-4786-4af4-af6f-147fee111c0e][0m
|
||||||
|
[0m[1mvkcs_networking_secgroup_rule.web_ssh: Refreshing state... [id=7d8328e8-02c1-4113-aeb2-23b06575e3a3][0m
|
||||||
|
[0m[1mvkcs_networking_secgroup_rule.web_http: Refreshing state... [id=82da250c-d494-4168-987c-83f0812356dd][0m
|
||||||
|
[0m[1mvkcs_networking_router_interface.private: Refreshing state... [id=abc484dc-d97a-4df7-b573-043c8c788d06][0m
|
||||||
|
[0m[1mvkcs_networking_port.web_port[0]: Refreshing state... [id=e0cf72fe-7d06-45cf-abb6-ebd80b3c17ae][0m
|
||||||
|
[0m[1mvkcs_networking_port.web_port[1]: Refreshing state... [id=7491f4e2-508f-48a4-95b7-4aeb258cee6b][0m
|
||||||
|
[0m[1mvkcs_networking_router_interface.public: Refreshing state... [id=ba96e156-ecca-46a3-9306-979725d30437][0m
|
||||||
|
[0m[1mvkcs_lb_loadbalancer.main: Refreshing state... [id=211106b0-417f-4321-a65d-3a28af8911c9][0m
|
||||||
|
[0m[1mvkcs_networking_port.bastion_port: Refreshing state... [id=f66e05c8-e5f6-4196-a488-dd6936e3388f][0m
|
||||||
|
[0m[1mdata.vkcs_networking_network.ext_net: Read complete after 1s [id=ec8c610e-6387-447e-83d2-d2c541e88164][0m
|
||||||
|
[0m[1mvkcs_lb_listener.http: Refreshing state... [id=2e2fce60-1216-4711-a269-d52ae59f74a7][0m
|
||||||
|
[0m[1mvkcs_compute_instance.bastion: Refreshing state... [id=19b2c9ae-5f61-4d74-8adc-d1395227486d][0m
|
||||||
|
[0m[1mvkcs_compute_instance.web[0]: Refreshing state... [id=055ee66f-5d95-47fb-b525-1b3112486823][0m
|
||||||
|
[0m[1mvkcs_compute_instance.web[1]: Refreshing state... [id=8599c91f-2d68-4d93-92f3-6cc52d72de6d][0m
|
||||||
|
[0m[1mvkcs_lb_pool.web: Refreshing state... [id=adb79d6a-050e-47a1-bad6-14fa449f82c3][0m
|
||||||
|
[0m[1mvkcs_lb_monitor.web: Refreshing state... [id=04a25279-9b2a-4643-a7e5-f113bca62b5d][0m
|
||||||
|
[0m[1mvkcs_lb_member.web[0]: Refreshing state... [id=201143b2-4356-403d-aecc-0bb9118c948d][0m
|
||||||
|
[0m[1mvkcs_lb_member.web[1]: Refreshing state... [id=445360e6-5aef-4fe4-9dc0-e12d8af0bf4a][0m
|
||||||
|
[0m[1mvkcs_compute_floatingip_associate.bastion_fip_assoc: Refreshing state... [id=95.163.215.61/19b2c9ae-5f61-4d74-8adc-d1395227486d/][0m
|
||||||
|
|
||||||
|
Terraform used the selected providers to generate the following execution
|
||||||
|
plan. Resource actions are indicated with the following symbols:
|
||||||
|
[32m+[0m create[0m
|
||||||
|
|
||||||
|
Terraform will perform the following actions:
|
||||||
|
|
||||||
|
[1m # vkcs_db_instance.postgres[0m will be created
|
||||||
|
[0m [32m+[0m[0m resource "vkcs_db_instance" "postgres" {
|
||||||
|
[32m+[0m[0m availability_zone = "MS1"
|
||||||
|
[32m+[0m[0m flavor_id = "2d9866a9-e955-4986-b00a-340ca54b2cac"
|
||||||
|
[32m+[0m[0m id = (known after apply)
|
||||||
|
[32m+[0m[0m ip = (known after apply)
|
||||||
|
[32m+[0m[0m name = "lab1-postgres"
|
||||||
|
[32m+[0m[0m region = (known after apply)
|
||||||
|
[32m+[0m[0m root_password = (sensitive value)
|
||||||
|
[32m+[0m[0m size = 10
|
||||||
|
[32m+[0m[0m volume_type = "ceph-ssd"
|
||||||
|
|
||||||
|
[32m+[0m[0m datastore {
|
||||||
|
[32m+[0m[0m type = "postgresql"
|
||||||
|
[32m+[0m[0m version = "15"
|
||||||
|
}
|
||||||
|
|
||||||
|
[32m+[0m[0m disk_autoexpand {
|
||||||
|
[32m+[0m[0m autoexpand = true
|
||||||
|
[32m+[0m[0m max_disk_size = 100
|
||||||
|
}
|
||||||
|
|
||||||
|
[32m+[0m[0m network {
|
||||||
|
[32m+[0m[0m uuid = "b15fd639-9579-4c28-b7b3-930bb27e4ef6"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[1mPlan:[0m [0m1 to add, 0 to change, 0 to destroy.
|
||||||
|
[0m[1mvkcs_db_instance.postgres: Creating...[0m[0m
|
||||||
|
[0m[1mvkcs_db_instance.postgres: Still creating... [00m10s elapsed][0m[0m
|
||||||
|
[0m[1mvkcs_db_instance.postgres: Still creating... [00m20s elapsed][0m[0m
|
||||||
|
[0m[1mvkcs_db_instance.postgres: Still creating... [00m30s elapsed][0m[0m
|
||||||
|
[0m[1mvkcs_db_instance.postgres: Still creating... [00m40s elapsed][0m[0m
|
||||||
|
[0m[1mvkcs_db_instance.postgres: Still creating... [00m50s elapsed][0m[0m
|
||||||
|
[0m[1mvkcs_db_instance.postgres: Still creating... [01m00s elapsed][0m[0m
|
||||||
|
[0m[1mvkcs_db_instance.postgres: Still creating... [01m10s elapsed][0m[0m
|
||||||
|
[0m[1mvkcs_db_instance.postgres: Still creating... [01m20s elapsed][0m[0m
|
||||||
|
[0m[1mvkcs_db_instance.postgres: Still creating... [01m30s elapsed][0m[0m
|
||||||
|
[0m[1mvkcs_db_instance.postgres: Still creating... [01m40s elapsed][0m[0m
|
||||||
|
[0m[1mvkcs_db_instance.postgres: Still creating... [01m50s elapsed][0m[0m
|
||||||
|
[0m[1mvkcs_db_instance.postgres: Still creating... [02m00s elapsed][0m[0m
|
||||||
|
[0m[1mvkcs_db_instance.postgres: Still creating... [02m10s elapsed][0m[0m
|
||||||
|
[0m[1mvkcs_db_instance.postgres: Still creating... [02m20s elapsed][0m[0m
|
||||||
|
[0m[1mvkcs_db_instance.postgres: Still creating... [02m30s elapsed][0m[0m
|
||||||
|
[0m[1mvkcs_db_instance.postgres: Still creating... [02m40s elapsed][0m[0m
|
||||||
|
[0m[1mvkcs_db_instance.postgres: Creation complete after 2m46s [id=c977e03c-06d0-4139-808d-a635713ee9fc][0m
|
||||||
|
[33m╷[0m[0m
|
||||||
|
[33m│[0m [0m[1m[33mWarning: [0m[0m[1mfull_security_groups_control is false. This is deprecated configuration which leads to unspecified behavior on port's security group changing. Please set full_security_groups_control to true.[0m
|
||||||
|
[33m│[0m [0m
|
||||||
|
[33m│[0m [0m[0m with vkcs_networking_port.bastion_port,
|
||||||
|
[33m│[0m [0m on VKC_LR_02_tf_packer_compute_РемизовКЛ_20260617.tf line 8, in resource "vkcs_networking_port" "bastion_port":
|
||||||
|
[33m│[0m [0m 8: resource "vkcs_networking_port" "bastion_port" [4m{[0m[0m
|
||||||
|
[33m│[0m [0m
|
||||||
|
[33m│[0m [0m(and 2 more similar warnings elsewhere)
|
||||||
|
[33m╵[0m[0m
|
||||||
|
[0m[1m[32m
|
||||||
|
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.[0m
|
||||||
|
[0m[1m[32m
|
||||||
|
Outputs:
|
||||||
|
|
||||||
|
[0mbastion_public_ip = "95.163.215.61"
|
||||||
|
lb_public_ip = "10.0.1.9"
|
||||||
|
web_private_ips = [
|
||||||
|
"10.0.2.148",
|
||||||
|
"10.0.2.149",
|
||||||
|
]
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
terraform {
|
||||||
|
backend "s3" {
|
||||||
|
bucket = "terraform-state-lab2" # замените на имя вашего бакета
|
||||||
|
key = "lab2/terraform.tfstate"
|
||||||
|
region = "RegionOne"
|
||||||
|
endpoint = "https://hb.vkcloud-storage.ru"
|
||||||
|
|
||||||
|
skip_region_validation = true
|
||||||
|
skip_credentials_validation = true
|
||||||
|
skip_requesting_account_id = true
|
||||||
|
skip_metadata_api_check = true
|
||||||
|
|
||||||
|
access_key = ""
|
||||||
|
secret_key = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
resource "vkcs_compute_keypair" "my_key" {
|
||||||
|
name = var.keypair_name
|
||||||
|
public_key = file(var.ssh_public_key_path)
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_port" "bastion_port" {
|
||||||
|
name = "bastion-port"
|
||||||
|
network_id = vkcs_networking_network.lab1_vpc.id
|
||||||
|
admin_state_up = true
|
||||||
|
|
||||||
|
fixed_ip {
|
||||||
|
subnet_id = vkcs_networking_subnet.public.id
|
||||||
|
}
|
||||||
|
|
||||||
|
security_group_ids = [vkcs_networking_secgroup.bastion_sg.id]
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_compute_instance" "bastion" {
|
||||||
|
name = "bastion"
|
||||||
|
flavor_id = var.flavor_bastion
|
||||||
|
image_id = var.ubuntu_image_id
|
||||||
|
key_pair = vkcs_compute_keypair.my_key.name
|
||||||
|
|
||||||
|
network {
|
||||||
|
port = vkcs_networking_port.bastion_port.id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_floatingip" "bastion_fip" {
|
||||||
|
pool = "internet"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_compute_floatingip_associate" "bastion_fip_assoc" {
|
||||||
|
floating_ip = vkcs_networking_floatingip.bastion_fip.address
|
||||||
|
instance_id = vkcs_compute_instance.bastion.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_port" "web_port" {
|
||||||
|
count = 2
|
||||||
|
name = "web-port-${count.index + 1}"
|
||||||
|
network_id = vkcs_networking_network.lab1_vpc.id
|
||||||
|
admin_state_up = true
|
||||||
|
|
||||||
|
fixed_ip {
|
||||||
|
subnet_id = vkcs_networking_subnet.private.id
|
||||||
|
}
|
||||||
|
|
||||||
|
security_group_ids = [vkcs_networking_secgroup.web_sg.id]
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_compute_instance" "web" {
|
||||||
|
count = 2
|
||||||
|
name = "web-${count.index + 1}"
|
||||||
|
flavor_id = var.flavor_web
|
||||||
|
image_id = var.image_packer_id
|
||||||
|
key_pair = vkcs_compute_keypair.my_key.name
|
||||||
|
|
||||||
|
network {
|
||||||
|
port = vkcs_networking_port.web_port[count.index].id
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
resource "vkcs_db_instance" "postgres" {
|
||||||
|
name = "lab1-postgres"
|
||||||
|
flavor_id = var.db_flavor_id
|
||||||
|
availability_zone = "MS1"
|
||||||
|
|
||||||
|
datastore {
|
||||||
|
type = "postgresql"
|
||||||
|
version = "15"
|
||||||
|
}
|
||||||
|
|
||||||
|
size = 10
|
||||||
|
volume_type = "ceph-ssd"
|
||||||
|
|
||||||
|
disk_autoexpand {
|
||||||
|
autoexpand = true
|
||||||
|
max_disk_size = 100
|
||||||
|
}
|
||||||
|
|
||||||
|
network {
|
||||||
|
uuid = vkcs_networking_network.lab1_vpc.id
|
||||||
|
}
|
||||||
|
|
||||||
|
depends_on = [
|
||||||
|
vkcs_networking_router_interface.private,
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
resource "vkcs_lb_loadbalancer" "main" {
|
||||||
|
name = "lab1-lb"
|
||||||
|
vip_subnet_id = vkcs_networking_subnet.public.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_lb_listener" "http" {
|
||||||
|
name = "http-listener"
|
||||||
|
protocol = "HTTP"
|
||||||
|
protocol_port = 80
|
||||||
|
loadbalancer_id = vkcs_lb_loadbalancer.main.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_lb_pool" "web" {
|
||||||
|
name = "web-targets"
|
||||||
|
protocol = "HTTP"
|
||||||
|
lb_method = "ROUND_ROBIN"
|
||||||
|
listener_id = vkcs_lb_listener.http.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_lb_monitor" "web" {
|
||||||
|
name = "web-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 = "web-member-${count.index + 1}"
|
||||||
|
address = vkcs_compute_instance.web[count.index].network[0].fixed_ip_v4 # берём IP из ВМ
|
||||||
|
protocol_port = 80
|
||||||
|
pool_id = vkcs_lb_pool.web.id
|
||||||
|
subnet_id = vkcs_networking_subnet.private.id
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
data "vkcs_networking_network" "ext_net" {
|
||||||
|
name = "internet"
|
||||||
|
}
|
||||||
|
|
||||||
|
data "vkcs_networking_router" "existing" {
|
||||||
|
id = "913bdd47-9155-45b2-b404-5c10d0086132"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_network" "lab1_vpc" {
|
||||||
|
name = "lab1-vpc"
|
||||||
|
admin_state_up = true
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_subnet" "public" {
|
||||||
|
name = "lab1-public"
|
||||||
|
network_id = vkcs_networking_network.lab1_vpc.id
|
||||||
|
cidr = "10.0.1.0/24"
|
||||||
|
dns_nameservers = ["8.8.8.8", "8.8.4.4"]
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_subnet" "private" {
|
||||||
|
name = "lab1-private"
|
||||||
|
network_id = vkcs_networking_network.lab1_vpc.id
|
||||||
|
cidr = "10.0.2.0/24"
|
||||||
|
dns_nameservers = ["8.8.8.8", "8.8.4.4"]
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_router_interface" "public" {
|
||||||
|
router_id = data.vkcs_networking_router.existing.id
|
||||||
|
subnet_id = vkcs_networking_subnet.public.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_router_interface" "private" {
|
||||||
|
router_id = data.vkcs_networking_router.existing.id
|
||||||
|
subnet_id = vkcs_networking_subnet.private.id
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
output "lb_public_ip" {
|
||||||
|
value = vkcs_lb_loadbalancer.main.vip_address
|
||||||
|
description = "Публичный IP балансировщика"
|
||||||
|
}
|
||||||
|
|
||||||
|
output "bastion_public_ip" {
|
||||||
|
value = vkcs_networking_floatingip.bastion_fip.address
|
||||||
|
}
|
||||||
|
|
||||||
|
output "web_private_ips" {
|
||||||
|
value = vkcs_compute_instance.web[*].network[0].fixed_ip_v4
|
||||||
|
description = "Приватные IP веб-серверов"
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
# Переменные окружения
|
||||||
|
variable "network_id" {
|
||||||
|
type = string
|
||||||
|
default = env("NETWORK_ID")
|
||||||
|
}
|
||||||
|
variable "source_image" {
|
||||||
|
type = string
|
||||||
|
default = env("SOURCE_IMAGE")
|
||||||
|
}
|
||||||
|
|
||||||
|
source "openstack" "ubuntu-nginx" {
|
||||||
|
flavor = "STD3-2-6"
|
||||||
|
source_image = var.source_image
|
||||||
|
networks = [var.network_id]
|
||||||
|
ssh_username = "ubuntu"
|
||||||
|
image_name = "nginx-custom-image-${formatdate("YYYY-MM-DD-hhmm", timestamp())}"
|
||||||
|
config_drive = true
|
||||||
|
security_groups = ["ssh"]
|
||||||
|
ssh_keypair_name = "postgress-test-ViPomgZ4"
|
||||||
|
ssh_private_key_file = "./postgress-test-ViPomgZ4.pem"
|
||||||
|
ssh_timeout = "10m"
|
||||||
|
}
|
||||||
|
|
||||||
|
build {
|
||||||
|
sources = ["source.openstack.ubuntu-nginx"]
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
vkcs = {
|
||||||
|
source = "vk-cs/vkcs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
provider "vkcs" {}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
resource "vkcs_networking_secgroup" "bastion_sg" {
|
||||||
|
name = "bastion-sg"
|
||||||
|
description = "SSH from my IP"
|
||||||
|
}
|
||||||
|
resource "vkcs_networking_secgroup_rule" "bastion_ssh" {
|
||||||
|
direction = "ingress"
|
||||||
|
protocol = "tcp"
|
||||||
|
port_range_min = 22
|
||||||
|
port_range_max = 22
|
||||||
|
remote_ip_prefix = var.my_ip
|
||||||
|
security_group_id = vkcs_networking_secgroup.bastion_sg.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_secgroup" "web_sg" {
|
||||||
|
name = "web-sg"
|
||||||
|
description = "SSH from bastion, HTTP from LB"
|
||||||
|
}
|
||||||
|
resource "vkcs_networking_secgroup_rule" "web_ssh" {
|
||||||
|
direction = "ingress"
|
||||||
|
protocol = "tcp"
|
||||||
|
port_range_min = 22
|
||||||
|
port_range_max = 22
|
||||||
|
remote_group_id = vkcs_networking_secgroup.bastion_sg.id
|
||||||
|
security_group_id = vkcs_networking_secgroup.web_sg.id
|
||||||
|
}
|
||||||
|
resource "vkcs_networking_secgroup_rule" "web_http" {
|
||||||
|
direction = "ingress"
|
||||||
|
protocol = "tcp"
|
||||||
|
port_range_min = 80
|
||||||
|
port_range_max = 80
|
||||||
|
remote_group_id = vkcs_networking_secgroup.lb_sg.id
|
||||||
|
security_group_id = vkcs_networking_secgroup.web_sg.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "vkcs_networking_secgroup" "lb_sg" {
|
||||||
|
name = "lb-sg"
|
||||||
|
description = "HTTP from internet"
|
||||||
|
}
|
||||||
|
resource "vkcs_networking_secgroup_rule" "lb_http" {
|
||||||
|
direction = "ingress"
|
||||||
|
protocol = "tcp"
|
||||||
|
port_range_min = 80
|
||||||
|
port_range_max = 80
|
||||||
|
remote_ip_prefix = "0.0.0.0/0"
|
||||||
|
security_group_id = vkcs_networking_secgroup.lb_sg.id
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
variable "my_ip" {
|
||||||
|
type = string
|
||||||
|
default = "95.26.148.233/32"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "flavor_web" {
|
||||||
|
type = string
|
||||||
|
default = "25ae869c-be29-4840-8e12-99e046d2dbd4"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "flavor_bastion" {
|
||||||
|
type = string
|
||||||
|
default = "df3c499a-044f-41d2-8612-d303adc613cc"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "image_packer_id" {
|
||||||
|
type = string
|
||||||
|
default = "a31acc16-4703-468b-bc5b-bf07952f66b2"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "ubuntu_image_name" {
|
||||||
|
type = string
|
||||||
|
default = "ubuntu-22-202602051629.gite7a38aaf"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "ssh_public_key_path" {
|
||||||
|
type = string
|
||||||
|
default = "~/.ssh/id_rsa.pub"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "keypair_name" {
|
||||||
|
type = string
|
||||||
|
default = "terraform-key-local"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "ubuntu_image_id" {
|
||||||
|
type = string
|
||||||
|
default = "a4e699d3-a66d-45e5-bb5d-70ea7c8de62d"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "db_flavor_id" {
|
||||||
|
type = string
|
||||||
|
default = "2d9866a9-e955-4986-b00a-340ca54b2cac"
|
||||||
|
}
|
||||||
Reference in new issue
Block a user