- Отработать основные принципы и методы работы с управляющими конструкциями Terraform.
- Освоить работу с шаблонизатором Terraform (Interpolation Syntax).
- Зарегистрирован аккаунт в Yandex Cloud. Использован промокод на грант.
- Установлен инструмент Yandex CLI.
- Доступен исходный код для выполнения задания в директории 03/src.
- Любые ВМ, использованные при выполнении задания, должны быть прерываемыми, для экономии средств.
Внимание!! Обязательно предоставляем на проверку получившийся код в виде ссылки на ваш github-репозиторий!
Убедитесь что ваша версия Terraform ~>1.8.4 Теперь пишем красивый код, хардкод значения не допустимы!
- Изучите проект.
- Заполните файл personal.auto.tfvars.
- Инициализируйте проект, выполните код.
Приложите скриншот входящих правил «Группы безопасности» в ЛК Yandex Cloud .
- Создайте файл count-vm.tf. Опишите в нём создание двух одинаковых ВМ web-1 и web-2 (не web-0 и web-1) с минимальными параметрами, используя мета-аргумент count loop. Назначьте ВМ созданную в первом задании группу безопасности.(как это сделать узнайте в документации провайдера yandex/compute_instance )
- Создайте файл for_each-vm.tf. Опишите в нём создание двух ВМ для баз данных с именами "main" и "replica" разных по cpu/ram/disk_volume , используя мета-аргумент for_each loop. Используйте для обеих ВМ одну общую переменную типа:
variable "each_vm" {
type = list(object({ vm_name=string, cpu=number, ram=number, disk_volume=number }))
}
При желании внесите в переменную все возможные параметры. 4. ВМ из пункта 2.1 должны создаваться после создания ВМ из пункта 2.2. 5. Используйте функцию file в local-переменной для считывания ключа ~/.ssh/id_rsa.pub и его последующего использования в блоке metadata, взятому из ДЗ 2. 6. Инициализируйте проект, выполните код.
- Создайте 3 одинаковых виртуальных диска размером 1 Гб с помощью ресурса yandex_compute_disk и мета-аргумента count в файле disk_vm.tf .
- Создайте в том же файле одиночную(использовать count или for_each запрещено из-за задания №4) ВМ c именем "storage" . Используйте блок dynamic secondary_disk{..} и мета-аргумент for_each для подключения созданных вами дополнительных дисков.
- В файле ansible.tf создайте inventory-файл для ansible. Используйте функцию tepmplatefile и файл-шаблон для создания ansible inventory-файла из лекции. Готовый код возьмите из демонстрации к лекции demonstration2. Передайте в него в качестве переменных группы виртуальных машин из задания 2.1, 2.2 и 3.2, т. е. 5 ВМ.
- Инвентарь должен содержать 3 группы и быть динамическим, т. е. обработать как группу из 2-х ВМ, так и 999 ВМ.
- Добавьте в инвентарь переменную fqdn.
[webservers]
web-1 ansible_host=<внешний ip-адрес> fqdn=<полное доменное имя виртуальной машины>
web-2 ansible_host=<внешний ip-адрес> fqdn=<полное доменное имя виртуальной машины>
[databases]
main ansible_host=<внешний ip-адрес> fqdn=<полное доменное имя виртуальной машины>
replica ansible_host<внешний ip-адрес> fqdn=<полное доменное имя виртуальной машины>
[storage]
storage ansible_host=<внешний ip-адрес> fqdn=<полное доменное имя виртуальной машины>
Пример fqdn: web1.ru-central1.internal
(в случае указания переменной hostname(не путать с переменной name)); fhm8k1oojmm5lie8i22a.auto.internal
(в случае отсутвия перменной hostname - автоматическая генерация имени, зона изменяется на auto). нужную вам переменную найдите в документации провайдера или terraform console.
4. Выполните код. Приложите скриншот получившегося файла.
Для общего зачёта создайте в вашем GitHub-репозитории новую ветку terraform-03. Закоммитьте в эту ветку свой финальный код проекта, пришлите ссылку на коммит.
Удалите все созданные ресурсы.
Настоятельно рекомендуем выполнять все задания со звёздочкой. Они помогут глубже разобраться в материале.
Задания со звёздочкой дополнительные, не обязательные к выполнению и никак не повлияют на получение вами зачёта по этому домашнему заданию.
- Напишите output, который отобразит ВМ из ваших ресурсов count и for_each в виде списка словарей :
[
{
"name" = 'имя ВМ1'
"id" = 'идентификатор ВМ1'
"fqdn" = 'Внутренний FQDN ВМ1'
},
{
"name" = 'имя ВМ2'
"id" = 'идентификатор ВМ2'
"fqdn" = 'Внутренний FQDN ВМ2'
},
....
...итд любое количество ВМ в ресурсе(те требуется итерация по ресурсам, а не хардкод) !!!!!!!!!!!!!!!!!!!!!
]
Приложите скриншот вывода команды terrafrom output
.
- Используя null_resource и local-exec, примените ansible-playbook к ВМ из ansible inventory-файла. Готовый код возьмите из демонстрации к лекции demonstration2.
- Модифицируйте файл-шаблон hosts.tftpl. Необходимо отредактировать переменную
ansible_host="<внешний IP-address или внутренний IP-address если у ВМ отсутвует внешний адрес>
.
Для проверки работы уберите у ВМ внешние адреса(nat=false). Этот вариант используется при работе через bastion-сервер. Для зачёта предоставьте код вместе с основной частью задания.
В своём git-репозитории создайте новую ветку terraform-03, закоммитьте в эту ветку свой финальный код проекта. Ответы на задания и необходимые скриншоты оформите в md-файле в ветке terraform-03.
В качестве результата прикрепите ссылку на ветку terraform-03 в вашем репозитории.
Важно. Удалите все созданные ресурсы.
Ваш код возвращает вам следущий набор данных:
> local.vpc
{
"network_id" = "enp7i560tb28nageq0cc"
"subnet_ids" = [
"e9b0le401619ngf4h68n",
"e2lbar6u8b2ftd7f5hia",
"b0ca48coorjjq93u36pl",
"fl8ner8rjsio6rcpcf0h",
]
"subnet_zones" = [
"ru-central1-a",
"ru-central1-b",
"ru-central1-c",
"ru-central1-d",
]
}
Предложите выражение в terraform console, которое удалит из данной переменной 3 элемент из: subnet_ids и subnet_zones.(значения могут быть любыми) Образец конечного результата:
> <некое выражение>
{
"network_id" = "enp7i560tb28nageq0cc"
"subnet_ids" = [
"e9b0le401619ngf4h68n",
"e2lbar6u8b2ftd7f5hia",
"fl8ner8rjsio6rcpcf0h",
]
"subnet_zones" = [
"ru-central1-a",
"ru-central1-b",
"ru-central1-d",
]
}
Идентифицируйте и устраните намеренно допущенную в tpl-шаблоне ошибку. Обратите внимание, что terraform сам сообщит на какой строке и в какой позиции ошибка!
[webservers]
%{~ for i in webservers ~}
${i["name"]} ansible_host=${i["network_interface"][0]["nat_ip_address"] platform_id=${i["platform_id "]}}
%{~ endfor ~}
Напишите terraform выражения, которые сформируют списки:
- ["rc01","rc02","rc03","rc04",rc05","rc06",rc07","rc08","rc09","rc10....."rc99"] те список от "rc01" до "rc99"
- ["rc01","rc02","rc03","rc04",rc05","rc06","rc11","rc12","rc13","rc14",rc15","rc16","rc19"....."rc96"] те список от "rc01" до "rc96", пропуская все номера, заканчивающиеся на "0","7", "8", "9", за исключением "rc19"
Зачёт ставится, если:
- выполнены все задания,
- ответы даны в развёрнутой форме,
- приложены соответствующие скриншоты и файлы проекта,
- в выполненных заданиях нет противоречий и нарушения логики.
На доработку работу отправят, если:
- задание выполнено частично или не выполнено вообще,
- в логике выполнения заданий есть противоречия и существенные недостатки.