mirror of
https://github.com/Dannecron/netology-devops.git
synced 2025-12-26 07:42:36 +03:00
100 lines
5.4 KiB
Markdown
100 lines
5.4 KiB
Markdown
Выполнение [домашнего задания](https://github.com/netology-code/virt-homeworks/blob/master/07-terraform-03-basic/README.md)
|
||
по теме "7.3. Основы и принцип работы Terraform".
|
||
|
||
## Q/A
|
||
|
||
### Задание 1
|
||
|
||
> Создадим бэкэнд в S3
|
||
|
||
Документация по подключению бэкенда s3 к `terraform`:
|
||
* [настройка terraform](https://www.terraform.io/language/settings/backends/s3)
|
||
* [руководство по настройке yandex.cloud](https://cloud.yandex.ru/docs/tutorials/infrastructure-management/terraform-state-storage)
|
||
|
||
Первым шагом необходимо создать сервисный аккаунт по [документации](https://cloud.yandex.ru/docs/iam/operations/sa/create).
|
||
Для этого необходимо выполнить следующую команду:
|
||
|
||
```shell
|
||
yc iam service-account create --name my-robot
|
||
```
|
||
|
||
Следующим шагом нужно добавить сервисному аккаунту роль `editor` по [документации](https://cloud.yandex.ru/docs/iam/operations/sa/assign-role-for-sa).
|
||
|
||
Далее необходимо создать новый ключ доступа. Для этого нужно выполнить команду:
|
||
|
||
```shell
|
||
yc iam access-key create --service-account-name my-robot
|
||
```
|
||
|
||
Из вывода необходимо сохранить значения ключей `key_id` и `secret`, которыми необходимо заполнить
|
||
значения переменных окружения `YC_STORAGE_ACCESS_KEY` и `YC_STORAGE_SECRET_KEY` соответственно.
|
||
Для удобства, унесём файл с переменными окружения на верхний уровень: [.env.example](./.env.example) и [.env](./.env).
|
||
|
||
Затем необходимо создать новый бакет с именем `netology-tf-state` в `Object Storage` по [инструкции](https://cloud.yandex.ru/docs/storage/operations/buckets/create).
|
||
|
||
После всех приготовлений нужно вынести конфигурацию провайдера в файл [provider.tf](./terraform/provider.tf) и обновить конфигурацию следующим образом:
|
||
|
||
```terraform
|
||
terraform {
|
||
required_providers {
|
||
yandex = {
|
||
source = "yandex-cloud/yandex"
|
||
}
|
||
}
|
||
required_version = ">= 0.13"
|
||
|
||
backend "s3" {
|
||
endpoint = "storage.yandexcloud.net"
|
||
bucket = "netology-tf-state"
|
||
region = "ru-central1"
|
||
key = "tf/default.tfstate"
|
||
access_key = "service_account_access_key_id"
|
||
secret_key = "service_account_access_key_secret"
|
||
|
||
skip_region_validation = true
|
||
skip_credentials_validation = true
|
||
}
|
||
}
|
||
|
||
provider "yandex" {
|
||
token = "auth_token_here"
|
||
cloud_id = "cloud_id_here"
|
||
folder_id = "folder_id_here"
|
||
zone = "ru-central1-a"
|
||
}
|
||
```
|
||
|
||
Как и в прошлый раз, сам провайдер конфигурируется из переменных окружения. При этом настроить `backend` из переменных окружения напрямую невозможно из-за ограничений `terraform`.
|
||
Для этого необходимо воспользоваться флагом конфигурации `-backend-config` у команды `terraform init`.
|
||
Таким образом, команда инициализации примет вид:
|
||
|
||
```shell
|
||
source .env
|
||
cd ./terraform \
|
||
&& env $(cat ../.env) terraform init \
|
||
-backend-config="access_key=${YC_STORAGE_ACCESS_KEY}" \
|
||
-backend-config="secret_key=${YC_STORAGE_SECRET_KEY}"
|
||
```
|
||
|
||
### Задание 2
|
||
|
||
> Инициализируем проект и создаем воркспейсы.
|
||
>
|
||
> 1. Выполните `terraform init`:
|
||
> * если был создан бэкэнд в S3, то терраформ создат файл стейтов в S3.
|
||
> * иначе будет создан локальный файл со стейтами.
|
||
> 2. Создайте два воркспейса `stage` и `prod`.
|
||
> 3. В уже созданный `yandex_compute_instance` добавьте зависимость типа инстанса от вокспейса,
|
||
> что бы в разных ворскспейсах использовались разные `instance_type`.
|
||
> 5. Добавим `count`. Для `stage` должен создаться один экземпляр, а для `prod` два.
|
||
> 6. Создайте рядом еще один `yandex_compute_instance`, но теперь определите их количество при помощи `for_each`, а не `count`.
|
||
> 7. Что бы при изменении типа инстанса не возникло ситуации, когда не будет ни одного инстанса добавьте параметр
|
||
> жизненного цикла `create_before_destroy = true` в один из рессурсов `yandex_compute_instance`.
|
||
> 8. При желании поэкспериментируйте с другими параметрами и рессурсами.
|
||
>
|
||
> В виде результата работы пришлите:
|
||
> * Вывод команды `terraform workspace list`.
|
||
> * Вывод команды `terraform plan` для воркспейса `prod`.
|
||
|
||
// todo
|