Сегодня будем работать с облачными технологиями Terraform и Yandex Cloud используя тестовый период.
Для начала создадим нашу виртуальную машину.
Нажимаем создать ресурс и выбираем "виртуальная машина"
Обязательно указываем имя машины и выбираем операционную систему.
Я буду создавать машину на Альт 10.
Далее необходимо настроить диск и процессор машины если, вы используете тестовый период, так же советую использовать функцию "прерываемая вм" чтобы сэкономить расход гранта.
В поле доступ, можно настроить SSH для удаленного подключения к нашей машине по публичному адресу.
Подключимся к нашей машине и сделаем базовую настройку машины для работы Terraform.
Скачиваем последние обновления, wget и unzip:
apt-get update && apt-get install -y wget unzip
Установим интерфейс командной строки Yandex Cloud:
https://cloud.yandex.ru/ru/docs/cli/quickstart#install
Если после установки команда yc недоступна:
export PATH=$PATH:/home/altlinux/yandex-cloud/bin/
Теперь можно установить Terraform:
- Выбираем версию из зеркала Яндекса:
https://hashicorp-releases.yandexcloud.net/terraform/ - Устанавливаем:
unzip terraform_1.7.4_linux_amd64.zip -d /usr/local/bin/ - Проверим работу:
terraform --version
Настроим Terraform для работы с Yandex Cloud:
- Создадим директорию для работы с Terraform:
mkdir ~/bin; cd ~/bin
- Перейдем к настройке конфигурации Terraform:
nano ~/.terraformrc
provider_installation {
network_mirror {
url = "https://terraform-mirror.yandexcloud.net/"
include = ["registry.terraform.io/*/*"]
}
direct {
exclude = ["registry.terraform.io/*/*"]
}
}
- Создадим файл с переменными:
nano variables.tf
variable "token" {
type = string
sensitive = true
}
variable "cloud_id" {
type = string
sensitive = true
}
variable "folder_id" {
type = string
sensitive = true
}
- Теперь настроим наш конфиг инфраструктуры:
nano 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
}
- Укажем значения переменных в файле cloud.conf:
export TF_VAR_token=$(yc iam create-token)
export TF_VAR_token=$(yc config get cloud-id)
export TF_VAR_folder_id=$(yc config get folder-id)
- Чтобы создать виртуальную сеть и ее подсеть:
resource "yandex_vpc_network" "network1" {
name = "network1"
}
resource "yandex_vpc_subnet" "subnet1" {
zone = "ru-central1-a"
network_id = "${yandex_vpc_network.network1.id}"
v4_cidr_blocks = ["192.168.32.0/24"]
}
Где:
name - имя сети
zone - имя зоны в которой будет находиться подсеть
network_id - айди сети в которой она будет
v4_cidr_blocks - область адресов подсети
- Чтобы создать виртуальную машину:
resource "yandex_compute_instance" "vm1" {
name = "vm1"
hostname = "vm1"
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.subnet1.id}"
ip_address = "192.168.32.100"
nat = true
}
metadata = {
ssh-keys = "altlinux:${file("~/.ssh/id_rsa.pub")}"
}
timeouts {
create="10m"
}
}
Где:
resources - ресурсы машины, количество ядер(cores), объем ОЗУ(memory), доля CPU(core_fraction)
boot_disk - параметры диска, параметры нового диска(initialize_params), id образа Альт 10(image_id), размер диска(size), тип диска(type)
network_interface - параметры сети, id подсети(subnet_id), локальный адрес машины(ip_address), использование общего публичного адреса(nat)
metadata - метаданные машины, ключ ssh(ssh-keys)
timeouts - тайм-аут, создание машины(create)
- Чтобы создать балансировщик нагрузки:
resource "yandex_lb_network_load_balancer" "loadbalancer1" {
name = "loadbalancer1"
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.subnet1.id}"
address = "${yandex_compute_instance.vm1.network_interface.0.ip_address}"
}
target {
subnet_id = "${yandex_vpc_subnet.subnet2.id}"
address = "${yandex_compute_instance.vm2.network_interface.0.ip_address}"
}
}
output "lb_ip" {
value = yandex_lb_network_load_balancer.lb-web
}
Где:
resource "yandex_lb_network_load_balancer" - тип ресурса балансировщик нагрузки
+ listener - порт на котором будет работать балансировка
+ attached_target_group - группа для балансировки
resource "yandex_lb_target_group" - тип ресурса цель балансировки
+target - цель балансировки, id подсети(subnet_id), локальный адрес машины(address)
output "name" - тип ресурса вывод
+ value - значение для вывода
Основной источник: ссылка