Skip to content

BloodyArnold/terra.cloud.2024.test

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 

Repository files navigation

 Создаём рабочию директорию по пути "/home/altlinux/bin" и переходим в неё:

mkdir ~/bin; cd ~/bin

Создадим файл в каталоге пользователя, под которым мы работаем и будем запускать сценарий:
документация от Яндекс

vim ~/.terraformrc

данное содержимое вставляем без изменений. По умолчанию, установка провайдера выполняется из репозитория hashicorp, однако, он может быть заблокирован на территории России, поэтому мы переопределяем путь по которому выполняются запрос

provider_installation {
  network_mirror {
    url = "https://terraform-mirror.yandexcloud.net/"
    include = ["registry.terraform.io/*/*"]
  }
  direct {
    exclude = ["registry.terraform.io/*/*"]
  }
}

Создаём рабочию директорию по пути "/home/altlinux/bin" и переходим в неё:

mkdir ~/bin; cd ~/bin

Создадим файл variables.tf и опишем основные переменные которые потребуются:

vim variables.tf

содержимое:

variable "token" {
    type      = string
    sensitive = true
}

variable "cloud_id" {
    type      = string
    sensitive = true
}

variable "folder_id" {
    type      = string
    sensitive = true
}

В файле main.tf - опишем конфигурацию для создания всех необходимых ресурсов:

vim main.tf
содержимое:
terraform {
  required_providers {
    yandex = {
      source = "yandex-cloud/yandex"
    }
  }
  required_version = ">= 0.13"
}

provider "yandex" {
  token     = var.token
  cloud_id  = var.cloud_id
  folder_id = var.folder_id
}

resource "yandex_compute_instance" "web1" {
  name        = "web1"
  hostname    = "web1"
  platform_id = "standard-v1"
  zone        = "ru-central1-a"

  resources {
    cores  	  = 2
    memory 	  = 1
    core_fraction = 20
  }

  boot_disk {
    initialize_params {
	image_id = "fd8i8fljrbbcclckhlm9"
	size	 = 15
	type	 = "network-hdd"
    }
  }

  network_interface {
    subnet_id  = "${yandex_vpc_subnet.subnet_web1.id}"
    ip_address = "192.168.100.100"
    nat	       = true
  }

  metadata = {
    ssh-keys = "altlinux:${file("~/.ssh/id_rsa.pub")}"
  }

  timeouts {
    create="10m"
  }
}

resource "yandex_compute_instance" "web2" {
  name        = "web2"
  hostname    = "web2"
  platform_id = "standard-v1"
  zone        = "ru-central1-b"

  resources {
    cores  	  = 2
    memory 	  = 1
    core_fraction = 20
  }

  boot_disk {
    initialize_params {
	image_id = "fd8i8fljrbbcclckhlm9"
	size	 = 15
	type	 = "network-hdd"
    }
  }

  network_interface {
    subnet_id          = "${yandex_vpc_subnet.subnet_web2.id}"
    ip_address 	       = "192.168.200.100"
    nat	               = true
  }

  metadata = {
    ssh-keys = "altlinux:${file("~/.ssh/id_rsa.pub")}"
  }

  timeouts {
    create="10m"
  }
}

resource "yandex_vpc_network" "network_web" {
  name = "network_web"
}

resource "yandex_vpc_subnet" "subnet_web1" {
  zone           = "ru-central1-a"
  network_id     = "${yandex_vpc_network.network_web.id}"
  v4_cidr_blocks = ["192.168.100.0/24"]
}

resource "yandex_vpc_subnet" "subnet_web2" {
  zone           = "ru-central1-b"
  network_id     = "${yandex_vpc_network.network_web.id}"
  v4_cidr_blocks = ["192.168.200.0/24"]
}

resource "yandex_lb_network_load_balancer" "lb-web" {
  name = "lb-web"

  listener {
    name = "http"
    port = 80
    external_address_spec {
      ip_version = "ipv4"
    }
  }

  listener {
    name = "https"
    port = 443
    external_address_spec {
      ip_version = "ipv4"
    }
  }

  attached_target_group {
    target_group_id = "${yandex_lb_target_group.lb-group.id}"

    healthcheck {
      name = "http"
      http_options {
        port = 80
        path = "/"
      }
    }
  }
}

resource "yandex_lb_target_group" "lb-group" {
  name      = "lb-group"

  target {
    subnet_id = "${yandex_vpc_subnet.subnet_web1.id}"
    address   = "${yandex_compute_instance.web1.network_interface.0.ip_address}"
  }

  target {
    subnet_id = "${yandex_vpc_subnet.subnet_web2.id}"
    address   = "${yandex_compute_instance.web2.network_interface.0.ip_address}"
  }
}

output "lb_ip" {
  value = yandex_lb_network_load_balancer.lb-web
}

Файл /home/altlinux/bin/cloud.conf используем для указания настроек для подключения к облачному провайдеру:

vim cloud.conf

содержимое:

# Yandex Token
export TF_VAR_token=<ВСТАВЛЯЕМ СОДЕРЖИМОЕ ДЛЯ ТЕКУЩЕГО АККАУНТА В YANDEX CLOUD>

# Yandex Cloud ID
export TF_VAR_cloud_id=<ВСТАВЛЯЕМ СОДЕРЖИМОЕ ДЛЯ ТЕКУЩЕГО АККАУНТА В YANDEX CLOUD>

# Yandex Project ID
export TF_VAR_folder_id=<ВСТАВЛЯЕМ СОДЕРЖИМОЕ ДЛЯ ТЕКУЩЕГО АККАУНТА В YANDEX CLOUD>

Создаём файл cloudinit.sh для запуска всего вышеописанного:

vim cloudinit.sh

содержимое:

#!/bin/bash

cd /home/altlinux/bin
source cloud.conf
terraform init
terraform apply -auto-approve
terraform output | grep -E '"address" = "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"' > /home/altlinux/lb.ip

Задаём права на исполнение:

chmod +x cloudinit.sh

Задаём возможность скрипту cloudinit.sh выполняться из любой директории без явного указания пути к исполняемому файлу:

export PATH=$PATH:/home/altlinux/bin

Генерируем ssh-ключи:

ssh-keygen -t rsa

Выходим из текущего каталога /home/altlinux/bin в домашний каталог пользователя и пытаемся запустить скрипт:

cd
cloudinit.sh

также в файл /home/altlinux/lb.ip сохранена информацию о внешнем IP-адресе 



 

About

create vm in cloud with terraform

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published