# Модуль В: Подготовка облачной инфраструктуры

#### Задание:

Подготовка облачной инфраструктуры

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
```

* Создадим файл в каталоге пользователя, под которым мы работаем и будем запускать сценарий:
  * [документация от Яндекс](https://cloud.yandex.ru/docs/tutorials/infrastructure-management/terraform-quickstart#configure-terraform)

```
vim ~/.terraformrc
```

* * данное содержимое вставляем без изменений. По умолчанию, установка провайдера выполняется из репозитория hashicorp, однако, он может быть заблокирован на территории России, поэтому мы переопределяем путь по которому выполняются запрос

```
provider_installation {
  network_mirror {
    url = ""
    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
```

* * результат - начало:

![](https://sysahelper.ru/pluginfile.php/273/mod_page/content/14/image%20%2810%29.png)

* * результат - конец:

![](https://sysahelper.ru/pluginfile.php/273/mod_page/content/14/image%20%2811%29.png)

* * также в файл **/home/altlinux/lb.ip** сохранена информацию о внешнем IP-адресе&#x20;

![](https://sysahelper.ru/pluginfile.php/273/mod_page/content/14/image%20%2817%29.png)

* Результат созданных ресурсов в панеле Yandex Cloud:

<img src="https://sysahelper.ru/pluginfile.php/273/mod_page/content/14/image%20%2815%29.png" alt="" height="324" width="968">

**Для проверки работоспособности также было проведено ручное развёртывание на web1 и web2 веб-серверов для тестирования loadbalancer**

Последнее изменение: среда, 14 февраля 2024, 21:07


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://seraphim.gitbook.io/volodyazetkin2024gitbook/modul-v.-docker-compose-sozdanie-lokalnogo-docker-registry/modul-v-podgotovka-oblachnoi-infrastruktury.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
