mirror of
https://github.com/Dannecron/netology-devops.git
synced 2025-12-25 23:32:37 +03:00
add homework 7.3, complete task 1
This commit is contained in:
@@ -32,3 +32,4 @@
|
|||||||
* [6.6. Troubleshooting](/src/homework/06-database/6.6)
|
* [6.6. Troubleshooting](/src/homework/06-database/6.6)
|
||||||
* [7.1. Инфраструктура как код](/src/homework/07-terraform/7.1)
|
* [7.1. Инфраструктура как код](/src/homework/07-terraform/7.1)
|
||||||
* [7.2. Облачные провайдеры и синтаксис Terraform](/src/homework/07-terraform/7.2)
|
* [7.2. Облачные провайдеры и синтаксис Terraform](/src/homework/07-terraform/7.2)
|
||||||
|
* [7.3. Основы и принцип работы Terraform](/src/homework/07-terraform/7.3)
|
||||||
|
|||||||
7
src/homework/07-terraform/7.3/.env.example
Normal file
7
src/homework/07-terraform/7.3/.env.example
Normal file
@@ -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
|
||||||
1
src/homework/07-terraform/7.3/.gitignore
vendored
Normal file
1
src/homework/07-terraform/7.3/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/.env
|
||||||
12
src/homework/07-terraform/7.3/Makefile
Normal file
12
src/homework/07-terraform/7.3/Makefile
Normal file
@@ -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
|
||||||
99
src/homework/07-terraform/7.3/readme.md
Normal file
99
src/homework/07-terraform/7.3/readme.md
Normal file
@@ -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
|
||||||
35
src/homework/07-terraform/7.3/terraform/.gitignore
vendored
Normal file
35
src/homework/07-terraform/7.3/terraform/.gitignore
vendored
Normal file
@@ -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
|
||||||
9
src/homework/07-terraform/7.3/terraform/.terraform.lock.hcl
generated
Normal file
9
src/homework/07-terraform/7.3/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=",
|
||||||
|
]
|
||||||
|
}
|
||||||
42
src/homework/07-terraform/7.3/terraform/main.tf
Normal file
42
src/homework/07-terraform/7.3/terraform/main.tf
Normal file
@@ -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")}"
|
||||||
|
}
|
||||||
|
}
|
||||||
27
src/homework/07-terraform/7.3/terraform/provider.tf
Normal file
27
src/homework/07-terraform/7.3/terraform/provider.tf
Normal file
@@ -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"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user