# Управление инфраструктурой. Terraform.

### Описание стенда

<div drawio-diagram="544"><img src="https://docs.resds.ru/uploads/images/drawio/2024-05/ZsJlkmCwfS9QSE1P-drawing-3-1715880115.png"></div>

### Подготовка окружения

1. Установите [vscode](https://code.visualstudio.com/Download)
0. Установите плагин [Remote SSH](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh)
0. Создайте VM для роли управления terraform
0. Добавить конфигурацию узла в VScode с ранее созданным узлом

   Если при подключении запрашивается пароль, то можно модифицировать конфигурацию ssh(`~/.ssh/config`)
   ```text
   Host 172.17.*
     User cloudadmin
     IdentityFile ~/.ssh/id_ed25519
   ```
   > В `IdentityFile` нужно вписать путь до вашего приватного ключа
0. Подключитесь к узлу без указания конкретного пользователя
   [![](https://docs.resds.ru/uploads/images/gallery/2024-03/scaled-1680-/4x8il2tGZzwh6Jy1-image-1710248175420.png)](https://docs.resds.ru/uploads/images/gallery/2024-03/4x8il2tGZzwh6Jy1-image-1710248175420.png)
   [![](https://docs.resds.ru/uploads/images/gallery/2024-03/scaled-1680-/nMa9pLJMkTvuetG0-image-1710248197140.png)](https://docs.resds.ru/uploads/images/gallery/2024-03/nMa9pLJMkTvuetG0-image-1710248197140.png)
0. Во вкладке с файлами откройте домашнюю директорию пользователя `cloudadmin`
  [![](https://docs.resds.ru/uploads/images/gallery/2024-03/scaled-1680-/zhlVnxUhseu4oud2-image-1710248242172.png)](https://docs.resds.ru/uploads/images/gallery/2024-03/zhlVnxUhseu4oud2-image-1710248242172.png)
0. Установите на узле плагин [terraform от hashicorp](https://marketplace.visualstudio.com/items?itemName=HashiCorp.terraform)

### Установка terraform
1. Перейти на сайт:
  [https://developer.hashicorp.com/terraform/install](https://developer.hashicorp.com/terraform/install)
2. Убеждаемся, что HashiCorp не очень любит Россию и либо пользуемся зеркалом [https://cloud.vk.com/docs/manage/tools-for-using-services/terraform/quick-start](https://cloud.vk.com/docs/manage/tools-for-using-services/terraform/quick-start) (первый пункт)
    ```bash
    curl -l -O https://hashicorp-releases.mcs.mail.ru/terraform/1.7.4/terraform_1.7.4_linux_amd64.zip
    ```
    либо скачиваем с google диска
    ```bash
    pip install gdown
    gdown https://drive.google.com/uc?id=1W6z0_-DDcEobFHoNz4lErO1wMHF2wnyc
    ```
3. Разархивируем
    ```bash
    sudo unzip terraform_1.7.4_linux_amd64.zip  -d /usr/local/bin
    ```
4. Проверим, что все установилось
[![](https://docs.resds.ru/uploads/images/gallery/2024-03/scaled-1680-/fnpEEiizBDtKIdJm-image-1710248622556.png)](https://docs.resds.ru/uploads/images/gallery/2024-03/fnpEEiizBDtKIdJm-image-1710248622556.png)

### Подготовка terraform
1. Добавим зеркало для работы с terraform без vpn

   Создаем файл `.terraformrc`
   ```bash
   touch ~/. terraformrc
   ```
   Заполним содержимое:
   ```
   provider_installation {
      network_mirror {
          url = "https://terraform-mirror.mcs.mail.ru"
          include = ["registry.terraform.io/*/*"]
      }
      direct {
          exclude = ["registry.terraform.io/*/*"]
      }
   }
    ```
2. Создать директорию `terraform_openstack` и в ней файлы:`data.tf`, `main.tf`, `outputs.tf`, `provider.tf`, `variables.tf`
   [![](https://docs.resds.ru/uploads/images/gallery/2024-03/scaled-1680-/stOj1Dw3n16vNfbw-image-1710249474528.png)](https://docs.resds.ru/uploads/images/gallery/2024-03/stOj1Dw3n16vNfbw-image-1710249474528.png)
3. Заполнить `provider.tf`
   ```tf
   terraform {
    required_version = ">= 0.14.0"
      required_providers {
        openstack = {
          source  = "terraform-provider-openstack/openstack"
          version = "~> 1.53.0"
        }
      }
   }
   ```
4. Выполнить команду `terraform init` и убедиться что все прошло успешно
   [![](https://docs.resds.ru/uploads/images/gallery/2024-03/scaled-1680-/KaK7YmBykBJUwWFP-image-1710249889308.png)](https://docs.resds.ru/uploads/images/gallery/2024-03/KaK7YmBykBJUwWFP-image-1710249889308.png)
5. Перейти в openstack в меню [API ACCESS](https://cloud.resds.ru/horizon/project/api_access/)
   [![](https://docs.resds.ru/uploads/images/gallery/2024-03/scaled-1680-/TgeYeVgY9lYDrKAE-image-1710250019787.png)](https://docs.resds.ru/uploads/images/gallery/2024-03/TgeYeVgY9lYDrKAE-image-1710250019787.png)
  Скачайте `clouds.yml`<br>
  Добавить его в рабочую директорию и добавить графу `password`
  [![](https://docs.resds.ru/uploads/images/gallery/2024-03/scaled-1680-/I9EYLZQa3Zm1cu1x-image-1710253680607.png)](https://docs.resds.ru/uploads/images/gallery/2024-03/I9EYLZQa3Zm1cu1x-image-1710253680607.png)
6. в `provider.tf` добавьте директиву
   ```tf
   provider "openstack" {
       cloud = "openstack"
   }
   ```
   [![](https://docs.resds.ru/uploads/images/gallery/2024-03/scaled-1680-/jYOTYoQFAhmHyDa0-image-1710253600456.png)](https://docs.resds.ru/uploads/images/gallery/2024-03/jYOTYoQFAhmHyDa0-image-1710253600456.png)

### Задание 1. 
Чтобы создать виртуальную машину, нам нужен какой-то образ, в openstack образы можно называть одинаково, но вот id образов будет разный, необходимо получить id необходимого нам образа
Для этого пользуемся документацией(она работает тоже только с vpn или прокси)
[https://registry.terraform.io/providers/terraform-provider-openstack/openstack/latest/docs/data-sources/images_image_v2](https://registry.terraform.io/providers/terraform-provider-openstack/openstack/latest/docs/data-sources/images_image_v2)

В моем случае я буду пользоваться Ubuntu-server-20.04

Суть задания, добавить переменную с названием образа, создать data source образа и вывести его id в outputs

Пример:

  [![](https://docs.resds.ru/uploads/images/gallery/2024-03/scaled-1680-/TSj8QG90uM9xlFnP-image-1710250935685.png)](https://docs.resds.ru/uploads/images/gallery/2024-03/TSj8QG90uM9xlFnP-image-1710250935685.png)
  ```hcl
  variable "image" {
    type = string
    default = "Ubuntu-server-20.04"
  }
  ```
  [![](https://docs.resds.ru/uploads/images/gallery/2024-03/scaled-1680-/Cgs1iWlAfHZqtNnl-image-1710250949758.png)](https://docs.resds.ru/uploads/images/gallery/2024-03/Cgs1iWlAfHZqtNnl-image-1710250949758.png)
  ```hcl
  data "openstack_images_image_v2" "ubuntu20" {
    name = var.image
    most_recent = true
  }
  ```
  [![](https://docs.resds.ru/uploads/images/gallery/2024-03/scaled-1680-/TRiryzRp7D4Wplns-image-1710250965270.png)](https://docs.resds.ru/uploads/images/gallery/2024-03/TRiryzRp7D4Wplns-image-1710250965270.png)
  ```hcl
  output "image_id" {
      value = data.openstack_images_image_v2.ubuntu20.id
  }
  ```
  
Выполнить `terraform plan` и убедиться что именно это мы и хотели создать
[![](https://docs.resds.ru/uploads/images/gallery/2024-03/scaled-1680-/lUyTkQp3DChh76MC-image-1710254014441.png)](https://docs.resds.ru/uploads/images/gallery/2024-03/lUyTkQp3DChh76MC-image-1710254014441.png)
Ну и выполняем(`terraform apply`): 
[![](https://docs.resds.ru/uploads/images/gallery/2024-03/scaled-1680-/RMyQtqGN7CLQbp6g-image-1710254091573.png)](https://docs.resds.ru/uploads/images/gallery/2024-03/RMyQtqGN7CLQbp6g-image-1710254091573.png)
### Задание 2
Создать 2 виртуальные машины.
Ссылка:
[https://registry.terraform.io/providers/terraform-provider-openstack/openstack/latest/docs/resources/compute_instance_v2](https://registry.terraform.io/providers/terraform-provider-openstack/openstack/latest/docs/resources/compute_instance_v2)

Требования:
1. Ресурсы создать в main.tf
0. Flavor должен быть small
0. Id образа не вписывать в ручную
0. У машин должен быть разный образ, но обе должны быть ubuntu
0. У машин должен быть разный объем диска
0. Outputs должен быть вида: имя машины: IP адрес машины, дополнительные сведения можно добавить по желанию
0. В переменные необходимо занести: объем диска, имя машин
0. Убедиться, что к машинам можно подключиться по ssh


### Задание 3:
Удалить все что создали с помощью terraform