- Научиться использовать модули.
- Отработать операции state.
- Закрепить пройденный материал.
- Зарегистрирован аккаунт в Yandex Cloud. Использован промокод на грант.
- Установлен инструмент Yandex CLI.
- Исходный код для выполнения задания расположен в директории 04/src.
- Любые ВМ, использованные при выполнении задания, должны быть прерываемыми, для экономии средств.
Внимание!! Обязательно предоставляем на проверку получившийся код в виде ссылки на ваш github-репозиторий!
- Возьмите из демонстрации к лекции готовый код для создания с помощью двух вызовов remote-модуля -> двух ВМ, относящихся к разным проектам(marketing и analytics) используйте labels для обозначения принадлежности. В файле cloud-init.yml необходимо использовать переменную для ssh-ключа вместо хардкода. Передайте ssh-ключ в функцию template_file в блоке vars ={} . Воспользуйтесь примером. Обратите внимание, что ssh-authorized-keys принимает в себя список, а не строку.
- Добавьте в файл cloud-init.yml установку nginx.
- Предоставьте скриншот подключения к консоли и вывод команды
sudo nginx -t
, скриншот консоли ВМ yandex cloud с их метками. Откройте terraform console и предоставьте скриншот содержимого модуля. Пример: > module.marketing_vm
В случае использования MacOS вы получите ошибку "Incompatible provider version" . В этом случае скачайте remote модуль локально и поправьте в нем версию template провайдера на более старую.
- Напишите локальный модуль vpc, который будет создавать 2 ресурса: одну сеть и одну подсеть в зоне, объявленной при вызове модуля, например:
ru-central1-a
. - Вы должны передать в модуль переменные с названием сети, zone и v4_cidr_blocks.
- Модуль должен возвращать в root module с помощью output информацию о yandex_vpc_subnet. Пришлите скриншот информации из terraform console о своем модуле. Пример: > module.vpc_dev
- Замените ресурсы yandex_vpc_network и yandex_vpc_subnet созданным модулем. Не забудьте передать необходимые параметры сети из модуля vpc в модуль с виртуальной машиной.
- Сгенерируйте документацию к модулю с помощью terraform-docs.
Пример вызова
module "vpc_dev" {
source = "./vpc"
env_name = "develop"
zone = "ru-central1-a"
cidr = "10.0.1.0/24"
}
- Выведите список ресурсов в стейте.
- Полностью удалите из стейта модуль vpc.
- Полностью удалите из стейта модуль vm.
- Импортируйте всё обратно. Проверьте terraform plan. Значимых(!!) изменений быть не должно. Приложите список выполненных команд и скриншоты процессы.
Настоятельно рекомендуем выполнять все задания со звёздочкой. Они помогут глубже разобраться в материале.
Задания со звёздочкой дополнительные, не обязательные к выполнению и никак не повлияют на получение вами зачёта по этому домашнему заданию.
- Измените модуль vpc так, чтобы он мог создать подсети во всех зонах доступности, переданных в переменной типа list(object) при вызове модуля.
Пример вызова
module "vpc_prod" {
source = "./vpc"
env_name = "production"
subnets = [
{ zone = "ru-central1-a", cidr = "10.0.1.0/24" },
{ zone = "ru-central1-b", cidr = "10.0.2.0/24" },
{ zone = "ru-central1-c", cidr = "10.0.3.0/24" },
]
}
module "vpc_dev" {
source = "./vpc"
env_name = "develop"
subnets = [
{ zone = "ru-central1-a", cidr = "10.0.1.0/24" },
]
}
Предоставьте код, план выполнения, результат из консоли YC.
- Напишите модуль для создания кластера managed БД Mysql в Yandex Cloud с одним или несколькими(2 по умолчанию) хостами в зависимости от переменной HA=true или HA=false. Используйте ресурс yandex_mdb_mysql_cluster: передайте имя кластера и id сети.
- Напишите модуль для создания базы данных и пользователя в уже существующем кластере managed БД Mysql. Используйте ресурсы yandex_mdb_mysql_database и yandex_mdb_mysql_user: передайте имя базы данных, имя пользователя и id кластера при вызове модуля.
- Используя оба модуля, создайте кластер example из одного хоста, а затем добавьте в него БД test и пользователя app. Затем измените переменную и превратите сингл хост в кластер из 2-х серверов.
- Предоставьте план выполнения и по возможности результат. Сразу же удаляйте созданные ресурсы, так как кластер может стоить очень дорого. Используйте минимальную конфигурацию.
- Используя готовый yandex cloud terraform module и пример его вызова(examples/simple-bucket): https://github.com/terraform-yc-modules/terraform-yc-s3 . Создайте и не удаляйте для себя s3 бакет размером 1 ГБ(это бесплатно), он пригодится вам в ДЗ к 5 лекции.
- Разверните у себя локально vault, используя docker-compose.yml в проекте.
- Для входа в web-интерфейс и авторизации terraform в vault используйте токен "education".
- Создайте новый секрет по пути http://127.0.0.1:8200/ui/vault/secrets/secret/create
Path: example
secret data key: test secret data value: congrats! - Считайте этот секрет с помощью terraform и выведите его в output по примеру:
provider "vault" {
address = "http://<IP_ADDRESS>:<PORT_NUMBER>"
skip_tls_verify = true
token = "education"
}
data "vault_generic_secret" "vault_example"{
path = "secret/example"
}
output "vault_example" {
value = "${nonsensitive(data.vault_generic_secret.vault_example.data)}"
}
Можно обратиться не к словарю, а конкретному ключу:
terraform console: >nonsensitive(data.vault_generic_secret.vault_example.data.<имя ключа в секрете>)
- Попробуйте самостоятельно разобраться в документации и записать новый секрет в vault с помощью terraform.
Попробуйте самостоятельно разобраться в документаци и с помощью terraform remote state разделить root модуль на два отдельных root-модуля: создание VPC , создание ВМ .
В своём git-репозитории создайте новую ветку terraform-04, закоммитьте в эту ветку свой финальный код проекта. Ответы на задания и необходимые скриншоты оформите в md-файле в ветке terraform-04.
В качестве результата прикрепите ссылку на ветку terraform-04 в вашем репозитории.
Важно. Удалите все созданные ресурсы.
Зачёт ставится, если:
- выполнены все задания,
- ответы даны в развёрнутой форме,
- приложены соответствующие скриншоты и файлы проекта,
- в выполненных заданиях нет противоречий и нарушения логики.
На доработку работу отправят, если:
- задание выполнено частично или не выполнено вообще,
- в логике выполнения заданий есть противоречия и существенные недостатки.