diff --git a/README.md b/README.md deleted file mode 100644 index e85aa11..0000000 --- a/README.md +++ /dev/null @@ -1,57 +0,0 @@ -# CloudPractice -Практическое задание для студентов SPBSTU. Работа с terraform и облаком selectel - -В данной практике необходимо создать инфраструктуру в проекте Selectel с помощью terraform и сконфигурировать веб-сервисы с помощью ansible -![img.png](assets/schema.png) - -В качестве конечного приложения можно выбрать либо [2 лабу](https://github.com/antonaleks/DockerPractice) либо контейнер с todo и БД из [docker tutorial](https://www.docker.com/101-tutorial/) - -В первом случаем необходимо создать n=3 виртуальные машины в том же принципе (две разные подсети, одна виртуальная машина как шлюз) - -Во втором случае проще - нужно создать n=2 виртуальные машины, одну для todo app, другую для mysql DB -## Terraform -1. В провайдере openstack заполнить своими данными поля из excel таблицы -- domain_name = -- tenant_id = -- user_name = <логин из экселя> -- password = "пароль из экселя" -- region = "ru-7" -2. Необходимо развернуть n количество ВМ с атрибутом прерываемый -2. Развернуть необходимые подсети -3. Создать публичный ssh ключ и приатачить к ВМ -4. Создать загружаемый диск с ubuntu 22.04 -5. Создать flavor 1CPU 2 gb RAM, Диск объем 10гб на каждую вм (базовый hdd) -6. Для каждой ВМ зафиксировать публичный ip адрес -7. В output зафиксировать вывод ip адрес и команду ssh для полключения -8. Создать файл inventory.ini для ansible, где описаны айпи адреса созданных ВМ - -В качестве примеров использовать [vpc-example](vpc-example), заменив на прерываемую ВМ либо [preempible_sever](preemptible_server) с модулями - -## Ansible -1. Использовать сгенерированный terraform'ом inventory файл -2. Написать плейбуки для развертывания ваших приложений в docker-compose файлах. [Пример](https://github.com/antonaleks/ya-praktikum-infra/tree/main/ansible) - -## Итог -В итоге по запуску команд -```bash -terraform apply -``` -должна сгенерироваться инфраструктура и inventory.ini - -по запуску команд -```bash -ansible-playbook your-playbook.yml -``` -должно установиться ваше приложение на инфрастуктуру автоматически. Критерием выполнения задания является доступность веб интерфейса в публичном ip адресе (grafana в 1 случае и todo-app во втором) - -## Раздел по безопасности -Ни в коем случае нельзя хранить в репозитории чувствительные данные! Работа не принимается, если в репозитории будут лежать логины, пароли от ВМ! - -# Источники -- ресурсы опенстека в [terraform registry](https://terraform-eap.website.yandexcloud.net/docs/providers/openstack/index.html) -- откуда брать id проекта -![img.png](assets/id_project.png) -- установка terraform через зеркало [яндекса](https://cloud.yandex.ru/docs/tutorials/infrastructure-management/terraform-quickstart) -- документация [selectel](https://docs.selectel.ru/cloud/servers/tools/terraform/) -- [примеры selectel](https://github.com/selectel/terraform-examples) (terraform selectel provider использовать не нужно, только openstack) -- пример связки [terraform+ansible](https://github.com/antonaleks/ya-praktikum-infra). смотреть папку [terraform](https://github.com/antonaleks/ya-praktikum-infra/blob/main/terraform/sausage-store/main.tf) и [ansible](https://github.com/antonaleks/ya-praktikum-infra/tree/main/ansible) diff --git a/assets/id_project.png b/assets/id_project.png deleted file mode 100644 index 964089d..0000000 Binary files a/assets/id_project.png and /dev/null differ diff --git a/assets/schema.png b/assets/schema.png deleted file mode 100644 index ab32fa8..0000000 Binary files a/assets/schema.png and /dev/null differ diff --git a/my-report/docs/images/comp.png b/my-report/docs/images/comp.png new file mode 100644 index 0000000..4b1a5c9 Binary files /dev/null and b/my-report/docs/images/comp.png differ diff --git a/my-report/docs/images/comp2.png b/my-report/docs/images/comp2.png new file mode 100644 index 0000000..3ce4d41 Binary files /dev/null and b/my-report/docs/images/comp2.png differ diff --git a/my-report/docs/images/finished work.png b/my-report/docs/images/finished work.png new file mode 100644 index 0000000..bd9b39b Binary files /dev/null and b/my-report/docs/images/finished work.png differ diff --git a/my-report/docs/images/playbook.png b/my-report/docs/images/playbook.png new file mode 100644 index 0000000..3aceeb5 Binary files /dev/null and b/my-report/docs/images/playbook.png differ diff --git a/my-report/docs/images/playbookfinished.png b/my-report/docs/images/playbookfinished.png new file mode 100644 index 0000000..15ee9f5 Binary files /dev/null and b/my-report/docs/images/playbookfinished.png differ diff --git a/my-report/docs/images/servers.png b/my-report/docs/images/servers.png new file mode 100644 index 0000000..b87ce7e Binary files /dev/null and b/my-report/docs/images/servers.png differ diff --git a/my-report/docs/images/terraforminit.png b/my-report/docs/images/terraforminit.png new file mode 100644 index 0000000..9cfaaa3 Binary files /dev/null and b/my-report/docs/images/terraforminit.png differ diff --git a/my-report/docs/images/terraformplan.png b/my-report/docs/images/terraformplan.png new file mode 100644 index 0000000..3f54e14 Binary files /dev/null and b/my-report/docs/images/terraformplan.png differ diff --git a/my-report/docs/index.md b/my-report/docs/index.md new file mode 100644 index 0000000..2ebefd4 --- /dev/null +++ b/my-report/docs/index.md @@ -0,0 +1,129 @@ +# Жижилева Арина. Практическое задание работа с terraform и облаком selectel. + +В данной практике необходимо создать инфраструктуру в проекте Selectel с помощью terraform и сконфигурировать веб-сервисы с помощью ansible +Нужно создать n=2 виртуальные машины, одну для todo app, другую для mysql DB. + +1. Необходимо развернуть n количество ВМ с атрибутом прерываемый +2. Развернуть необходимые подсети +3. Создать публичный ssh ключ и приатачить к ВМ +4. Создать загружаемый диск с ubuntu 22.04 +5. Создать flavor 1CPU 2 gb RAM, Диск объем 10гб на каждую вм (базовый hdd) +6. Для каждой ВМ зафиксировать публичный ip адрес +7. В output зафиксировать вывод ip адрес и команду ssh для полключения +8. Создать файл inventory.ini для ansible, где описаны айпи адреса созданных ВМ + +## Terraform + +Создала файл main.tf с подключением к openstack, созданием ssh ключей, подключением сетей и созданием серверов. В этом файле также задаются публичные ip-адреса для машин и создается вывод информации о ресурсах. + +**код из файла main.tf:** +```json +provider "openstack" { + auth_url = "https://cloud.api.selcloud.ru/identity/v3" + domain_name = var.domain_name + tenant_id = var.tenant_id + user_name = var.user_name + password = var.password + region = var.region +} + +# 1. SSH-ключ +module "keypair" { + source = "./modules/keypair" + keypair_name = "tf_keypair" + keypair_public_key = file("~/.ssh/id_rsa.pub") + region = var.region +} + +# 2. Сеть и подсеть +module "nat" { + source = "./modules/nat" +} + +# 3. Серверы +module "preemptible_server" { + count = 2 + source = "./modules/server_remote_root_disk" + + server_name = var.server_name + server_zone = var.server_zone + server_vcpus = var.server_vcpus + server_ram_mb = var.server_ram_mb + server_root_disk_gb = var.server_root_disk_gb + server_volume_type = var.server_volume_type + server_image_name = var.server_image_name + server_ssh_key = module.keypair.keypair_name + region = var.region + network_id = module.nat.network_id + subnet_id = module.nat.subnet_id + + server_preemptible_tag = var.server_preemptible_tag +} + + +# 4. Публичные IP-адреса +resource "openstack_networking_floatingip_v2" "todo_fip" { + pool = "external-network" +} + +resource "openstack_networking_floatingip_v2" "mysql_fip" { + pool = "external-network" +} + +# Привязка IP к серверам +resource "openstack_compute_floatingip_associate_v2" "todo_fip_associate" { + floating_ip = openstack_networking_floatingip_v2.todo_fip.address + instance_id = module.preemptible_server[0].server_id + depends_on = [openstack_networking_floatingip_v2.todo_fip] # Ensure floating IP is created before association +} + +resource "openstack_compute_floatingip_associate_v2" "mysql_fip_associate" { + floating_ip = openstack_networking_floatingip_v2.mysql_fip.address + instance_id = module.preemptible_server[1].server_id + depends_on = [openstack_networking_floatingip_v2.mysql_fip] # Ensure floating IP is created before association +} + +# 5. Вывод информации о ресурсах +output "todo_app_ip" { + value = openstack_networking_floatingip_v2.todo_fip.address +} + +output "mysql_db_ip" { + value = openstack_networking_floatingip_v2.mysql_fip.address +} + +# Создание inventory файла для ansible +resource "local_file" "ansible_inventory" { + content = templatefile("./resources/inventory.tmpl", + { + webapp_vm_ip_public = module.preemptible_server.0.floating_ip, + database_vm_ip_public = module.preemptible_server.1.floating_ip, + webapp_vm_ip_nat = module.preemptible_server.1.nat_ip.0 + } + ) + filename = "../ansible/inventory.ini" +} +``` +Ни в коем случае нельзя хранить в репозитории чувствительные данные, поэтому они занесены в отдельный файл terraform.tfvars, который добавлен в gitignore. + +**Применяю команду terraform init** +![Работа terraform init](images/terraforminit.png) + +**Применяю команду terraform plan и затем terraform apply** +![Работа terraform plan](images/terraformplan.png) + +После этого развернулось 2 машины с атрибутом прерываемый и файл inventory.tmpl +![2 вм](images/servers.png) + +Загружаемый диск с ubuntu 22.04, 1CPU 2 gb RAM, Диск объем 10гб на каждую вм +![параметры вм](images/comp.png) +![параметры вм](images/comp2.png) + +## Ansible + +Запускаю playbook командой ansible-playbook -i inventory.ini playbook.yml + +![Playbook](images/playbookfinished.png) + +Теперь наше приложение доступно по публичному ip-адресу +![параметры вм](images/finished work.png) \ No newline at end of file diff --git a/my-report/mkdocs.yml b/my-report/mkdocs.yml new file mode 100644 index 0000000..5371b3a --- /dev/null +++ b/my-report/mkdocs.yml @@ -0,0 +1,5 @@ +site_name: 'Жижилева Арина. Практическое задание работа с terraform и облаком selectel.' +theme: + name: 'material' +nav: + - Ход работы: index.md diff --git a/preemptible_server/README.RU.md b/preemptible_server/README.RU.md deleted file mode 100644 index 7f578f5..0000000 --- a/preemptible_server/README.RU.md +++ /dev/null @@ -1,26 +0,0 @@ -# Пример создания прерываемого сервера с сетевым загрузочным диском - -Используется два terraform провайдера: -- Selectel - для создания проекта, пользователя и роли. -- Openstack - для создания сервера с сетевым загрузочным диском. - -## Внимание! -Создание прерываемого сервера доступно только в ru-7a -При использовании этого примера в других регионах будут созданы обычные сервера. - -## Для создания прерываемого сервера используйте переменную server_preemptible_tag -server_preemptible_tag = var.server_preemptible_tag - -## Для смены прерываемого сервера на обычный используйте переменную server_no_preemptible_tag -server_preemptible_tag = var.server_no_preemptible_tag - -## Пример запуска используя переменные окружения - -```sh -terraform init - -env \ - TF_VAR_sel_token=yyy_xxx \ - TF_VAR_user_password=secret \ - terraform apply -``` diff --git a/preemptible_server/main.tf b/preemptible_server/main.tf deleted file mode 100644 index d50bcdc..0000000 --- a/preemptible_server/main.tf +++ /dev/null @@ -1,48 +0,0 @@ -# Создание ключевой пары для доступа к ВМ -module "keypair" { - source = "./modules/keypair" - keypair_name = "keypair-tf" - keypair_public_key = file("~/.ssh/id_rsa.pub") - region = var.region -} - -# Создание приватной сети для ВМ -module "nat" { - source = "./modules/nat" -} - -# Создание прерываемого сервера. -module "preemptible_server" { - count = 2 - source = "./modules/server_remote_root_disk" - - server_name = var.server_name - server_zone = var.server_zone - server_vcpus = var.server_vcpus - server_ram_mb = var.server_ram_mb - server_root_disk_gb = var.server_root_disk_gb - server_volume_type = var.server_volume_type - server_image_name = var.server_image_name - server_ssh_key = module.keypair.keypair_name - region = var.region - network_id = module.nat.network_id - subnet_id = module.nat.subnet_id - - # Для смены прерываемого сервера на обычный используйте - # переменную server_no_preemptible_tag: - # server_preemptible_tag = var.server_no_preemptible_tag - server_preemptible_tag = var.server_preemptible_tag - # server_ssh_key_user = "" -} - -# Создание inventory файла для ansible -resource "local_file" "ansible_inventory" { - content = templatefile("./resources/inventory.tmpl", - { - webapp_vm_ip_public = module.preemptible_server.0.floating_ip, - database_vm_ip_public = module.preemptible_server.1.floating_ip, - webapp_vm_ip_nat = module.preemptible_server.1.nat_ip.0 - } - ) - filename = "../ansible/inventory.ini" -} \ No newline at end of file diff --git a/preemptible_server/provider.tf b/preemptible_server/provider.tf deleted file mode 100644 index d9597ab..0000000 --- a/preemptible_server/provider.tf +++ /dev/null @@ -1,9 +0,0 @@ -# Инициализация провайдера OpenStack -provider "openstack" { - auth_url = "https://api.selvpc.ru/identity/v3" - domain_name = var.domain_name - tenant_id = var.tenant_id - user_name = var.user_name - password = var.password - region = var.region -} \ No newline at end of file diff --git a/preemptible_server/vars.tf b/preemptible_server/vars.tf deleted file mode 100644 index 16840e5..0000000 --- a/preemptible_server/vars.tf +++ /dev/null @@ -1,73 +0,0 @@ -variable "keypair_name" { - default = "tf_keypair" -} - -variable "os_auth_url" { - default = "https://api.selvpc.ru/identity/v3" -} - -variable "server_name" { - default = "tf_server" -} - -variable "server_vcpus" { - default = 1 -} - -variable "server_ram_mb" { - default = 1024 -} - -variable "server_root_disk_gb" { - default = 5 -} - -variable "region" { - default = "ru-7" -} - -variable "server_volume_type" { - default = "basic.ru-7a" -} - -variable "server_image_name" { - default = "Ubuntu 22.04 LTS 64-bit" -} - -variable "server_preemptible_tag" { - default = ["preemptible"] -} - -variable "server_no_preemptible_tag" { - default = [] -} - -### ATTENTION!!! Do not edit this block, please. -variable "server_zone" { - type = string - description = "The name of the Selectel's pool." - - default = "ru-7a" - - validation { - condition = can(regex("ru-7a", var.server_zone)) - error_message = "Preemtible servers are available in ru-7a pool only." - } -} - -# Sensitive block -variable "domain_name" { - sensitive = true -} - -variable "tenant_id" { - sensitive = true -} - -variable "user_name" { - sensitive = true -} - -variable "password" { - sensitive = true -} \ No newline at end of file diff --git a/preemptible_server/versions.tf b/preemptible_server/versions.tf deleted file mode 100644 index b184cf6..0000000 --- a/preemptible_server/versions.tf +++ /dev/null @@ -1,18 +0,0 @@ -# Инициализация Terraform и хранения Terraform State -terraform { - required_version = ">= 0.14.0" - required_providers { - openstack = { - source = "terraform-provider-openstack/openstack" - version = "~> 1.49.0" - } - } - backend "s3" { - bucket = "/students" - endpoint = "s3.storage.selcloud.ru" - key = "thirdtask.tfstate" - region = "ru-1" - skip_region_validation = true - skip_credentials_validation = true - } -} \ No newline at end of file diff --git a/simple-example/main.tf b/simple-example/main.tf deleted file mode 100644 index 047dbc4..0000000 --- a/simple-example/main.tf +++ /dev/null @@ -1,47 +0,0 @@ -# Инициализация Terraform и хранения Terraform State -terraform { -required_version = ">= 0.14.0" - required_providers { - openstack = { - source = "terraform-provider-openstack/openstack" - version = "~> 1.49.0" - } - } -} - -# Инициализация провайдера OpenStack -provider "openstack" { - auth_url = "https://api.selvpc.ru/identity/v3" - domain_name = "" - tenant_id = "" - user_name = "" - password = "" - region = "ru-3" -} - -# Создание сети -resource "openstack_networking_network_v2" "network_tf" { - name = "network_tf" -} - -# Создание подсети -resource "openstack_networking_subnet_v2" "subnet_tf" { - name = "network_tf" - network_id = openstack_networking_network_v2.network_tf.id - cidr = "10.0.0.0/24" -} - - -# Создание сетевых портов -resource "openstack_networking_port_v2" "private_port" { - name = "test-eth0" - network_id = openstack_networking_network_v2.network_tf.id - fixed_ip { - ip_address = "10.0.0.10" - subnet_id = openstack_networking_subnet_v2.subnet_tf.id - } -} - -output "tf_output" { - value = openstack_networking_network_v2.network_tf.id -} \ No newline at end of file diff --git a/terraform_project/main.tf b/terraform_project/main.tf new file mode 100644 index 0000000..17c38d6 --- /dev/null +++ b/terraform_project/main.tf @@ -0,0 +1,85 @@ +provider "openstack" { + auth_url = "https://cloud.api.selcloud.ru/identity/v3" + domain_name = var.domain_name + tenant_id = var.tenant_id + user_name = var.user_name + password = var.password + region = var.region +} + +# 1. SSH-ключ +module "keypair" { + source = "./modules/keypair" + keypair_name = "keypair-tf" + keypair_public_key = file("~/.ssh/id_rsa.pub") + region = var.region +} + +# 2. Сеть и подсеть +module "nat" { + source = "./modules/nat" +} + +# 3. Серверы +module "preemptible_server" { + count = 2 + source = "./modules/server_remote_root_disk" + + server_name = var.server_name + server_zone = var.server_zone + server_vcpus = var.server_vcpus + server_ram_mb = var.server_ram_mb + server_root_disk_gb = var.server_root_disk_gb + server_volume_type = var.server_volume_type + server_image_name = var.server_image_name + server_ssh_key = module.keypair.keypair_name + region = var.region + network_id = module.nat.network_id + subnet_id = module.nat.subnet_id + + server_preemptible_tag = var.server_preemptible_tag +} + + +# 4. Публичные IP-адреса +resource "openstack_networking_floatingip_v2" "todo_fip" { + pool = "external-network" +} + +resource "openstack_networking_floatingip_v2" "mysql_fip" { + pool = "external-network" +} + +# Привязка IP к серверам +resource "openstack_compute_floatingip_associate_v2" "todo_fip_associate" { + floating_ip = openstack_networking_floatingip_v2.todo_fip.address + instance_id = module.preemptible_server[0].server_id + depends_on = [openstack_networking_floatingip_v2.todo_fip] # Ensure floating IP is created before association +} + +resource "openstack_compute_floatingip_associate_v2" "mysql_fip_associate" { + floating_ip = openstack_networking_floatingip_v2.mysql_fip.address + instance_id = module.preemptible_server[1].server_id + depends_on = [openstack_networking_floatingip_v2.mysql_fip] # Ensure floating IP is created before association +} + +# 5. Вывод информации о ресурсах +output "todo_app_ip" { + value = openstack_networking_floatingip_v2.todo_fip.address +} + +output "mysql_db_ip" { + value = openstack_networking_floatingip_v2.mysql_fip.address +} + +# Создание inventory файла для ansible +resource "local_file" "ansible_inventory" { + content = templatefile("./resources/inventory.tmpl", + { + webapp_vm_ip_public = module.preemptible_server.0.floating_ip, + database_vm_ip_public = module.preemptible_server.1.floating_ip, + webapp_vm_ip_nat = module.preemptible_server.1.nat_ip.0 + } + ) + filename = "../ansible/inventory.ini" +} \ No newline at end of file diff --git a/preemptible_server/modules/flavor/README.md b/terraform_project/modules/flavor/README.md similarity index 100% rename from preemptible_server/modules/flavor/README.md rename to terraform_project/modules/flavor/README.md diff --git a/preemptible_server/modules/flavor/main.tf b/terraform_project/modules/flavor/main.tf similarity index 100% rename from preemptible_server/modules/flavor/main.tf rename to terraform_project/modules/flavor/main.tf diff --git a/preemptible_server/modules/flavor/outputs.tf b/terraform_project/modules/flavor/outputs.tf similarity index 100% rename from preemptible_server/modules/flavor/outputs.tf rename to terraform_project/modules/flavor/outputs.tf diff --git a/preemptible_server/modules/flavor/vars.tf b/terraform_project/modules/flavor/vars.tf similarity index 100% rename from preemptible_server/modules/flavor/vars.tf rename to terraform_project/modules/flavor/vars.tf diff --git a/preemptible_server/modules/flavor/versions.tf b/terraform_project/modules/flavor/versions.tf similarity index 100% rename from preemptible_server/modules/flavor/versions.tf rename to terraform_project/modules/flavor/versions.tf diff --git a/preemptible_server/modules/floatingip/README.md b/terraform_project/modules/floatingip/README.md similarity index 100% rename from preemptible_server/modules/floatingip/README.md rename to terraform_project/modules/floatingip/README.md diff --git a/preemptible_server/modules/floatingip/main.tf b/terraform_project/modules/floatingip/main.tf similarity index 100% rename from preemptible_server/modules/floatingip/main.tf rename to terraform_project/modules/floatingip/main.tf diff --git a/preemptible_server/modules/floatingip/outputs.tf b/terraform_project/modules/floatingip/outputs.tf similarity index 100% rename from preemptible_server/modules/floatingip/outputs.tf rename to terraform_project/modules/floatingip/outputs.tf diff --git a/preemptible_server/modules/floatingip/versions.tf b/terraform_project/modules/floatingip/versions.tf similarity index 100% rename from preemptible_server/modules/floatingip/versions.tf rename to terraform_project/modules/floatingip/versions.tf diff --git a/preemptible_server/modules/image_datasource/README.md b/terraform_project/modules/image_datasource/README.md similarity index 100% rename from preemptible_server/modules/image_datasource/README.md rename to terraform_project/modules/image_datasource/README.md diff --git a/preemptible_server/modules/image_datasource/main.tf b/terraform_project/modules/image_datasource/main.tf similarity index 100% rename from preemptible_server/modules/image_datasource/main.tf rename to terraform_project/modules/image_datasource/main.tf diff --git a/preemptible_server/modules/image_datasource/outputs.tf b/terraform_project/modules/image_datasource/outputs.tf similarity index 100% rename from preemptible_server/modules/image_datasource/outputs.tf rename to terraform_project/modules/image_datasource/outputs.tf diff --git a/preemptible_server/modules/image_datasource/vars.tf b/terraform_project/modules/image_datasource/vars.tf similarity index 100% rename from preemptible_server/modules/image_datasource/vars.tf rename to terraform_project/modules/image_datasource/vars.tf diff --git a/preemptible_server/modules/image_datasource/versions.tf b/terraform_project/modules/image_datasource/versions.tf similarity index 100% rename from preemptible_server/modules/image_datasource/versions.tf rename to terraform_project/modules/image_datasource/versions.tf diff --git a/preemptible_server/modules/keypair/README.md b/terraform_project/modules/keypair/README.md similarity index 100% rename from preemptible_server/modules/keypair/README.md rename to terraform_project/modules/keypair/README.md diff --git a/preemptible_server/modules/keypair/main.tf b/terraform_project/modules/keypair/main.tf similarity index 100% rename from preemptible_server/modules/keypair/main.tf rename to terraform_project/modules/keypair/main.tf diff --git a/preemptible_server/modules/keypair/outputs.tf b/terraform_project/modules/keypair/outputs.tf similarity index 100% rename from preemptible_server/modules/keypair/outputs.tf rename to terraform_project/modules/keypair/outputs.tf diff --git a/preemptible_server/modules/keypair/vars.tf b/terraform_project/modules/keypair/vars.tf similarity index 100% rename from preemptible_server/modules/keypair/vars.tf rename to terraform_project/modules/keypair/vars.tf diff --git a/preemptible_server/modules/keypair/versions.tf b/terraform_project/modules/keypair/versions.tf similarity index 100% rename from preemptible_server/modules/keypair/versions.tf rename to terraform_project/modules/keypair/versions.tf diff --git a/preemptible_server/modules/nat/README.md b/terraform_project/modules/nat/README.md similarity index 100% rename from preemptible_server/modules/nat/README.md rename to terraform_project/modules/nat/README.md diff --git a/preemptible_server/modules/nat/main.tf b/terraform_project/modules/nat/main.tf similarity index 100% rename from preemptible_server/modules/nat/main.tf rename to terraform_project/modules/nat/main.tf diff --git a/preemptible_server/modules/nat/outputs.tf b/terraform_project/modules/nat/outputs.tf similarity index 100% rename from preemptible_server/modules/nat/outputs.tf rename to terraform_project/modules/nat/outputs.tf diff --git a/preemptible_server/modules/nat/vars.tf b/terraform_project/modules/nat/vars.tf similarity index 100% rename from preemptible_server/modules/nat/vars.tf rename to terraform_project/modules/nat/vars.tf diff --git a/preemptible_server/modules/nat/versions.tf b/terraform_project/modules/nat/versions.tf similarity index 100% rename from preemptible_server/modules/nat/versions.tf rename to terraform_project/modules/nat/versions.tf diff --git a/preemptible_server/modules/server_remote_root_disk/README.md b/terraform_project/modules/server_remote_root_disk/README.md similarity index 100% rename from preemptible_server/modules/server_remote_root_disk/README.md rename to terraform_project/modules/server_remote_root_disk/README.md diff --git a/preemptible_server/modules/server_remote_root_disk/main.tf b/terraform_project/modules/server_remote_root_disk/main.tf similarity index 100% rename from preemptible_server/modules/server_remote_root_disk/main.tf rename to terraform_project/modules/server_remote_root_disk/main.tf diff --git a/preemptible_server/modules/server_remote_root_disk/outputs.tf b/terraform_project/modules/server_remote_root_disk/outputs.tf similarity index 100% rename from preemptible_server/modules/server_remote_root_disk/outputs.tf rename to terraform_project/modules/server_remote_root_disk/outputs.tf diff --git a/preemptible_server/modules/server_remote_root_disk/vars.tf b/terraform_project/modules/server_remote_root_disk/vars.tf similarity index 100% rename from preemptible_server/modules/server_remote_root_disk/vars.tf rename to terraform_project/modules/server_remote_root_disk/vars.tf diff --git a/preemptible_server/modules/server_remote_root_disk/versions.tf b/terraform_project/modules/server_remote_root_disk/versions.tf similarity index 100% rename from preemptible_server/modules/server_remote_root_disk/versions.tf rename to terraform_project/modules/server_remote_root_disk/versions.tf diff --git a/preemptible_server/outputs.tf b/terraform_project/outputs.tf similarity index 83% rename from preemptible_server/outputs.tf rename to terraform_project/outputs.tf index d87dc12..51049c6 100644 --- a/preemptible_server/outputs.tf +++ b/terraform_project/outputs.tf @@ -1,4 +1,4 @@ -output "server_outputs" { +output "outputs" { value = [ "ssh root@${module.preemptible_server.0.floating_ip}", "ssh root@${module.preemptible_server.1.floating_ip}" diff --git a/terraform_project/resources/inventory.tmpl b/terraform_project/resources/inventory.tmpl new file mode 100644 index 0000000..955365d --- /dev/null +++ b/terraform_project/resources/inventory.tmpl @@ -0,0 +1,5 @@ +[webapp] +${webapp_vm_ip_public} private_database_ip=${webapp_vm_ip_nat} + +[database] +${database_vm_ip_public} diff --git a/terraform_project/variables.tf b/terraform_project/variables.tf new file mode 100644 index 0000000..5015478 --- /dev/null +++ b/terraform_project/variables.tf @@ -0,0 +1,98 @@ +variable "domain_name" { + description = "Domain name for OpenStack authentication" + type = string +} + +variable "tenant_id" { + description = "Tenant (project) ID" + type = string +} + +variable "user_name" { + description = "OpenStack username" + type = string +} + +variable "password" { + description = "OpenStack password" + type = string + sensitive = true +} + +variable "region" { + default = "ru-7" +} + +variable "keypair_name" { + description = "SSH key pair" + type = string + default = "keypair-tf" +} + +variable "keypair_public_key" { + description = "SSH public key pair" + type = string + default = "~/.ssh/id_rsa.pub" +} + +variable "network_name" { + description = "Network name" + type = string + default = "network_tf" +} + +variable "server_name" { + description = "Server name" + type = string + default = "todo-app" +} + +### ATTENTION!!! Do not edit this block, please. +variable "server_zone" { + type = string + description = "The name of the Selectel's pool." + + default = "ru-7a" + + validation { + condition = can(regex("ru-7a", var.server_zone)) + error_message = "Preemtible servers are available in ru-7a pool only." + } +} + +variable "server_vcpus" { + default = 1 +} + +variable "server_ram_mb" { + default = 2048 +} + +variable "server_root_disk_gb" { + default = 10 +} + +variable "server_volume_type" { + default = "basic.ru-7a" +} + +variable "server_image_name" { + description = "Server image name" + type = string + default = "Ubuntu 22.04 LTS 64-bit" +} + +variable "server_preemptible_tag" { + description = "is preemptible" + default = ["preemptible"] +} + +variable "server_no_preemptible_tag" { + default = [] +} + +variable "inventory_template" { + description = "Ansible inventory" + type = string + default = "./resources/inventory.tmpl" +} \ No newline at end of file diff --git a/terraform_project/versions.tf b/terraform_project/versions.tf new file mode 100644 index 0000000..6cd7f3b --- /dev/null +++ b/terraform_project/versions.tf @@ -0,0 +1,16 @@ +# Инициализация Terraform и хранения Terraform State +terraform { + required_version = ">= 0.14.0" + required_providers { + openstack = { + source = "terraform-provider-openstack/openstack" + version = "~> 1.49.0" + } + } +} + +terraform { + backend "local" { + path = "./terraform.tfstate" + } +} diff --git a/vpc-example/main.tf b/vpc-example/main.tf deleted file mode 100644 index 9c2c435..0000000 --- a/vpc-example/main.tf +++ /dev/null @@ -1,109 +0,0 @@ -# Создание SSH-ключа -resource "openstack_compute_keypair_v2" "key_tf" { - name = "key_tf" - region = var.region - public_key = var.public_key -} - -# Запрос ID внешней сети по имени -data "openstack_networking_network_v2" "external_net" { - name = "external-network" -} - -# Создание роутера -resource "openstack_networking_router_v2" "router_tf" { - name = "router_tf" - external_network_id = data.openstack_networking_network_v2.external_net.id -} - -# Создание сети -resource "openstack_networking_network_v2" "network_tf" { - name = "network_tf" -} - -# Создание подсети -resource "openstack_networking_subnet_v2" "subnet_tf" { - network_id = openstack_networking_network_v2.network_tf.id - name = "subnet_tf" - cidr = var.subnet_cidr -} - -# Подключение роутера к подсети -resource "openstack_networking_router_interface_v2" "router_interface_tf" { - router_id = openstack_networking_router_v2.router_tf.id - subnet_id = openstack_networking_subnet_v2.subnet_tf.id -} - -# Поиск ID образа (из которого будет создан сервер) по его имени -data "openstack_images_image_v2" "ubuntu_image" { - most_recent = true - visibility = "public" - name = "Ubuntu 20.04 LTS 64-bit" -} - -# Создание уникального имени флейвора -resource "random_string" "random_name_server" { - length = 16 - special = false -} - -# Создание конфигурации сервера с 1 ГБ RAM и 1 vCPU -# Параметр disk = 0 делает сетевой диск загрузочным -resource "openstack_compute_flavor_v2" "flavor_server" { - name = "server-${random_string.random_name_server.result}" - ram = "1024" - vcpus = "1" - disk = "0" - is_public = "false" -} - -# Создание сетевого загрузочного диска размером 5 ГБ из образа -resource "openstack_blockstorage_volume_v3" "volume_server" { - name = "volume-for-server1" - size = "10" - image_id = data.openstack_images_image_v2.ubuntu_image.id - volume_type = var.volume_type - availability_zone = var.az_zone - enable_online_resize = true - lifecycle { - ignore_changes = [image_id] - } -} - -# Создание сервера -resource "openstack_compute_instance_v2" "server_tf" { - name = "server_tf" - flavor_id = openstack_compute_flavor_v2.flavor_server.id - key_pair = openstack_compute_keypair_v2.key_tf.id - availability_zone = var.az_zone - network { - uuid = openstack_networking_network_v2.network_tf.id - } - block_device { - uuid = openstack_blockstorage_volume_v3.volume_server.id - source_type = "volume" - destination_type = "volume" - boot_index = 0 - } - vendor_options { - ignore_resize_confirmation = true - } - lifecycle { - ignore_changes = [image_id] - } -} - -# Создание публичного IP-адреса -resource "openstack_networking_floatingip_v2" "fip_tf" { - pool = "external-network" -} - -# Привязка публичного IP-адреса к серверу -resource "openstack_compute_floatingip_associate_v2" "fip_tf" { - floating_ip = openstack_networking_floatingip_v2.fip_tf.address - instance_id = openstack_compute_instance_v2.server_tf.id -} - -output "server_outputs" { - value = "ssh root@${openstack_networking_floatingip_v2.fip_tf.address}" -} \ No newline at end of file diff --git a/vpc-example/provider.tf b/vpc-example/provider.tf deleted file mode 100644 index d9597ab..0000000 --- a/vpc-example/provider.tf +++ /dev/null @@ -1,9 +0,0 @@ -# Инициализация провайдера OpenStack -provider "openstack" { - auth_url = "https://api.selvpc.ru/identity/v3" - domain_name = var.domain_name - tenant_id = var.tenant_id - user_name = var.user_name - password = var.password - region = var.region -} \ No newline at end of file diff --git a/vpc-example/vars.tf b/vpc-example/vars.tf deleted file mode 100644 index df3ec17..0000000 --- a/vpc-example/vars.tf +++ /dev/null @@ -1,41 +0,0 @@ -# Пул Облачной платформы -variable "region" { - default = "ru-7" -} - -# Значение SSH-ключа для доступа к облачному серверу -variable "public_key" { - default = "" -} - -# Сегмент пула -variable "az_zone" { - default = "ru-7a" -} - -# Тип сетевого диска, из которого создается сервер -variable "volume_type" { - default = "basic.ru-7a" -} - -# CIDR подсети -variable "subnet_cidr" { - default = "10.10.0.0/24" -} - -# Sensitive block -variable "domain_name" { - sensitive = true -} - -variable "tenant_id" { - sensitive = true -} - -variable "user_name" { - sensitive = true -} - -variable "password" { - sensitive = true -} \ No newline at end of file diff --git a/vpc-example/versions.tf b/vpc-example/versions.tf deleted file mode 100644 index 6ba0e4f..0000000 --- a/vpc-example/versions.tf +++ /dev/null @@ -1,18 +0,0 @@ -# Инициализация Terraform и хранения Terraform State -terraform { - required_version = ">= 0.14.0" - required_providers { - openstack = { - source = "terraform-provider-openstack/openstack" - version = "~> 1.49.0" - } - } - backend "s3" { - bucket = "/students" - endpoint = "s3.storage.selcloud.ru" - key = ".tfstate" - region = "ru-1" - skip_region_validation = true - skip_credentials_validation = true - } -} \ No newline at end of file