Требуемые условия завершения
Задание:
Подготовка облачной инфраструктуры
1. Подготовьте сценарий автоматизации развёртывания облачной инфраструктуры.
- 1. Виртуальные машины и сети должны быть созданы согласно Топологии.
- 2. Имена виртуальных машин и сетей должны соответствовать Топологии.
- 3. Обеспечьте подключение виртуальных машин к соответствующим сетям.
- 4. В случае предоставления внешнего доступа к созданным виртуальным машинам, он должен быть разрешён только по протоколу ssh.
- 5. Разрешите трафик по протоколу ICMP.
- 6. Вы можете назначить глобальные IP адреса для управления созданными виртуальными машинами.
- 7. Используйте аутентификацию на основе открытых ключей, аутентификация с использованием пароля должна быть отключена для SSH.
- 8. Создайте балансировщик нагрузки
- 1. Сохраните внешний адрес балансировщика нагрузки в файле /home/altlinux/lb.ip.
- 2. Ограничьте внешний доступ протоколами http и https.
- 3. Балансировка нагрузки должна использовать алгоритм round robin.
- 4. При обращении на внешний адрес балансировщика нагрузки должен выводиться ответ от приложения на внутреннем сервере.
2. Виртуальные машины должны соответствовать следующим характеристикам.
- 1. Операционная система: ALT Linux 10.
- 2. Количество vCPU: 1.
- 3. Объём оперативной памяти: 1024 МБ.
- 4. Объём диска: 15 ГБ.
- 5. Тип диска: HDD.
- 6. Разместите виртуальные машины в регионе Москва.
- 7. Разместите Web1 в зоне доступности ru-central1-a.
- 8. Разместите Web2 в зоне доступности ru-central1-b.
3. На машине ControlVM создайте скрипт cloudinit.sh.
- 1. В качестве рабочей директории используйте путь /home/altlinux/bin.
- 2. Используйте файл /home/altlinux/bin/cloud.conf для указания настроек для подключения к облачному провайдеру.
- 1. При выполнении проверки, эксперты могут изменить настройки только в файле cloud.conf. Другие файлы редактироваться не будут.
- 2. Вы можете оставить любые понятные комментарии в файле cloud.conf.
- 3. Скрипт должен выполняться из любой директории без явного указания пути к исполняемому файлу.
- 4. Выполнение задания ожидается с использованием инструментов Terraform и/или OpenStack CLI. Однако, вы вправе выбрать другие инструменты, не противоречащие условиям задания и правилам соревнования.
Выполнение:
- Создаём рабочию директорию по пути "/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-адресе
- Результат созданных ресурсов в панеле Yandex Cloud:
Для проверки работоспособности также было проведено ручное развёртывание на web1 и web2 веб-серверов для тестирования loadbalancer
Последнее изменение: среда, 14 февраля 2024, 21:07