diff --git a/readme.md b/readme.md index 27f3db7..e7a2165 100644 --- a/readme.md +++ b/readme.md @@ -32,3 +32,4 @@ * [6.6. Troubleshooting](/src/homework/06-database/6.6) * [7.1. Инфраструктура как код](/src/homework/07-terraform/7.1) * [7.2. Облачные провайдеры и синтаксис Terraform](/src/homework/07-terraform/7.2) +* [7.3. Основы и принцип работы Terraform](/src/homework/07-terraform/7.3) diff --git a/src/homework/07-terraform/7.3/.env.example b/src/homework/07-terraform/7.3/.env.example new file mode 100644 index 0000000..8f3328f --- /dev/null +++ b/src/homework/07-terraform/7.3/.env.example @@ -0,0 +1,7 @@ +YC_TOKEN=OAuthToken +YC_CLOUD_ID=cloudId +YC_FOLDER_ID=folderId +YC_ZONE=ru-central1-a + +YC_STORAGE_ACCESS_KEY=serviceAccountAccessKeyId +YC_STORAGE_SECRET_KEY=serviceAccountAccessKeySecret diff --git a/src/homework/07-terraform/7.3/.gitignore b/src/homework/07-terraform/7.3/.gitignore new file mode 100644 index 0000000..f10862a --- /dev/null +++ b/src/homework/07-terraform/7.3/.gitignore @@ -0,0 +1 @@ +/.env diff --git a/src/homework/07-terraform/7.3/Makefile b/src/homework/07-terraform/7.3/Makefile new file mode 100644 index 0000000..497ceb5 --- /dev/null +++ b/src/homework/07-terraform/7.3/Makefile @@ -0,0 +1,12 @@ +#!make +include .env + +tf-init: + cd ./terraform \ + && env $(cat ../.env) terraform init \ + -backend-config="access_key=${YC_STORAGE_ACCESS_KEY}" \ + -backend-config="secret_key=${YC_STORAGE_SECRET_KEY}" + +tf-plan: + cd ./terraform \ + && env $(cat ../.env) terraform plan diff --git a/src/homework/07-terraform/7.3/readme.md b/src/homework/07-terraform/7.3/readme.md new file mode 100644 index 0000000..1e0f0fa --- /dev/null +++ b/src/homework/07-terraform/7.3/readme.md @@ -0,0 +1,99 @@ +Выполнение [домашнего задания](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 diff --git a/src/homework/07-terraform/7.3/terraform/.gitignore b/src/homework/07-terraform/7.3/terraform/.gitignore new file mode 100644 index 0000000..22fca49 --- /dev/null +++ b/src/homework/07-terraform/7.3/terraform/.gitignore @@ -0,0 +1,35 @@ +# Local .terraform directories +**/.terraform/* + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log +crash.*.log + +# Exclude all .tfvars files, which are likely to contain sentitive data, such as +# password, private keys, and other secrets. These should not be part of version +# control as they are data points which are potentially sensitive and subject +# to change depending on the environment. +# +*.tfvars + +# Ignore override files as they are usually used to override resources locally and so +# are not checked in +override.tf +override.tf.json +*_override.tf +*_override.tf.json + +# Include override files you do wish to add to version control using negated pattern +# +# !example_override.tf + +# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan +# example: *tfplan* + +# Ignore CLI configuration files +.terraformrc +terraform.rc diff --git a/src/homework/07-terraform/7.3/terraform/.terraform.lock.hcl b/src/homework/07-terraform/7.3/terraform/.terraform.lock.hcl new file mode 100644 index 0000000..a56e8c6 --- /dev/null +++ b/src/homework/07-terraform/7.3/terraform/.terraform.lock.hcl @@ -0,0 +1,9 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/yandex-cloud/yandex" { + version = "0.75.0" + hashes = [ + "h1:/IJqC1r4rldkDLvDswTxRVQ140jOLbnuMCuGQkm+dmU=", + ] +} diff --git a/src/homework/07-terraform/7.3/terraform/main.tf b/src/homework/07-terraform/7.3/terraform/main.tf new file mode 100644 index 0000000..5d067cb --- /dev/null +++ b/src/homework/07-terraform/7.3/terraform/main.tf @@ -0,0 +1,42 @@ +resource "yandex_vpc_network" "network-1" { + name = "network1" +} + +resource "yandex_vpc_subnet" "subnet-1" { + name = "subnet1" + zone = "ru-central1-a" + network_id = yandex_vpc_network.network-1.id + v4_cidr_blocks = ["192.168.10.0/24"] +} + +output "internal_ip_address_vm_1" { + value = yandex_compute_instance.vm-1.network_interface.0.ip_address +} + +output "external_ip_address_vm_1" { + value = yandex_compute_instance.vm-1.network_interface.0.nat_ip_address +} + +resource "yandex_compute_instance" "vm-1" { + name = "test-vm-1" + + resources { + cores = 2 + memory = 2 + } + + boot_disk { + initialize_params { + image_id = "fd81hgrcv6lsnkremf32" # ubuntu-20-04-lts-v20210908 + } + } + + network_interface { + subnet_id = yandex_vpc_subnet.subnet-1.id + nat = true + } + + metadata = { + ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}" + } +} diff --git a/src/homework/07-terraform/7.3/terraform/provider.tf b/src/homework/07-terraform/7.3/terraform/provider.tf new file mode 100644 index 0000000..b866564 --- /dev/null +++ b/src/homework/07-terraform/7.3/terraform/provider.tf @@ -0,0 +1,27 @@ +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" +} diff --git a/src/homework/07-terraform/7.3/terraform/variables.tf b/src/homework/07-terraform/7.3/terraform/variables.tf new file mode 100644 index 0000000..e69de29