Сегодня будем работать в 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
}
Основной источник: ссылка