- Создаём рабочию директорию по пути "/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-адресе