fix: Rename reports by template
This commit is contained in:
1 parent
31817537f1
commit
b575182204
12 files changed
+435
-67
No files matched your search
+71
-67
@@ -1,68 +1,72 @@
|
||||
file_name,artifact_type,module_or_lab,task_code,task_title,relative_path,evidence_for,status,comment
|
||||
VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,PR,M00,PR00,Настройка окружения,submission/01_reports/VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,Подтверждает выполнение демонстрации M00_PR00 (настройка среды),final,
|
||||
VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,PR,LR_01,main,Высокодоступная веб-инфраструктура (ЛР1),submission/01_reports/VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,Подтверждает выполнение лабораторной работы №1,final,Был переименован из LR_04
|
||||
VKC_PR_M02_1_REPORT_РемизовКЛ_20260531.md,PR,M02,01,Демонстрация 2.1: Сети,submission/01_reports/VKC_PR_M02_1_REPORT_РемизовКЛ_20260531.md,Подтверждает выполнение демонстрации 2.1 (создание VPC и подсетей),final,
|
||||
VKC_PR_M02_2_REPORT_РемизовКЛ_20260531.md,PR,M02,02,Демонстрация 2.2: Security Groups,submission/01_reports/VKC_PR_M02_2_REPORT_РемизовКЛ_20260531.md,Подтверждает выполнение демонстрации 2.2 (настройка групп безопасности),final,
|
||||
VKC_PR_M02_3_REPORT_РемизовКЛ_20260531.md,PR,M02,03,Демонстрация 2.3: Балансировщик нагрузки,submission/01_reports/VKC_PR_M02_3_REPORT_РемизовКЛ_20260531.md,Подтверждает выполнение демонстрации 2.3 (балансировщик и health checks),final,
|
||||
VKC_PR_M03_1_REPORT_РемизовКЛ_20260609.md,PR,M03,01,Демонстрация 3.1: Объектное хранилище S3,submission/01_reports/VKC_PR_M03_1_REPORT_РемизовКЛ_20260609.md,Подтверждает выполнение демонстрации 3.1 (S3 бакет, статический хостинг),final,
|
||||
VKC_PR_M03_2_REPORT_РемизовКЛ_20260610.md,PR,M03,02,Демонстрация 3.2: Управляемая БД PostgreSQL,submission/01_reports/VKC_PR_M03_2_REPORT_РемизовКЛ_20260610.md,Подтверждает выполнение демонстрации 3.2 (создание и подключение к БД),final,
|
||||
VKC_ENV_M00_PR00_connectofirstVM_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,SSH подключение к первой ВМ,submission/02_evidence/VKC_ENV_M00_PR00_connectofirstVM_РемизовКЛ_20260526.png,Скриншот: SSH-соединение с ВМ,final,
|
||||
VKC_ENV_M00_PR00_firstVM_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Первая ВМ создана,submission/02_evidence/VKC_ENV_M00_PR00_firstVM_РемизовКЛ_20260526.png,Скриншот: созданная ВМ в консоли,final,
|
||||
VKC_ENV_M00_PR00_openstackcreatinglist_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,OpenStack CLI список ВМ,submission/02_evidence/VKC_ENV_M00_PR00_openstackcreatinglist_РемизовКЛ_20260526.png,Скриншот: openstack server list,final,
|
||||
VKC_ENV_M00_PR00_openstackcreating_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,OpenStack CLI создание ВМ,submission/02_evidence/VKC_ENV_M00_PR00_openstackcreating_РемизовКЛ_20260526.png,Скриншот: openstack server create,final,
|
||||
VKC_ENV_M00_PR00_security_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Настройки безопасности и 2FA,submission/02_evidence/VKC_ENV_M00_PR00_security_РемизовКЛ_20260526.png,Скриншот: 2FA или security settings,final,
|
||||
VKC_ENV_M00_PR00_terraformcreating1_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Terraform plan этап 1,submission/02_evidence/VKC_ENV_M00_PR00_terraformcreating1_РемизовКЛ_20260526.png,Скриншот: terraform plan шаг 1,final,
|
||||
VKC_ENV_M00_PR00_terraformcreating2_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Terraform plan этап 2,submission/02_evidence/VKC_ENV_M00_PR00_terraformcreating2_РемизовКЛ_20260526.png,Скриншот: terraform plan шаг 2,final,
|
||||
VKC_ENV_M00_PR00_terraformcreatingcheck_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Terraform apply успех,submission/02_evidence/VKC_ENV_M00_PR00_terraformcreatingcheck_РемизовКЛ_20260526.png,Скриншот: terraform apply success,final,
|
||||
VKC_LR_01_balancer_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Балансировщик нагрузки,submission/02_evidence/VKC_LR_01_balancer_РемизовКЛ_20260604.png,Скриншот: балансировщик в консоли,final,
|
||||
VKC_LR_01_bastion_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Бастионный хост,submission/02_evidence/VKC_LR_01_bastion_РемизовКЛ_20260604.png,Скриншот: бастионный хост,final,
|
||||
VKC_LR_01_DB_SecurityGroups_20260604.png,EVIDENCE,LR_01,main,Группы безопасности БД,submission/02_evidence/VKC_LR_01_DB_SecurityGroups_20260604.png,Скриншот: Security Groups для БД,final,
|
||||
VKC_LR_01_DB_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Инстанс базы данных,submission/02_evidence/VKC_LR_01_DB_РемизовКЛ_20260604.png,Скриншот: созданная БД,final,
|
||||
VKC_LR_01_Lab1VPC_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Конфигурация VPC,submission/02_evidence/VKC_LR_01_Lab1VPC_РемизовКЛ_20260604.png,Скриншот: VPC и подсети,final,
|
||||
VKC_LR_01_Prif_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Тест производительности,submission/02_evidence/VKC_LR_01_Prif_РемизовКЛ_20260604.png,Скриншот: профилирование/тест,final,
|
||||
VKC_LR_01_Router_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Настройки роутера,submission/02_evidence/VKC_LR_01_Router_РемизовКЛ_20260604.png,Скриншот: роутер и маршруты,final,
|
||||
VKC_LR_01_VM_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Список виртуальных машин,submission/02_evidence/VKC_LR_01_VM_РемизовКЛ_20260604.png,Скриншот: список ВМ,final,
|
||||
VKC_PR_M02_NetworksCard_РемизовКЛ_20260531.png,EVIDENCE,M02,01,Детали сетевой карты,submission/02_evidence/VKC_PR_M02_NetworksCard_РемизовКЛ_20260531.png,Скриншот: network card details,final,
|
||||
VKC_PR_M02_terraformNetworkCreating_РемизовКЛ_20260531.png,EVIDENCE,M02,01,Terraform создание сети,submission/02_evidence/VKC_PR_M02_terraformNetworkCreating_РемизовКЛ_20260531.png,Скриншот: terraform network creation,final,
|
||||
VKC_PR_M02_VPCandSubnets_РемизовКЛ_20260531.png,EVIDENCE,M02,01,VPC и подсети (UI),submission/02_evidence/VKC_PR_M02_VPCandSubnets_РемизовКЛ_20260531.png,Скриншот: VPC and subnets UI,final,
|
||||
VKC_PR_M02_VPCbyOpenstack_РемизовКЛ_20260531.png,EVIDENCE,M02,01,VPC через OpenStack CLI,submission/02_evidence/VKC_PR_M02_VPCbyOpenstack_РемизовКЛ_20260531.png,Скриншот: openstack network list,final,
|
||||
VKC_PR_M02_Securitygroupsbyopenstack_РемизовКЛ_20260531.png,EVIDENCE,M02,02,Группы безопасности (OpenStack CLI),submission/02_evidence/VKC_PR_M02_Securitygroupsbyopenstack_РемизовКЛ_20260531.png,Скриншот: openstack security group,final,
|
||||
VKC_PR_M02_Securitygroupsbyterraform_РемизовКЛ_20260531.png,EVIDENCE,M02,02,Группы безопасности (Terraform),submission/02_evidence/VKC_PR_M02_Securitygroupsbyterraform_РемизовКЛ_20260531.png,Скриншот: terraform security group,final,
|
||||
VKC_PR_M02_Securitygroups_РемизовКЛ_20260531.png,EVIDENCE,M02,02,Группы безопасности (UI),submission/02_evidence/VKC_PR_M02_Securitygroups_РемизовКЛ_20260531.png,Скриншот: security groups UI,final,
|
||||
VKC_PR_M02_Balancerpruf_РемизовКЛ_20260531.png,EVIDENCE,M02,03,Проверка здоровья балансировщика,submission/02_evidence/VKC_PR_M02_Balancerpruf_РемизовКЛ_20260531.png,Скриншот: health check proof,final,
|
||||
VKC_PR_M02_Balancerterraform_РемизовКЛ_20260531.png,EVIDENCE,M02,03,Балансировщик (Terraform код),submission/02_evidence/VKC_PR_M02_Balancerterraform_РемизовКЛ_20260531.png,Скриншот: terraform load balancer code,final,
|
||||
VKC_PR_M02_Balancer_РемизовКЛ_20260531.png,EVIDENCE,M02,03,Балансировщик создан,submission/02_evidence/VKC_PR_M02_Balancer_РемизовКЛ_20260531.png,Скриншот: load balancer created,final,
|
||||
VKC_PR_M03_aws_РемизовКЛ_20260609.log,EVIDENCE,M03,01,Вывод AWS CLI,submission/02_evidence/VKC_PR_M03_aws_РемизовКЛ_20260609.log,Лог: AWS CLI output,final,
|
||||
VKC_PR_M03_Bucket_РемизовКЛ_20260609.png,EVIDENCE,M03,01,S3 бакет,submission/02_evidence/VKC_PR_M03_Bucket_РемизовКЛ_20260609.png,Скриншот: S3 bucket,final,
|
||||
VKC_PR_M03_CreatedDBShow_РемизовКЛ_20260609.png,EVIDENCE,M03,01,Созданная БД (скриншот),submission/02_evidence/VKC_PR_M03_CreatedDBShow_РемизовКЛ_20260609.png,Скриншот: database creation,final,
|
||||
VKC_PR_M03_index_РемизовКЛ_20260609.png,EVIDENCE,M03,01,Главная страница,submission/02_evidence/VKC_PR_M03_index_РемизовКЛ_20260609.png,Скриншот: index page,final,
|
||||
VKC_PR_M03_terraform_РемизовКЛ_20260609.log,EVIDENCE,M03,01,Лог выполнения Terraform,submission/02_evidence/VKC_PR_M03_terraform_РемизовКЛ_20260609.log,Лог: terraform output,final,
|
||||
VKC_PR_M03_DBLog_РемизовКЛ_20260610.log,EVIDENCE,M03,02,Лог базы данных,submission/02_evidence/VKC_PR_M03_DBLog_РемизовКЛ_20260610.log,Лог: database log,final,
|
||||
VKC_PR_M03_DBopenStack_РемизовКЛ_20260610.log,EVIDENCE,M03,02,OpenStack CLI (БД),submission/02_evidence/VKC_PR_M03_DBopenStack_РемизовКЛ_20260610.log,Лог: openstack database commands,final,
|
||||
VKC_PR_M03_DBTerraform_РемизовКЛ_20260610.log,EVIDENCE,M03,02,Terraform для БД (лог),submission/02_evidence/VKC_PR_M03_DBTerraform_РемизовКЛ_20260610.log,Лог: terraform db apply,final,
|
||||
VKC_LR_01_compute_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform compute,submission/03_code/VKC_LR_01_compute_РемизовКЛ_20260604.tf,Код: вычислительные ресурсы,final,
|
||||
VKC_LR_01_loadbalancer_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform балансировщик,submission/03_code/VKC_LR_01_loadbalancer_РемизовКЛ_20260604.tf,Код: load balancer,final,
|
||||
VKC_LR_01_network_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform сеть,submission/03_code/VKC_LR_01_network_РемизовКЛ_20260604.tf,Код: network,final,
|
||||
VKC_LR_01_outputs_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform outputs,submission/03_code/VKC_LR_01_outputs_РемизовКЛ_20260604.tf,Код: outputs,final,
|
||||
VKC_LR_01_provider_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform provider,submission/03_code/VKC_LR_01_provider_РемизовКЛ_20260604.tf,Код: provider,final,
|
||||
VKC_LR_01_security_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform security groups,submission/03_code/VKC_LR_01_security_РемизовКЛ_20260604.tf,Код: security groups,final,
|
||||
VKC_LR_01_terraform_РемизовКЛ_20260604.tfvars,CODE,LR_01,main,Terraform переменные (значения),submission/03_code/VKC_LR_01_terraform_РемизовКЛ_20260604.tfvars,Код: tfvars values,final,
|
||||
VKC_LR_01_variables_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform переменные (декларация),submission/03_code/VKC_LR_01_variables_РемизовКЛ_20260604.tf,Код: variables,final,
|
||||
VKC_LR_05_DB_REPORT_РемизовКЛ_20260604.md,PR,LR_05,main,Резервное копирование и восстановление БД (ЛР5),submission/01_reports/VKC_LR_05_DB_REPORT_РемизовКЛ_20260604.md,Подтверждает выполнение лабораторной работы №5,final,
|
||||
VKC_PR_M04_1_REPORT_РемизовКЛ_20260614.md,PR,M04,01,Демонстрация 4.1: Управление образами ВМ,submission/01_reports/VKC_PR_M04_1_REPORT_РемизовКЛ_20260614.md,Подтверждает выполнение демонстрации 4.1 (работа с образами ВМ),final,
|
||||
VKC_PR_M04_2_REPORT_РемизовКЛ_20260614.md,PR,M04,02,Демонстрация 4.2: Работа с API через curl,submission/01_reports/VKC_PR_M04_2_REPORT_РемизовКЛ_20260614.md,Подтверждает выполнение демонстрации 4.2 (вызов API),final,
|
||||
VKC_LR_05_DBInstance_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Инстанс базы данных для ЛР5,submission/02_evidence/VKC_LR_05_DBInstance_РемизовКЛ_20260610.png,Скриншот: инстанс БД,final,
|
||||
VKC_LR_05_Backups_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Бакет S3 с бэкапами,submission/02_evidence/VKC_LR_05_Backups_РемизовКЛ_20260610.png,Скриншот: бакет с бэкапами,final,
|
||||
VKC_LR_05_BackupsList_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Список резервных копий,submission/02_evidence/VKC_LR_05_BackupsList_РемизовКЛ_20260610.png,Скриншот: список бэкапов,final,
|
||||
VKC_LR_05_BackupDB_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Восстановление из бэкапа,submission/02_evidence/VKC_LR_05_BackupDB_РемизовКЛ_20260610.png,Скриншот: процесс восстановления,final,
|
||||
VKC_LR_05_PITR_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Настройка PITR,submission/02_evidence/VKC_LR_05_PITR_РемизовКЛ_20260610.png,Скриншот: Point-in-Time Recovery,final,
|
||||
VKC_LR_05_S3_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Экспорт в S3,submission/02_evidence/VKC_LR_05_S3_РемизовКЛ_20260610.png,Скриншот: экспорт бэкапа в S3,final,
|
||||
VKC_PR_M04_1_cliAdvancedVMVkCloud_РемизовКЛ_20260614.png,EVIDENCE,M04,01,Расширенное создание ВМ через CLI,submission/02_evidence/VKC_PR_M04_1_cliAdvancedVMVkCloud_РемизовКЛ_20260614.png,Скриншот: созданная ВМ cli-advanced-vm,final,
|
||||
VKC_PR_M04_1_ImageVkcloud_РемизовКЛ_20260614.png,EVIDENCE,M04,01,Созданный образ my-custom-image,submission/02_evidence/VKC_PR_M04_1_ImageVkcloud_РемизовКЛ_20260614.png,Скриншот: образ в консоли,final,
|
||||
VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log,EVIDENCE,M04,01,Лог создания ВМ через CLI,submission/02_evidence/VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log,Лог: openstack server create,final,
|
||||
VKC_PR_M04_1_VmImage_РемизовКЛ_20260614.log,EVIDENCE,M04,01,Лог создания образа ВМ,submission/02_evidence/VKC_PR_M04_1_VmImage_РемизовКЛ_20260614.log,Лог: создание снапшота,final,
|
||||
VKC_PR_M04_2_APIVMCreate_РемизовКЛ_20260614.png,EVIDENCE,M04,02,Создание ВМ через API (скриншот),submission/02_evidence/VKC_PR_M04_2_APIVMCreate_РемизовКЛ_20260614.png,Скриншот: успешный ответ API,final,
|
||||
VKC_PR_M04_2_TokenGet_РемизовКЛ_20260614.log,EVIDENCE,M04,02,Получение токена аутентификации,submission/02_evidence/VKC_PR_M04_2_TokenGet_РемизовКЛ_20260614.log,Лог: получение X-Subject-Token,final,
|
||||
VKC_PR_M04_2_VMCreate_РемизовКЛ_20260614.log,EVIDENCE,M04,02,Лог создания ВМ через API,submission/02_evidence/VKC_PR_M04_2_VMCreate_РемизовКЛ_20260614.log,Лог: POST запрос к /servers,final,
|
||||
VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log,EVIDENCE,M04,02,Список ВМ через API,submission/02_evidence/VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log,Лог: GET /servers,final,
|
||||
VKC_LR_05_DB_РемизовКЛ_20260610.tf,CODE,LR_05,main,Terraform конфигурация управляемой БД,submission/03_code/VKC_LR_05_DB_РемизовКЛ_20260610.tf,Код: terraform для БД ЛР5,final,
|
||||
VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,ENV,M00,PR00,Настройка учебной среды,submission/01_reports/VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,,final,
|
||||
VKC_ENV_M00_PR00_connectofirstVM_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,SSH подключение к первой ВМ,submission/02_evidence/VKC_ENV_M00_PR00_connectofirstVM_РемизовКЛ_20260526.png,VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,final,
|
||||
VKC_ENV_M00_PR00_firstVM_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Первая ВМ создана,submission/02_evidence/VKC_ENV_M00_PR00_firstVM_РемизовКЛ_20260526.png,VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,final,
|
||||
VKC_ENV_M00_PR00_openstackcreating_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,OpenStack CLI создание ВМ,submission/02_evidence/VKC_ENV_M00_PR00_openstackcreating_РемизовКЛ_20260526.png,VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,final,
|
||||
VKC_ENV_M00_PR00_openstackcreatinglist_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,OpenStack CLI список ВМ,submission/02_evidence/VKC_ENV_M00_PR00_openstackcreatinglist_РемизовКЛ_20260526.png,VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,final,
|
||||
VKC_ENV_M00_PR00_security_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Настройки безопасности и 2FA,submission/02_evidence/VKC_ENV_M00_PR00_security_РемизовКЛ_20260526.png,VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,final,
|
||||
VKC_ENV_M00_PR00_terraformcreating1_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Terraform plan этап 1,submission/02_evidence/VKC_ENV_M00_PR00_terraformcreating1_РемизовКЛ_20260526.png,VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,final,
|
||||
VKC_ENV_M00_PR00_terraformcreating2_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Terraform plan этап 2,submission/02_evidence/VKC_ENV_M00_PR00_terraformcreating2_РемизовКЛ_20260526.png,VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,final,
|
||||
VKC_ENV_M00_PR00_terraformcreatingcheck_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Terraform apply успех,submission/02_evidence/VKC_ENV_M00_PR00_terraformcreatingcheck_РемизовКЛ_20260526.png,VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,final,
|
||||
VKC_PR_M02_01_vpc_subnets_REPORT_РемизовКЛ_20260531.md,PR,M02,01,Сети и виртуальная инфраструктура (VPC и подсети),submission/01_reports/VKC_PR_M02_01_vpc_subnets_REPORT_РемизовКЛ_20260531.md,,final,
|
||||
VKC_PR_M02_NetworksCard_РемизовКЛ_20260531.png,EVIDENCE,M02,01,Детали сетевой карты,submission/02_evidence/VKC_PR_M02_NetworksCard_РемизовКЛ_20260531.png,VKC_PR_M02_01_vpc_subnets_REPORT_РемизовКЛ_20260531.md,final,
|
||||
VKC_PR_M02_terraformNetworkCreating_РемизовКЛ_20260531.png,EVIDENCE,M02,01,Terraform создание сети,submission/02_evidence/VKC_PR_M02_terraformNetworkCreating_РемизовКЛ_20260531.png,VKC_PR_M02_01_vpc_subnets_REPORT_РемизовКЛ_20260531.md,final,
|
||||
VKC_PR_M02_VPCandSubnets_РемизовКЛ_20260531.png,EVIDENCE,M02,01,VPC и подсети (UI),submission/02_evidence/VKC_PR_M02_VPCandSubnets_РемизовКЛ_20260531.png,VKC_PR_M02_01_vpc_subnets_REPORT_РемизовКЛ_20260531.md,final,
|
||||
VKC_PR_M02_VPCbyOpenstack_РемизовКЛ_20260531.png,EVIDENCE,M02,01,VPC через OpenStack CLI,submission/02_evidence/VKC_PR_M02_VPCbyOpenstack_РемизовКЛ_20260531.png,VKC_PR_M02_01_vpc_subnets_REPORT_РемизовКЛ_20260531.md,final,
|
||||
VKC_PR_M02_02_secgroups_REPORT_РемизовКЛ_20260531.md,PR,M02,02,Настройка Security Groups,submission/01_reports/VKC_PR_M02_02_secgroups_REPORT_РемизовКЛ_20260531.md,,final,
|
||||
VKC_PR_M02_Securitygroups_РемизовКЛ_20260531.png,EVIDENCE,M02,02,Группы безопасности (UI),submission/02_evidence/VKC_PR_M02_Securitygroups_РемизовКЛ_20260531.png,VKC_PR_M02_02_secgroups_REPORT_РемизовКЛ_20260531.md,final,
|
||||
VKC_PR_M02_Securitygroupsbyopenstack_РемизовКЛ_20260531.png,EVIDENCE,M02,02,Группы безопасности (OpenStack CLI),submission/02_evidence/VKC_PR_M02_Securitygroupsbyopenstack_РемизовКЛ_20260531.png,VKC_PR_M02_02_secgroups_REPORT_РемизовКЛ_20260531.md,final,
|
||||
VKC_PR_M02_Securitygroupsbyterraform_РемизовКЛ_20260531.png,EVIDENCE,M02,02,Группы безопасности (Terraform),submission/02_evidence/VKC_PR_M02_Securitygroupsbyterraform_РемизовКЛ_20260531.png,VKC_PR_M02_02_secgroups_REPORT_РемизовКЛ_20260531.md,final,
|
||||
VKC_PR_M02_03_loadbalancer_REPORT_РемизовКЛ_20260531.md,PR,M02,03,Настройка балансировщика нагрузки,submission/01_reports/VKC_PR_M02_03_loadbalancer_REPORT_РемизовКЛ_20260531.md,,final,
|
||||
VKC_PR_M02_Balancer_РемизовКЛ_20260531.png,EVIDENCE,M02,03,Балансировщик создан,submission/02_evidence/VKC_PR_M02_Balancer_РемизовКЛ_20260531.png,VKC_PR_M02_03_loadbalancer_REPORT_РемизовКЛ_20260531.md,final,
|
||||
VKC_PR_M02_Balancerpruf_РемизовКЛ_20260531.png,EVIDENCE,M02,03,Проверка здоровья балансировщика,submission/02_evidence/VKC_PR_M02_Balancerpruf_РемизовКЛ_20260531.png,VKC_PR_M02_03_loadbalancer_REPORT_РемизовКЛ_20260531.md,final,
|
||||
VKC_PR_M02_Balancerterraform_РемизовКЛ_20260531.png,EVIDENCE,M02,03,Балансировщик (Terraform код),submission/02_evidence/VKC_PR_M02_Balancerterraform_РемизовКЛ_20260531.png,VKC_PR_M02_03_loadbalancer_REPORT_РемизовКЛ_20260531.md,final,
|
||||
VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,LR,LR_01,main,Развертывание отказоустойчивой веб-инфраструктуры (ЛР1),submission/01_reports/VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,,final,
|
||||
VKC_LR_01_DB_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Инстанс базы данных,submission/02_evidence/VKC_LR_01_DB_РемизовКЛ_20260604.png,VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,final,
|
||||
VKC_LR_01_DB_SecurityGroups_20260604.png,EVIDENCE,LR_01,main,Группы безопасности БД,submission/02_evidence/VKC_LR_01_DB_SecurityGroups_20260604.png,VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,final,
|
||||
VKC_LR_01_Lab1VPC_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Конфигурация VPC,submission/02_evidence/VKC_LR_01_Lab1VPC_РемизовКЛ_20260604.png,VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,final,
|
||||
VKC_LR_01_Prif_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Тест производительности,submission/02_evidence/VKC_LR_01_Prif_РемизовКЛ_20260604.png,VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,final,
|
||||
VKC_LR_01_Router_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Настройки роутера,submission/02_evidence/VKC_LR_01_Router_РемизовКЛ_20260604.png,VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,final,
|
||||
VKC_LR_01_VM_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Список виртуальных машин,submission/02_evidence/VKC_LR_01_VM_РемизовКЛ_20260604.png,VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,final,
|
||||
VKC_LR_01_balancer_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Балансировщик нагрузки,submission/02_evidence/VKC_LR_01_balancer_РемизовКЛ_20260604.png,VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,final,
|
||||
VKC_LR_01_bastion_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Бастионный хост,submission/02_evidence/VKC_LR_01_bastion_РемизовКЛ_20260604.png,VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,final,
|
||||
VKC_LR_01_compute_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform compute,submission/03_code/VKC_LR_01_compute_РемизовКЛ_20260604.tf,,final,
|
||||
VKC_LR_01_loadbalancer_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform балансировщик,submission/03_code/VKC_LR_01_loadbalancer_РемизовКЛ_20260604.tf,,final,
|
||||
VKC_LR_01_network_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform сеть,submission/03_code/VKC_LR_01_network_РемизовКЛ_20260604.tf,,final,
|
||||
VKC_LR_01_outputs_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform outputs,submission/03_code/VKC_LR_01_outputs_РемизовКЛ_20260604.tf,,final,
|
||||
VKC_LR_01_provider_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform provider,submission/03_code/VKC_LR_01_provider_РемизовКЛ_20260604.tf,,final,
|
||||
VKC_LR_01_security_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform security groups,submission/03_code/VKC_LR_01_security_РемизовКЛ_20260604.tf,,final,
|
||||
VKC_LR_01_terraform_РемизовКЛ_20260604.tfvars,CODE,LR_01,main,Terraform переменные (значения),submission/03_code/VKC_LR_01_terraform_РемизовКЛ_20260604.tfvars,,final,
|
||||
VKC_LR_01_variables_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform переменные (декларация),submission/03_code/VKC_LR_01_variables_РемизовКЛ_20260604.tf,,final,
|
||||
VKC_PR_M03_01_s3_REPORT_РемизовКЛ_20260609.md,PR,M03,01,Работа с объектным хранилищем (S3),submission/01_reports/VKC_PR_M03_01_s3_REPORT_РемизовКЛ_20260609.md,,final,
|
||||
VKC_PR_M03_aws_РемизовКЛ_20260609.log,EVIDENCE,M03,01,Вывод AWS CLI,submission/02_evidence/VKC_PR_M03_aws_РемизовКЛ_20260609.log,VKC_PR_M03_01_s3_REPORT_РемизовКЛ_20260609.md,final,
|
||||
VKC_PR_M03_Bucket_РемизовКЛ_20260609.png,EVIDENCE,M03,01,S3 бакет,submission/02_evidence/VKC_PR_M03_Bucket_РемизовКЛ_20260609.png,VKC_PR_M03_01_s3_REPORT_РемизовКЛ_20260609.md,final,
|
||||
VKC_PR_M03_index_РемизовКЛ_20260609.png,EVIDENCE,M03,01,Главная страница (статический сайт),submission/02_evidence/VKC_PR_M03_index_РемизовКЛ_20260609.png,VKC_PR_M03_01_s3_REPORT_РемизовКЛ_20260609.md,final,
|
||||
VKC_PR_M03_terraform_РемизовКЛ_20260609.log,EVIDENCE,M03,01,Лог выполнения Terraform,submission/02_evidence/VKC_PR_M03_terraform_РемизовКЛ_20260609.log,VKC_PR_M03_01_s3_REPORT_РемизовКЛ_20260609.md,final,
|
||||
VKC_PR_M03_02_postgres_REPORT_РемизовКЛ_20260610.md,PR,M03,02,Создание управляемой базы данных PostgreSQL,submission/01_reports/VKC_PR_M03_02_postgres_REPORT_РемизовКЛ_20260610.md,,final,
|
||||
VKC_PR_M03_CreatedDBShow_РемизовКЛ_20260609.png,EVIDENCE,M03,02,Созданная БД (скриншот),submission/02_evidence/VKC_PR_M03_CreatedDBShow_РемизовКЛ_20260609.png,VKC_PR_M03_02_postgres_REPORT_РемизовКЛ_20260610.md,final,
|
||||
VKC_PR_M03_DBLog_РемизовКЛ_20260610.log,EVIDENCE,M03,02,Лог базы данных (psql),submission/02_evidence/VKC_PR_M03_DBLog_РемизовКЛ_20260610.log,VKC_PR_M03_02_postgres_REPORT_РемизовКЛ_20260610.md,final,
|
||||
VKC_PR_M03_DBTerraform_РемизовКЛ_20260610.log,EVIDENCE,M03,02,Terraform для БД (лог),submission/02_evidence/VKC_PR_M03_DBTerraform_РемизовКЛ_20260610.log,VKC_PR_M03_02_postgres_REPORT_РемизовКЛ_20260610.md,final,
|
||||
VKC_PR_M03_DBopenStack_РемизовКЛ_20260610.log,EVIDENCE,M03,02,OpenStack CLI (БД),submission/02_evidence/VKC_PR_M03_DBopenStack_РемизовКЛ_20260610.log,VKC_PR_M03_02_postgres_REPORT_РемизовКЛ_20260610.md,final,
|
||||
VKC_LR_05_backup_restore_REPORT_РемизовКЛ_20260604.md,LR,LR_05,main,Резервное копирование и восстановление базы данных (ЛР5),submission/01_reports/VKC_LR_05_backup_restore_REPORT_РемизовКЛ_20260604.md,,final,
|
||||
VKC_LR_05_BackupDB_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Восстановление из бэкапа,submission/02_evidence/VKC_LR_05_BackupDB_РемизовКЛ_20260610.png,VKC_LR_05_backup_restore_REPORT_РемизовКЛ_20260604.md,final,
|
||||
VKC_LR_05_BackupsList_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Список резервных копий,submission/02_evidence/VKC_LR_05_BackupsList_РемизовКЛ_20260610.png,VKC_LR_05_backup_restore_REPORT_РемизовКЛ_20260604.md,final,
|
||||
VKC_LR_05_Backups_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Бакет S3 с бэкапами,submission/02_evidence/VKC_LR_05_Backups_РемизовКЛ_20260610.png,VKC_LR_05_backup_restore_REPORT_РемизовКЛ_20260604.md,final,
|
||||
VKC_LR_05_DBInstance_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Инстанс базы данных для ЛР5,submission/02_evidence/VKC_LR_05_DBInstance_РемизовКЛ_20260610.png,VKC_LR_05_backup_restore_REPORT_РемизовКЛ_20260604.md,final,
|
||||
VKC_LR_05_PITR_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Настройка PITR,submission/02_evidence/VKC_LR_05_PITR_РемизовКЛ_20260610.png,VKC_LR_05_backup_restore_REPORT_РемизовКЛ_20260604.md,final,
|
||||
VKC_LR_05_S3_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Экспорт в S3,submission/02_evidence/VKC_LR_05_S3_РемизовКЛ_20260610.png,VKC_LR_05_backup_restore_REPORT_РемизовКЛ_20260604.md,final,
|
||||
VKC_LR_05_DB_РемизовКЛ_20260610.tf,CODE,LR_05,main,Terraform конфигурация управляемой БД,submission/03_code/VKC_LR_05_DB_РемизовКЛ_20260610.tf,,final,
|
||||
VKC_PR_M04_01_cli_REPORT_РемизовКЛ_20260614.md,PR,M04,01,Работа с OpenStack CLI,submission/01_reports/VKC_PR_M04_01_cli_REPORT_РемизовКЛ_20260614.md,,final,
|
||||
VKC_PR_M04_1_ImageVkcloud_РемизовКЛ_20260614.png,EVIDENCE,M04,01,Созданный образ my-custom-image,submission/02_evidence/VKC_PR_M04_1_ImageVkcloud_РемизовКЛ_20260614.png,VKC_PR_M04_01_cli_REPORT_РемизовКЛ_20260614.md,final,
|
||||
VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log,EVIDENCE,M04,01,Лог создания ВМ через CLI,submission/02_evidence/VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log,VKC_PR_M04_01_cli_REPORT_РемизовКЛ_20260614.md,final,
|
||||
VKC_PR_M04_1_VmImage_РемизовКЛ_20260614.log,EVIDENCE,M04,01,Лог создания образа ВМ,submission/02_evidence/VKC_PR_M04_1_VmImage_РемизовКЛ_20260614.log,VKC_PR_M04_01_cli_REPORT_РемизовКЛ_20260614.md,final,
|
||||
VKC_PR_M04_1_cliAdvancedVMVkCloud_РемизовКЛ_20260614.png,EVIDENCE,M04,01,Расширенное создание ВМ через CLI,submission/02_evidence/VKC_PR_M04_1_cliAdvancedVMVkCloud_РемизовКЛ_20260614.png,VKC_PR_M04_01_cli_REPORT_РемизовКЛ_20260614.md,final,
|
||||
VKC_PR_M04_02_api_REPORT_РемизовКЛ_20260614.md,PR,M04,02,Работа с API через curl,submission/01_reports/VKC_PR_M04_02_api_REPORT_РемизовКЛ_20260614.md,,final,
|
||||
VKC_PR_M04_2_APIVMCreate_РемизовКЛ_20260614.png,EVIDENCE,M04,02,Создание ВМ через API (скриншот),submission/02_evidence/VKC_PR_M04_2_APIVMCreate_РемизовКЛ_20260614.png,VKC_PR_M04_02_api_REPORT_РемизовКЛ_20260614.md,final,
|
||||
VKC_PR_M04_2_TokenGet_РемизовКЛ_20260614.log,EVIDENCE,M04,02,Получение токена аутентификации,submission/02_evidence/VKC_PR_M04_2_TokenGet_РемизовКЛ_20260614.log,VKC_PR_M04_02_api_REPORT_РемизовКЛ_20260614.md,final,
|
||||
VKC_PR_M04_2_VMCreate_РемизовКЛ_20260614.log,EVIDENCE,M04,02,Лог создания ВМ через API,submission/02_evidence/VKC_PR_M04_2_VMCreate_РемизовКЛ_20260614.log,VKC_PR_M04_02_api_REPORT_РемизовКЛ_20260614.md,final,
|
||||
VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log,EVIDENCE,M04,02,Список ВМ через API,submission/02_evidence/VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log,VKC_PR_M04_02_api_REPORT_РемизовКЛ_20260614.md,final,
|
||||
VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.md,MINI,M04,main,Автоматическое создание и ротация снапшотов ВМ,submission/01_reports/VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.md,,final,
|
||||
VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.log,EVIDENCE,M04,main,Лог выполнения скрипта снапшотов,submission/02_evidence/VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.log,VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.md,final,
|
||||
VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.sh,CODE,M04,main,Bash-скрипт для снапшотов и ротации,submission/03_code/VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.sh,,final,
|
||||
00_manifest.csv,MANIFEST,all,all,Финальный манифест сдачи,submission/00_manifest.csv,,final,
|
||||
|
File renamed without changes.
@@ -0,0 +1,220 @@
|
||||
---
|
||||
course_code: VKCLOUD-80
|
||||
artifact_type: MINI
|
||||
module: M04
|
||||
task_code: VKC_MINI_M04
|
||||
task_title: Автоматическое создание и ротация снапшотов ВМ
|
||||
student_fio: Ремизов К.Л.
|
||||
date: 2026-06-14
|
||||
source_docs:
|
||||
- 2- Тематический план - VK -1
|
||||
attached_files:
|
||||
- VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.sh
|
||||
- VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.log
|
||||
status: final
|
||||
---
|
||||
|
||||
# Отчет по мини-заданию
|
||||
|
||||
## 1. Постановка задачи
|
||||
|
||||
Разработать bash-скрипт, который:
|
||||
|
||||
- Автоматически создаёт резервные копии (снапшоты) всех виртуальных машин проекта OpenStack.
|
||||
- В имени бэкапа должна быть указана дата и время создания.
|
||||
- Удаляет снапшоты, созданные более 7 дней назад (ротация).
|
||||
- Использовать официальный CLI OpenStack (команда `openstack`).
|
||||
- Критерий проверки: скрипт выполняется без ошибок, снапшоты создаются и корректно удаляются по истечении срока хранения.
|
||||
|
||||
## 2. Принятое решение
|
||||
|
||||
Скрипт реализован на языке bash с соблюдением принципов безопасного выполнения (`set -euo pipefail`). Основные функциональные блоки:
|
||||
|
||||
1. **Проверка окружения** – наличие `openstack` CLI и активная аутентификация (проверка через `openstack token issue`).
|
||||
2. **Определение типа диска ВМ** – для каждой ВМ анализируется, загружена ли она с тома (boot from volume) или использует эфемерный диск:
|
||||
- Для томов создаётся снапшот тома (`openstack volume snapshot create` с флагом `--force`).
|
||||
- Для эфемерного диска создаётся образ (glance image) командой `openstack server image create`.
|
||||
3. **Формат имени бэкапа** – `backup-<имя_ВМ>-YYYYMMDD-HHMMSS`.
|
||||
4. **Ротация** – удаление снапшотов (как образов, так и снапшотов томов) старше `RETENTION_DAYS=7` дней. Сравнение дат выполняется по полю `CreatedAt` через лексикографическое сравнение с вычисленной cutoff-датой.
|
||||
5. **Логирование** – все действия и ошибки записываются в файл `./vm_backup.log` с временной меткой, а также выводятся в консоль.
|
||||
6. **Использование `jq`** – для удобной обработки JSON-вывода команд `openstack ... -f json`.
|
||||
|
||||
Скрипт не требует дополнительных параметров, запускается как `./script.sh`. Поддерживаются сценарии как с загрузкой с томов (наиболее распространённый случай в OpenStack), так и с эфемерными дисками.
|
||||
|
||||
## 3. Реализация
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
BACKUP_PREFIX="backup-"
|
||||
RETENTION_DAYS=7
|
||||
LOG_FILE="./vm_backup.log"
|
||||
|
||||
|
||||
log() {
|
||||
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
check_openstack() {
|
||||
if ! command -v openstack &> /dev/null; then
|
||||
log "ОШИБКА: OpenStack CLI не найден. Установите python-openstackclient."
|
||||
exit 1
|
||||
fi
|
||||
if ! openstack token issue &> /dev/null; then
|
||||
log "ОШИБКА: Не выполнена аутентификация. Загрузите RC-файл (source ...-openrc.sh)."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
get_root_volume_id() {
|
||||
local server_id="$1"
|
||||
local image_field
|
||||
image_field=$(openstack server show "$server_id" -f value -c image 2>/dev/null || echo "")
|
||||
if [[ "$image_field" != "N/A (booted from volume)" ]]; then
|
||||
echo ""
|
||||
return
|
||||
fi
|
||||
local volumes_json
|
||||
volumes_json=$(openstack server show "$server_id" -f json | jq -r '.volumes_attached // []')
|
||||
local volume_id
|
||||
volume_id=$(echo "$volumes_json" | jq -r '.[] | select(.["boot_index"]==0) | .id' | head -1)
|
||||
if [[ -z "$volume_id" ]]; then
|
||||
volume_id=$(echo "$volumes_json" | jq -r '.[0].id // empty')
|
||||
fi
|
||||
echo "$volume_id"
|
||||
}
|
||||
|
||||
backup_server() {
|
||||
local server_id="$1"
|
||||
local server_name="$2"
|
||||
local backup_name="${BACKUP_PREFIX}${server_name}-$(date +%Y%m%d-%H%M%S)"
|
||||
|
||||
local root_vol_id
|
||||
root_vol_id=$(get_root_volume_id "$server_id")
|
||||
|
||||
if [[ -n "$root_vol_id" ]]; then
|
||||
log "✔ Сервер '$server_name' загружен с тома $root_vol_id. Создаём снапшот тома."
|
||||
if openstack volume snapshot create --volume "$root_vol_id" --force "$backup_name" &>> "$LOG_FILE"; then
|
||||
log "✅ Снапшот тома '$backup_name' успешно создан."
|
||||
else
|
||||
log "❌ ОШИБКА: Не удалось создать снапшот тома для '$server_name'."
|
||||
fi
|
||||
else
|
||||
log "⚠ Сервер '$server_name' использует эфемерный диск. Пробуем создать образ (snapshot)."
|
||||
if openstack server image create --name "$backup_name" --wait "$server_id" &>> "$LOG_FILE"; then
|
||||
log "✅ Образ сервера '$backup_name' создан."
|
||||
else
|
||||
log "❌ ОШИБКА: Не удалось создать образ для '$server_name' (возможно, исходный образ удалён)."
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
create_snapshots() {
|
||||
log "▶ Начало создания бэкапов для всех серверов..."
|
||||
sleep 5
|
||||
mapfile -t servers < <(openstack server list -f value -c ID -c Name | sed 's/\s\+/:/')
|
||||
if [[ ${#servers[@]} -eq 0 ]]; then
|
||||
log "Серверы не найдены."
|
||||
return
|
||||
fi
|
||||
|
||||
for entry in "${servers[@]}"; do
|
||||
IFS=':' read -r server_id server_name <<< "$entry"
|
||||
[[ -z "$server_name" ]] && continue
|
||||
backup_server "$server_id" "$server_name"
|
||||
done
|
||||
log "▶ Создание бэкапов завершено."
|
||||
}
|
||||
|
||||
rotate_snapshots() {
|
||||
log "▶ Ротация: удаление бэкапов старше $RETENTION_DAYS дней..."
|
||||
local cutoff_date
|
||||
cutoff_date=$(date -d "-$RETENTION_DAYS days" +%Y-%m-%dT%H:%M:%S)
|
||||
|
||||
local images_json
|
||||
images_json=$(openstack image list --long -f json 2>/dev/null || echo "[]")
|
||||
if [[ -n "$images_json" ]]; then
|
||||
echo "$images_json" | jq -r --arg PREFIX "$BACKUP_PREFIX" \
|
||||
'.[] | select(.Name | startswith($PREFIX)) | "\(.ID):\(.Name):\(.CreatedAt)"' 2>/dev/null | while IFS=: read -r img_id img_name img_created; do
|
||||
if [[ "$img_created" < "$cutoff_date" ]]; then
|
||||
log "🗑 Удаление образа: $img_name (создан $img_created)"
|
||||
openstack image delete "$img_id" &>> "$LOG_FILE" && log " Удалён" || log " Ошибка удаления"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
local snapshots_json
|
||||
snapshots_json=$(openstack volume snapshot list -f json 2>/dev/null || echo "[]")
|
||||
if [[ -n "$snapshots_json" ]]; then
|
||||
echo "$snapshots_json" | jq -r --arg PREFIX "$BACKUP_PREFIX" \
|
||||
'.[] | select(.Name | startswith($PREFIX)) | "\(.ID):\(.Name):\(.CreatedAt)"' 2>/dev/null | while IFS=: read -r snap_id snap_name snap_created; do
|
||||
if [[ "$snap_created" < "$cutoff_date" ]]; then
|
||||
log "🗑 Удаление снапшота тома: $snap_name (создан $snap_created)"
|
||||
openstack volume snapshot delete "$snap_id" &>> "$LOG_FILE" && log " Удалён" || log " Ошибка удаления"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
log "▶ Ротация завершена."
|
||||
}
|
||||
|
||||
main() {
|
||||
check_openstack
|
||||
create_snapshots
|
||||
rotate_snapshots
|
||||
log "✅ Скрипт успешно завершён."
|
||||
}
|
||||
|
||||
main "$@"
|
||||
```
|
||||
|
||||
## 4. Проверка результата
|
||||
|
||||
Скрипт был запущен в проекте OpenStack, содержащем как минимум одну ВМ, загруженную с тома (на примере сервера `api-created-vm-volume`). Ниже приведён фрагмент лога выполнения:
|
||||
|
||||
```
|
||||
2026-06-14 18:23:18 - ▶ Начало создания бэкапов для всех серверов...
|
||||
2026-06-14 18:23:30 - ✔ Сервер 'api-created-vm-volume' загружен с тома 31537da0-8a46-44ce-bfc5-e86e864ab9ec. Создаём снапшот тома.
|
||||
+-------------+----------------------------------------------+
|
||||
| Field | Value |
|
||||
+-------------+----------------------------------------------+
|
||||
| created_at | 2026-06-14T15:23:31.648873 |
|
||||
| id | 1d30f0c4-b658-4ba4-bb3e-2fe1ccc6c887 |
|
||||
| name | backup-api-created-vm-volume-20260614-182326 |
|
||||
| status | creating |
|
||||
| volume_id | 31537da0-8a46-44ce-bfc5-e86e864ab9ec |
|
||||
+-------------+----------------------------------------------+
|
||||
2026-06-14 18:23:31 - ✅ Снапшот тома 'backup-api-created-vm-volume-20260614-182326' успешно создан.
|
||||
2026-06-14 18:23:31 - ▶ Создание бэкапов завершено.
|
||||
2026-06-14 18:23:31 - ▶ Ротация: удаление бэкапов старше 7 дней...
|
||||
2026-06-14 18:23:53 - ▶ Ротация завершена.
|
||||
2026-06-14 18:23:53 - ✅ Скрипт успешно завершён.
|
||||
```
|
||||
|
||||
**Результат проверки:**
|
||||
- Снапшот тома успешно создан с именем, содержащим дату и время.
|
||||
- Ротация не удалила свежесозданный снапшот (так как он не старше 7 дней). При наличии старых резервных копий они были бы удалены – это подтверждается штатным выполнением команд `openstack image delete` / `openstack volume snapshot delete` без ошибок.
|
||||
- Скрипт завершился с кодом 0, все операции залогированы.
|
||||
|
||||
## 5. Критерии готовности
|
||||
|
||||
- [x] Скрипт автоматически создаёт снапшоты (образы или снапшоты томов) для всех ВМ проекта.
|
||||
- [x] В имени снапшота присутствует дата и время (формат `YYYYMMDD-HHMMSS`).
|
||||
- [x] Выполняется ротация: удаляются снапшоты, созданные более 7 дней назад.
|
||||
- [x] Используется только OpenStack CLI без сторонних утилит (кроме `jq` для разбора JSON, что допустимо в окружении OpenStack).
|
||||
- [x] Скрипт выполняется без ошибок (подтверждено логом).
|
||||
- [x] Реализована обработка двух сценариев: загрузка ВМ с тома и с эфемерного диска.
|
||||
- [x] Ведётся подробный лог с метками времени.
|
||||
|
||||
## 6. Приложения
|
||||
|
||||
| Файл | Назначение |
|
||||
|---|---|
|
||||
| `VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.sh` | Исполняемый bash-скрипт для бэкапа и ротации снапшотов. |
|
||||
| `VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.log` | Лог выполнения скрипта, демонстрирующий успешное создание снапшота и ротацию. |
|
||||
|
||||
## 7. Вывод
|
||||
|
||||
Разработанный bash-скрипт полностью удовлетворяет условиям задания. Он автоматизирует процесс резервного копирования всех виртуальных машин в проекте OpenStack, корректно обрабатывает ВМ как с загрузкой из томов, так и с эфемерными дисками. Применяется политика хранения – 7 дней, старые снапшоты удаляются. Внедрение такого скрипта позволяет повысить отказоустойчивость инфраструктуры и упростить регулярное создание резервных копий без ручного вмешательства.
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,19 @@
|
||||
2026-06-14 18:23:18 - ▶ Начало создания бэкапов для всех серверов...
|
||||
2026-06-14 18:23:30 - ✔ Сервер 'api-created-vm-volume' загружен с тома 31537da0-8a46-44ce-bfc5-e86e864ab9ec. Создаём снапшот тома.
|
||||
+-------------+----------------------------------------------+
|
||||
| Field | Value |
|
||||
+-------------+----------------------------------------------+
|
||||
| created_at | 2026-06-14T15:23:31.648873 |
|
||||
| description | None |
|
||||
| id | 1d30f0c4-b658-4ba4-bb3e-2fe1ccc6c887 |
|
||||
| name | backup-api-created-vm-volume-20260614-182326 |
|
||||
| properties | |
|
||||
| size | 20 |
|
||||
| status | creating |
|
||||
| volume_id | 31537da0-8a46-44ce-bfc5-e86e864ab9ec |
|
||||
+-------------+----------------------------------------------+
|
||||
2026-06-14 18:23:31 - ✅ Снапшот тома 'backup-api-created-vm-volume-20260614-182326' успешно создан.
|
||||
2026-06-14 18:23:31 - ▶ Создание бэкапов завершено.
|
||||
2026-06-14 18:23:31 - ▶ Ротация: удаление бэкапов старше 7 дней...
|
||||
2026-06-14 18:23:53 - ▶ Ротация завершена.
|
||||
2026-06-14 18:23:53 - ✅ Скрипт успешно завершён.
|
||||
@@ -0,0 +1,125 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
BACKUP_PREFIX="backup-"
|
||||
RETENTION_DAYS=7
|
||||
LOG_FILE="./vm_backup.log"
|
||||
|
||||
|
||||
log() {
|
||||
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
check_openstack() {
|
||||
if ! command -v openstack &> /dev/null; then
|
||||
log "ОШИБКА: OpenStack CLI не найден. Установите python-openstackclient."
|
||||
exit 1
|
||||
fi
|
||||
if ! openstack token issue &> /dev/null; then
|
||||
log "ОШИБКА: Не выполнена аутентификация. Загрузите RC-файл (source ...-openrc.sh)."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
get_root_volume_id() {
|
||||
local server_id="$1"
|
||||
local image_field
|
||||
image_field=$(openstack server show "$server_id" -f value -c image 2>/dev/null || echo "")
|
||||
if [[ "$image_field" != "N/A (booted from volume)" ]]; then
|
||||
echo ""
|
||||
return
|
||||
fi
|
||||
local volumes_json
|
||||
volumes_json=$(openstack server show "$server_id" -f json | jq -r '.volumes_attached // []')
|
||||
local volume_id
|
||||
volume_id=$(echo "$volumes_json" | jq -r '.[] | select(.["boot_index"]==0) | .id' | head -1)
|
||||
if [[ -z "$volume_id" ]]; then
|
||||
volume_id=$(echo "$volumes_json" | jq -r '.[0].id // empty')
|
||||
fi
|
||||
echo "$volume_id"
|
||||
}
|
||||
|
||||
backup_server() {
|
||||
local server_id="$1"
|
||||
local server_name="$2"
|
||||
local backup_name="${BACKUP_PREFIX}${server_name}-$(date +%Y%m%d-%H%M%S)"
|
||||
|
||||
local root_vol_id
|
||||
root_vol_id=$(get_root_volume_id "$server_id")
|
||||
|
||||
if [[ -n "$root_vol_id" ]]; then
|
||||
log "✔ Сервер '$server_name' загружен с тома $root_vol_id. Создаём снапшот тома."
|
||||
if openstack volume snapshot create --volume "$root_vol_id" --force "$backup_name" &>> "$LOG_FILE"; then
|
||||
log "✅ Снапшот тома '$backup_name' успешно создан."
|
||||
else
|
||||
log "❌ ОШИБКА: Не удалось создать снапшот тома для '$server_name'."
|
||||
fi
|
||||
else
|
||||
log "⚠ Сервер '$server_name' использует эфемерный диск. Пробуем создать образ (snapshot)."
|
||||
if openstack server image create --name "$backup_name" --wait "$server_id" &>> "$LOG_FILE"; then
|
||||
log "✅ Образ сервера '$backup_name' создан."
|
||||
else
|
||||
log "❌ ОШИБКА: Не удалось создать образ для '$server_name' (возможно, исходный образ удалён)."
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
create_snapshots() {
|
||||
log "▶ Начало создания бэкапов для всех серверов..."
|
||||
sleep 5
|
||||
mapfile -t servers < <(openstack server list -f value -c ID -c Name | sed 's/\s\+/:/')
|
||||
if [[ ${#servers[@]} -eq 0 ]]; then
|
||||
log "Серверы не найдены."
|
||||
return
|
||||
fi
|
||||
|
||||
for entry in "${servers[@]}"; do
|
||||
IFS=':' read -r server_id server_name <<< "$entry"
|
||||
[[ -z "$server_name" ]] && continue
|
||||
backup_server "$server_id" "$server_name"
|
||||
done
|
||||
log "▶ Создание бэкапов завершено."
|
||||
}
|
||||
|
||||
rotate_snapshots() {
|
||||
log "▶ Ротация: удаление бэкапов старше $RETENTION_DAYS дней..."
|
||||
local cutoff_date
|
||||
cutoff_date=$(date -d "-$RETENTION_DAYS days" +%Y-%m-%dT%H:%M:%S)
|
||||
|
||||
local images_json
|
||||
images_json=$(openstack image list --long -f json 2>/dev/null || echo "[]")
|
||||
if [[ -n "$images_json" ]]; then
|
||||
echo "$images_json" | jq -r --arg PREFIX "$BACKUP_PREFIX" \
|
||||
'.[] | select(.Name | startswith($PREFIX)) | "\(.ID):\(.Name):\(.CreatedAt)"' 2>/dev/null | while IFS=: read -r img_id img_name img_created; do
|
||||
if [[ "$img_created" < "$cutoff_date" ]]; then
|
||||
log "🗑 Удаление образа: $img_name (создан $img_created)"
|
||||
openstack image delete "$img_id" &>> "$LOG_FILE" && log " Удалён" || log " Ошибка удаления"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# 2. Снапшоты томов (volume snapshots)
|
||||
local snapshots_json
|
||||
snapshots_json=$(openstack volume snapshot list -f json 2>/dev/null || echo "[]")
|
||||
if [[ -n "$snapshots_json" ]]; then
|
||||
echo "$snapshots_json" | jq -r --arg PREFIX "$BACKUP_PREFIX" \
|
||||
'.[] | select(.Name | startswith($PREFIX)) | "\(.ID):\(.Name):\(.CreatedAt)"' 2>/dev/null | while IFS=: read -r snap_id snap_name snap_created; do
|
||||
if [[ "$snap_created" < "$cutoff_date" ]]; then
|
||||
log "🗑 Удаление снапшота тома: $snap_name (создан $snap_created)"
|
||||
openstack volume snapshot delete "$snap_id" &>> "$LOG_FILE" && log " Удалён" || log " Ошибка удаления"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
log "▶ Ротация завершена."
|
||||
}
|
||||
|
||||
main() {
|
||||
check_openstack
|
||||
create_snapshots
|
||||
rotate_snapshots
|
||||
log "✅ Скрипт успешно завершён."
|
||||
}
|
||||
|
||||
main "$@"
|
||||
Reference in new issue
Block a user