Найти тему
BecomeSysa

Terraform и VK Cloud для самых маленьких

Сегодня будем работать в VK Cloud.

Для начала установим wget, unzip и OpenStack CLI на машину:

sudo -i

apt-get update && apt-get install -y wget unzip

https://cloud.vk.com/docs/manage/tools-for-using-services/openstack-cli

в конец файла openrc.sh добавить строки переменных terraform:

export TF_VAR_username=$OS_USERNAME

export TF_VAR_password=$OS_PASSWORD

export TF_VAR_projectid=$OS_PROJECT_ID

Теперь перейдем к установке Terraform:

wget https://hashicorp-releases.mcs.mail.ru/terraform/1.7.5/terraform_1.7.5_linux_amd64.zip

unzip terraform_1.7.5_linux_amd64.zip -d /usr/local/bin/

Настроим конфигурацию зеркала:

mkdir ~/bin; cd ~/bin

vim ~/.terraformrc

provider_installation {

network_mirror {

url = "https://terraform-mirror.mcs.mail.ru"

include = ["registry.terraform.io/*/*"]

}

direct {

exclude = ["registry.terraform.io/*/*"]

}

}

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

variable "username" {

type = string

sensitive = true

}

variable "password" {

type = string

sensitive = true

}

variable "projectid" {

type = string

sensitive = true

}

Далее настроим наш конфиг инфраструктуры maif.tf:

terraform {

required_providers {

vkcs = {

source = "vk-cs/vkcs"

}

}

}

provider "vkcs" {

username = var.username

password = var.password

project_id = var.projectid

}

Теперь инициализируем сеть:

terraform init

Дополним main.tf:

Чтобы развернуть ВМ нужно:

resource "vkcs_compute_instance" "web" {

count = 2

name = "web${count.index+1}"

flavor_id = data.vkcs_compute_flavor.compute.id

security_groups = ["ssh"]

availability_zone = "MS1"

key_pair = data.vkcs_compute_keypair.web.id

block_device {

uuid = data.vkcs_images_image.compute.id

source_type = "image"

destination_type = "volume"

volume_type = "ceph-hdd"

volume_size = 30

boot_index = 0

delete_on_termination = true

}

network {

uuid = vkcs_networking_network.web.id

}

depends_on = [

vkcs_networking_network.web,

vkcs_networking_subnet.web

]

}

Где: количество ВМ(count), имя машины(name), зона где будет машина(availability_zone), диск машины(block_device) и сеть машины(network)

Чтобы развернуть подсеть:

resource "vkcs_networking_floatingip" "web" {

pool = data.vkcs_networking_network.extnet.name

}

resource "vkcs_compute_floatingip_associate" "web" {

count = 2

floating_ip = vkcs_networking_floatingip.web.address

instance_id = vkcs_compute_instance.web[count.index].id

}

Чтобы развернуть балансировщик:

resource "vscs_lb_loadbalancer" "lb" {

name = "web_loadbalancer"

vip_subnet_id = "${vkcs_metworking_subnet.web.id}"

tags = ["web"]

}

resource "vkcs_networking_floatingip" "web_lb" {

pool = data.vkcs_networking_network.extnet.name

}

resource "vkcs_compute_floatingip_associate" "lb_fip" {

floating_ip = vkcs_networking_floatingip.web_lb.address

port_id = vkcs_lb_loadbalancer.web.vip_port_id

}

resource "vkcs_lb_listener" "web" {

name = "listener"

protocol = "HTTP"

protocol_port = 80

loadbalancer_id = "${vkcs_lb_loadbalancer.web.id}"

}

resource "vkcs_lb_pool" "web" {

name = "pool"

protocol = "HTTP"

lb_method = "ROUND_ROBIN"

listener_id = "${vkcs_lb_listener.web.id}"

}

resource "vkcs_lb_member" "web" {

count = 2

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.web.id}"

weight = 5

}

Где: порт балансировки(vkcs_lb_listener), пул балансировки(vkcs_lb_pool), машины для балансировки(vkcs_lb_member)

Для их работы необходимо описать параметры базовой инфраструктуры в файле base.tf:

data "vkcs_compute_flavor" "compute" {

name = "STD2-1-1"

}

data "vkcs_networking_network" "extnet" {

name = "internet"

}

data "vkcs_images_image" "compute" {

name = "alt-server-p10-cloud-x86_64"

}

data "vkcs_compute_keypair" "web" {

name = "ControlVM"

}

resource "vkcs_networking_network" "web" {

name = "web_net"

}

resource "vkcs_networking_subnet" "web" {

name = "web_subnet"

network_id = vkcs_networking_network.web.id

cidr = "10.0.1.0/24"

}

resource "vkcs_networking_router" "web" {

name = "web-router"

admin_state_up = true

external_network_id = data.vkcs_networking_network.extnet.id

}

resource "vkcs_networking_router_interface" "web" {

router_id = vkcs_networking_router.web.id

subnet_id = vkcs_networking_subnet.web.id

}

Основной источник: ссылка