Развёртывание ресурсов с помощью Packer и Terraform

Кратко:

 

Развёртывание ресурсов с помощью Packer и Terraform

  1. С помощью Packer создайте образ виртуальной машины с ОС Ubuntu 22.04 и установленным веб-сервером NGINX.
  2. С помощью 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ГБ).
      Для создания виртуальной машины используйте образ, созданный на предыдущем шаге.
  3. Когда ресурсы будут созданы, запустите следующую команду для проверки задания: 
    docker run --rm cr.yandex/sol/edu-checker validate vm --token <TOKEN> --folder-id <FOLDER_ID>
     где <TOKEN> — ваш IAM-токен, а <FOLDER_ID> — идентификатор каталога, в котором вы работаете.
  4. Если проверка пройдена успешно, то скопируйте ключ, вставьте его в поле ниже и нажмите кнопку Проверить.

 

Приступим к выполнению:

  1. Создадим образ виртуальной машины
  2. Создадим сервисный аккаунт на папку в облаке с достаточными правами (admin - самые большие привелегии для учебы)
  3. Установим CLI и проведем его инициализацию для работы через сервисный аккаунт
  4. Установим 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
    
  5. Настроим провайдер
    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/.

  6. Создайте фаил 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"
    }
    
  7. Создайте фаил my-variables.tfvars
    cat >> my-variables.tfvars
    
    Следующего содержания указывающего на созданный образ диска parkerom:
    image-id = "f...................................k"
  8. Проведите инициализацию terraform
    terraform init
  9. Проверьте спецификацию:
    terraform plan -var-file=my-variables.tfvars
  10. Выполните спецификацию
  11. terraform apply -var-file=my-variables.tfvars
  12. Запросите ключ
    yc iam create-token
  13. Проверьте  работу
    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                                                                                            |
    +--------------------------------------------------------------------------------------------------+

 

Отлично! Вы успешно выполнили задание и можете перейти к следующему.