# Terraform

[SDK](https://git.vimpelcom.ru/common/vega)

[Пример разворачивания веб-приложения в Docker с помощью Terraform](https://bwiki.beeline.ru/x/j9bNFQ)

[FAQ](faq.md)

<!--Основной рабочий процесс Terraform состоит из трех основных шагов после написания конфигурации Terraform:

* **Initialize** подготавливает рабочий каталог, чтобы Terraform мог запустить конфигурацию.
* **Plan** позволяет просматривать любые изменения перед их применением.
* **Apply** выполняет изменения, определенные вашей конфигурацией Terraform, для создания, обновления или уничтожения ресурсов.

Чтобы определить, какие изменения будут внесены в вашу инфраструктуру, Terraform создает план выполнения. Для этого Terraform согласовывает вашу конфигурацию Terraform с реальной инфраструктурой, отслеживаемой в файле состояния этой рабочей области, и создает список ресурсов для создания, изменения или уничтожения. Команда `plan` поддерживает несколько флагов, которые позволяют вам изменять ее поведение, что позволяет вам быть гибкими в своих операциях. Например, вы можете ориентироваться на определенные ресурсы, а не на всю конфигурацию, или запускать планы только для обновления, которые согласовывают ваш файл состояния с фактической конфигурацией ресурсов, которые он отслеживает.

В этом руководстве вы узнаете, как Terraform создает план выполнения, что он содержит и какова функция команды `plan` в рабочем процессе Terraform. Для этого вы создадите и примените сохраненный план Terraform, просмотрите его содержимое и проанализируете, как план отражает изменения в вашей конфигурации. Сохраненный файл плана поддерживает рабочие процессы автоматизации Terraform в конвейерах CI/CD, гарантируя, что изменения инфраструктуры, применяемые Terraform, соответствуют изменениям, утвержденным вами или вашей командой, даже если процесс развертывания завершается на разных машинах или в разное время.

## Предпосылки
В руководстве предполагается, что вы знакомы с Terraform. Если вы новичок в самом Terraform, сначала обратитесь к руководствам [официальной документации Get Started](https://developer.hashicorp.com/terraform/tutorials).  

Для этого урока вам понадобятся:
* CLI Terraform 0.14+, установленный локально.
* Проект в облаке Vega

## Клонирование репозитория с уроком

В вашем терминале выполните

```sh
$ git clone https://git.vimpelcom.ru/common/vega/learn-terraform-plan
```

Перейдите к клонированному репозиторию.

```sh
$ cd learn-terraform-plan
```

## Проверить конфигурацию

Пример конфигурации в этом репозитории создает два сервера в вашем облаке Vega.

```bash
$ tree
.
├── README.md
├── main.tf
├── nginx
│   ├── main.tf
│   ├── variables.tf
│   └── versions.tf
└── versions.tf
```

Terraform использует версии провайдеров, указанные в `terraform.tf` файле.

```terraform
terraform {
    required_providers {
        vega = {
            version = "~> 2.0.0"
            source  = "registry.vega.com/terraform-provider-vega/vega"
        }
    }
}
```

main.tf
```terraform
# Flavors data
data "vega_flavors" "all" {}
output "vega_flavors_stage" {
  value = data.vega_flavors.all
}

# Regions data
data "vega_regions" "all" {}
output "vega_regions_stage" {
  value = data.vega_regions.all
}

# Images data
data "vega_images" "all" {}
output "vega_images_stage" {
  value = data.vega_images.all
}

locals {
  flavor_standart = [for i in data.vega_flavors.all.flavors: i.flavor_id if i.slug == "cpu2ram2"]
  region_stage = [for i in data.vega_regions.all.regions: i.region_id if i.slug == "yd-ost1"]
  image_ubuntu_20_04 = [for i in data.vega_images.all.images: i.image_id if i.slug == "ubuntu-20-04"]
  image_docker = [for i in data.vega_images.all.images: i.image_id if i.slug == "docker-ubuntu-20-04"]  
}

# Запуск создания сервера
resource "vega_server" "vega_app" {
    flavor {
        id = local.flavor_standart.0
    }
    image {
        id = local.image_docker.0
    }
    region {
        id = local.region_stage.0
    }
    name = var.server_name_app

    root_volume {
        size = 100
        type = "hdd"
    }

    tags = ["app", "docker"]
}

# Запуск создания сервера
resource "vega_server" "vega_db_m" {
    flavor {
        id = local.flavor_standart.0
    }
    image {
        id = local.image_ubuntu_20_04.0
    }
    region {
        id = local.region_stage.0
    }
    name = var.server_name_dbm

    root_volume {
        size = 40
        type = "hdd"
    }

    tags = ["db", "postgres"]

    additional_volume_ids = [vega_volume.database_m.volume_id]

}

output "vega_server_vega_app" {
    value = vega_server.vega_app
}

output "vega_server_vega_dbm" {
    value = vega_server.vega_db_m
}

# Создание дополнительного диска
resource "vega_volume" "database_m" {
    name = format("%s-%s", var.server_name_dbm, "attached")
    region_id = local.region_stage.0
    size = 100
    type = "hdd"
}

output "vega_database_m" {
    value = vega_volume.database_m
}

```

## Инициализируйте свою конфигурацию
Чтобы сгенерировать план выполнения, Terraform необходимо установить поставщиков и модули, на которые ссылается ваша конфигурация. Затем он будет ссылаться на локально кэшированные провайдеры и модули для создания плана изменений ресурсов.

Инициализируйте конфигурацию Terraform, чтобы установить необходимые провайдеры и модули.

```sh
$ terraform init

Initializing the backend...

Initializing provider plugins...
- Finding registry.vega.com/terraform-provider-vega/vega versions matching "~> 2.0.0"...
- Installing registry.vega.com/terraform-provider-vega/vega v2.0.0...
- Installed registry.vega.com/terraform-provider-vega/vega v2.0.0 (unauthenticated)

Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
```

## Создать план

---
::: tip Информация
Это руководство было протестировано с Terraform 1.1.3.
:::

## Первая конфигурация

Для Terraform v.1.3.7 и моложе 

```
terraform {
    required_providers {
        vega = {
            version = "~> 0.0.1"
            source  = "registry.vega.com/terraform-provider-vega/vega"
        }
    }
}
```

## Пример конфигурации

```
terraform {
    required_providers {
        vega = {
            version = "~> 0.0.1"
            source  = "registry.vega.com/terraform-provider-vega/vega"
        }
    }
}

provider "vega" {
    username = "username"
    password = "password"
    url = "https://vega.cloud.vimpelcom.ru"
    project = "vega-project"
}
```

Для работы с провайдером передаются параметры пользователя для авторизации и проект, в рамках которого будет происходить управление ресурсами.-->