diff --git a/src/homework/07-terraform/7.2/Makefile b/src/homework/07-terraform/7.2/Makefile new file mode 100644 index 0000000..ffd50e0 --- /dev/null +++ b/src/homework/07-terraform/7.2/Makefile @@ -0,0 +1,6 @@ +tf-init: + cd ./terraform \ + && env $(cat .env) terraform init +tf-plan: + cd ./terraform \ + && env $(cat .env) terraform plan diff --git a/src/homework/07-terraform/7.2/readme.md b/src/homework/07-terraform/7.2/readme.md new file mode 100644 index 0000000..6ff6272 --- /dev/null +++ b/src/homework/07-terraform/7.2/readme.md @@ -0,0 +1,146 @@ +Выполнение [домашнего задания](https://github.com/netology-code/virt-homeworks/blob/master/07-terraform-02-syntax/README.md) +по теме "7.2. Облачные провайдеры и синтаксис Terraform". + +## Q/A + +### Задание 1 + +> Вариант с Yandex.Cloud. Регистрация в ЯО и знакомство с основами. +> +> 1. Подробная инструкция на русском языке содержится [здесь](https://cloud.yandex.ru/docs/solutions/infrastructure-management/terraform-quickstart). +> 2. Обратите внимание на период бесплатного использования после регистрации аккаунта. +> 3. Используйте раздел "Подготовьте облако к работе" для регистрации аккаунта. Далее раздел "Настройте провайдер" для подготовки +> базового терраформ конфига. +> 4. Воспользуйтесь [инструкцией](https://registry.terraform.io/providers/yandex-cloud/yandex/latest/docs) на сайте терраформа, что бы +> не указывать авторизационный токен в коде, а терраформ провайдер брал его из переменных окружений. + +Установка и настройка `yc`, а также подключение к `yandex.cloud` подробно разобраны в [домашнем задании 5.4](/src/homework/05-virtualization/5.4/readme.md#задача-1). + +Для хранения секретов будет использоваться файл [.env](./terraform/.env), который должен быть инициализирован +перед работой из примера [.env.example](./terraform/.env.example). + +### Задание 2 + +Создание `yandex_compute_instance` через терраформ. + +> 1. В каталоге `terraform` вашего основного репозитория, который был создан в начале курсе, создайте файл `main.tf` и `versions.tf`. +> 2. Зарегистрируйте провайдер для [yandex.cloud](https://registry.terraform.io/providers/yandex-cloud/yandex/latest/docs). +> Подробную инструкцию можно найти [здесь](https://cloud.yandex.ru/docs/solutions/infrastructure-management/terraform-quickstart). +> 3. Внимание! В гит репозиторий нельзя пушить ваши личные ключи доступа к аккаунту. Поэтому в предыдущем задании мы указывали +> их в виде переменных окружения. +> 4. В файле `main.tf` воспользуйтесь блоком `data "aws_ami` для поиска ami образа последнего Ubuntu. +> 5. В файле `main.tf` создайте ресурс [yandex_compute_image](https://registry.terraform.io/providers/yandex-cloud/yandex/latest/docs/resources/compute_image). +> 6. Если вы выполнили первый пункт, то добейтесь того, что бы команда `terraform plan` выполнялась без ошибок. +> +> В качестве результата задания предоставьте: +> 1. Ответ на вопрос: при помощи какого инструмента (из разобранных на прошлом занятии) можно создать свой образ ami? +> 2. Ссылку на репозиторий с исходной конфигурацией терраформа. + +Для регистрации провайдера `yandex.cloud` необходимо создать файл [main.tf](./terraform/main.tf) со следующим содержанием: + +```terraform +terraform { + required_providers { + yandex = { + source = "yandex-cloud/yandex" + } + } + required_version = ">= 0.13" +} + +provider "yandex" { + token = "auth_token_here" + cloud_id = "cloud_id_here" + folder_id = "folder_id_here" + zone = "ru-central1-a" +} +``` + +Здесь конфигурация провайдера будет произведена из переменных окружений, поэтому значения в самом файле не будут реальными. + +Следующим шагом необходимо инициализировать конфигурацию: + +```shell +cd ./terraform \ + && env $(cat .env) terraform init +``` + +Для упрощения вызова команд был создан [Makefile](./Makefile). + +Для создания `yandex_compute_image` в [main.tf](./terraform/main.tf) необходимо добавить: + +```shell +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"] +} + +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")}" + } +} + +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_vpc_network" "network-1"` - создание сети, необходимой для соединения ВМ с внешними и внутренними ресурсами. +- `resource "yandex_vpc_subnet" "subnet-1"` - создание подсети внутри базовой сети с уже определёнными параметрами и пулом ip-адресов. +- `resource "yandex_compute_instance" "vm-1"` - создание виртуальной машины + - `initialize_params { image_id = "fd81hgrcv6lsnkremf32" }` идентификатор образа операционной системы. + Идентификатор можно получить в выводе команды `yc compute image list --folder-id standard-images`, + которая выводит список всех доступных базовых образов операционных систем. +- `output "internal_ip_address_vm_1"` и `output "external_ip_address_vm_1"` - сохранение данных из объекта виртуальной машины для дальнейшего вывода. + +Затем, необходимо выполнить следующую команду, чтобы проверить работоспособность конфигурации: + +```shell +cd ./terraform \ + && env terraform plan + +Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + + create + +Terraform will perform the following actions: + + # yandex_compute_instance.vm-1 will be created + + resource "yandex_compute_instance" "vm-1" { +<...> +``` + +#### Ответы + +1. При помощи какого инструмента (из разобранных на прошлом занятии) можно создать свой образ ami + +Для создания своего образа операционной системы для виртуальной машины можно воспользоваться инструментом [`packer`](https://www.packer.io/). diff --git a/src/homework/07-terraform/7.2/terraform/.env.example b/src/homework/07-terraform/7.2/terraform/.env.example new file mode 100644 index 0000000..6a836d2 --- /dev/null +++ b/src/homework/07-terraform/7.2/terraform/.env.example @@ -0,0 +1,4 @@ +YC_TOKEN=OAuthToken +YC_CLOUD_ID=cloudId +YC_FOLDER_ID=folderId +YC_ZONE=ru-central1-a diff --git a/src/homework/07-terraform/7.2/terraform/.gitignore b/src/homework/07-terraform/7.2/terraform/.gitignore new file mode 100644 index 0000000..fcb5025 --- /dev/null +++ b/src/homework/07-terraform/7.2/terraform/.gitignore @@ -0,0 +1,37 @@ +.env + +# 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.2/terraform/.terraform.lock.hcl b/src/homework/07-terraform/7.2/terraform/.terraform.lock.hcl new file mode 100644 index 0000000..a56e8c6 --- /dev/null +++ b/src/homework/07-terraform/7.2/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.2/terraform/main.tf b/src/homework/07-terraform/7.2/terraform/main.tf new file mode 100644 index 0000000..06540b2 --- /dev/null +++ b/src/homework/07-terraform/7.2/terraform/main.tf @@ -0,0 +1,58 @@ +terraform { + required_providers { + yandex = { + source = "yandex-cloud/yandex" + } + } + required_version = ">= 0.13" +} + +provider "yandex" { + token = "auth_token_here" + cloud_id = "cloud_id_here" + folder_id = "folder_id_here" + zone = "ru-central1-a" +} + +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")}" + } +}