Развёртывание ресурсов с помощью Packer и Terraform
Кратко:
Развёртывание ресурсов с помощью Packer и Terraform
- С помощью Packer создайте образ виртуальной машины с ОС Ubuntu 22.04 и установленным веб-сервером NGINX.
- С помощью Terraform создайте:
- сеть с именем
from-terraform-network
, - подсеть с именем
from-terraform-subnet
в зоне доступностиru-central1-a
, и присвоить этой подсети диапазон адресов (CIDR) 10.2.0.0/16, - расположенную в этой подсети виртуальную машину с именем
from-terraform-vm
(два ядра vCPU, 2ГБ RAM, платформа Intel Broadwell) и присвоить ВМ публичный адрес; -
кластер управляемой базы данных PostgresSQL с именем
test-vm
(классs1.micro
, платформа Intel Icelake, SSD диск объёмом 10ГБ).Для создания виртуальной машины используйте образ, созданный на предыдущем шаге.
- сеть с именем
- Когда ресурсы будут созданы, запустите следующую команду для проверки задания:
гдеdocker run --rm cr.yandex/sol/edu-checker validate vm --token <TOKEN> --folder-id <FOLDER_ID>
<TOKEN>
— ваш IAM-токен, а<FOLDER_ID>
— идентификатор каталога, в котором вы работаете. - Если проверка пройдена успешно, то скопируйте ключ, вставьте его в поле ниже и нажмите кнопку Проверить.
Приступим к выполнению:
- Создадим образ виртуальной машины
- Создадим сервисный аккаунт на папку в облаке с достаточными правами (admin - самые большие привелегии для учебы)
- Установим CLI и проведем его инициализацию для работы через сервисный аккаунт
- Установим Terraform и настроим профиль CLI для выполнения операций от имени сервисного аккаунта
Обновление sudo apt update Установка unzip sudo apt install wget unzip Перейти в папку cd ~ Скачать terraform wget https://releases.hashicorp.com/terraform/0.x.x/terraform_0.x.x_linux_amd64.zip Распаковка unzip terraform_0.x.x_linux_amd64.zip Перемещение sudo mv terraform /usr/local/bin/ Активация chmod +x /usr/local/bin/terraform Проверка terraform -v
- Настроим провайдер
cat >> .terraformrc provider_installation { network_mirror { url = "https://terraform-mirror.yandexcloud.net/" include = ["registry.terraform.io/*/*"] } direct { exclude = ["registry.terraform.io/*/*"] } }
Файл
.terraformrc
должен располагаться в корне домашней папки пользователя, например,/home/user/
или/User/user/
. - Создайте фаил my-config.tf
cat >> my-config.tf Следующего содержания: terraform { required_providers { yandex = { source = "yandex-cloud/yandex" } } required_version = ">= 0.13" } provider "yandex" { token = "y1_Ag................................................................OA" cloud_id = "j......................................8" folder_id = "h.....................................6" zone = "ru-central1-a" } variable "image-id" { type = string } resource "yandex_compute_instance" "vm-1" { name = "from-terraform-vm" platform_id = "standard-v1" zone = "ru-central1-a" resources { cores = 2 memory = 2 } boot_disk { initialize_params { image_id = var.image-id } } network_interface { subnet_id = yandex_vpc_subnet.subnet-1.id nat = true } metadata = { ssh-keys = "ubuntu:${file("~/.ssh/id_ed25519.pub")}" } } resource "yandex_vpc_network" "network-1" { name = "from-terraform-network" } resource "yandex_vpc_subnet" "subnet-1" { name = "from-terraform-subnet" zone = "ru-central1-a" network_id = yandex_vpc_network.network-1.id v4_cidr_blocks = ["10.2.0.0/16"] } output "internal_ip_address_vm_1" { value = yandex_compute_instance.vm-1.network_interface.0.ip_address } output "external_ip_address_vm_1" { value = yandex_compute_instance.vm-1.network_interface.0.nat_ip_address } // Create a new MDB PostgreSQL Cluster. resource "yandex_mdb_postgresql_cluster" "my_cluster" { name = "test-vm" environment = "PRESTABLE" network_id = yandex_vpc_network.network-1.id config { version = 15 resources { resource_preset_id = "s1.micro" disk_type_id = "network-ssd" disk_size = 10 } postgresql_config = { max_connections = 395 enable_parallel_hash = true autovacuum_vacuum_scale_factor = 0.34 default_transaction_isolation = "TRANSACTION_ISOLATION_READ_COMMITTED" shared_preload_libraries = "SHARED_PRELOAD_LIBRARIES_AUTO_EXPLAIN,SHARED_PRELOAD_LIBRARIES_PG_HINT_PLAN" } } maintenance_window { type = "WEEKLY" day = "SAT" hour = 12 } host { zone = "ru-central1-a" subnet_id = yandex_vpc_subnet.subnet-1.id } } resource "yandex_mdb_postgresql_database" "my_db" { cluster_id = yandex_mdb_postgresql_cluster.my_cluster.id name = "db1" owner = yandex_mdb_postgresql_user.my_user.name lc_collate = "en_US.UTF-8" lc_type = "en_US.UTF-8" extension { name = "uuid-ossp" } extension { name = "xml2" } } resource "yandex_mdb_postgresql_user" "my_user" { cluster_id = yandex_mdb_postgresql_cluster.my_cluster.id name = "user1" password = "user1user1" }
- Создайте фаил my-variables.tfvars
cat >> my-variables.tfvars Следующего содержания указывающего на созданный образ диска parkerom: image-id = "f...................................k"
- Проведите инициализацию terraform
terraform init
- Проверьте спецификацию:
terraform plan -var-file=my-variables.tfvars
- Выполните спецификацию
-
terraform apply -var-file=my-variables.tfvars
- Запросите ключ
yc iam create-token
- Проверьте работу
docker run --rm cr.yandex/sol/edu-checker validate vm \ --token t1.3...............................................................nh \ --folder-id gg................................t6 PASS resource.yandex_vpc_network.network-1 PASS resource.yandex_vpc_subnet.subnet-1.name PASS resource.yandex_vpc_subnet.subnet-1.zone PASS resource.yandex_vpc_subnet.subnet-1.v4_cidr_blocks PASS name PASS zone PASS resources.core PASS resources.memory PASS network_interface.nat PASS server PASS resource.yandex_yandex_mdb_postgresql_cluster.test-vm PASS resource.yandex_yandex_mdb_postgresql_cluster.test-vm PASS resource.yandex_yandex_mdb_postgresql_cluster.test-vm +--------------------------------------------------------------------------------------------------+ | ACCEPTED | +--------------------------------------------------------------------------------------------------+ | Пожалуйста, скопируйте полученный ключ и отнесите его в блок с код-ревью в уроке. | | Итогом проверки ключа станет успешно принятое задание и возможность перейти к следующему модулю. | +--------------------------------------------------------------------------------------------------+ | TOKEN | +--------------------------------------------------------------------------------------------------+