mirror of
https://github.com/Dannecron/netology-devops.git
synced 2025-12-25 23:32:37 +03:00
add homework 7.2
This commit is contained in:
6
src/homework/07-terraform/7.2/Makefile
Normal file
6
src/homework/07-terraform/7.2/Makefile
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
tf-init:
|
||||||
|
cd ./terraform \
|
||||||
|
&& env $(cat .env) terraform init
|
||||||
|
tf-plan:
|
||||||
|
cd ./terraform \
|
||||||
|
&& env $(cat .env) terraform plan
|
||||||
146
src/homework/07-terraform/7.2/readme.md
Normal file
146
src/homework/07-terraform/7.2/readme.md
Normal file
@@ -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/).
|
||||||
4
src/homework/07-terraform/7.2/terraform/.env.example
Normal file
4
src/homework/07-terraform/7.2/terraform/.env.example
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
YC_TOKEN=OAuthToken
|
||||||
|
YC_CLOUD_ID=cloudId
|
||||||
|
YC_FOLDER_ID=folderId
|
||||||
|
YC_ZONE=ru-central1-a
|
||||||
37
src/homework/07-terraform/7.2/terraform/.gitignore
vendored
Normal file
37
src/homework/07-terraform/7.2/terraform/.gitignore
vendored
Normal file
@@ -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
|
||||||
9
src/homework/07-terraform/7.2/terraform/.terraform.lock.hcl
generated
Normal file
9
src/homework/07-terraform/7.2/terraform/.terraform.lock.hcl
generated
Normal file
@@ -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=",
|
||||||
|
]
|
||||||
|
}
|
||||||
58
src/homework/07-terraform/7.2/terraform/main.tf
Normal file
58
src/homework/07-terraform/7.2/terraform/main.tf
Normal file
@@ -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")}"
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user