- tocdepth
2
Создание сетевой связанности
Чтобы опубликовать сервис VM
в интернет, нужно добавить сеть организации и сеть vApp, подключить VM к сети и настроить правило межсетевого экранирования.
Для создания сетевой связности и публикации веб-приложения опишите создание следующих ресурсов:
В файл
terraform.tfvars
добавьте имя Edge Gateway/T1:edge_name = "<tenant_name>-VDC01-EDGE01"
Например, если имя тенаната
test_tenant
, имя Edge Gateway/T1 может бытьtest_tenant-VDC01-EDGE01
.Теперь файл
terraform.tfvars
полностью выглядт следующим образом:vcd_url = "https://vcd30.msk.sbercloud.ru/api" org_name = "<tenant_name>-dmbBK8eMQ" org_vdc = "<tenant_name>-VDC01" edge_name = "<tenant_name>-VDC01-EDGE01" vcd_storage_policy = "Gold" ova = "photon-hw11-4.0-1526e30ba0.ova"
В файле
main.tf
опишите переменные:# variables variable "vcd_url" {} variable "org_name" {} variable "org_vdc" {} variable "edge_name" {} variable "vcd_storage_policy" {} variable "ova" {} variable "vcd_max_retry_timeout" { default = "1800" } variable "vcd_allow_unverified_ssl" { default = "true" } variable "server_web_ip" { default = "172.16.100.1" } variable "gateway_web_ip" { default = "172.16.100.254" }
Опишите провайдеры:
# terraform terraform { required_providers { vcd = { source = "vmware/vcd" version = ">=3.10.0" } } required_version = ">= 1.5.5" }
Опишите подключение:
# provider provider "vcd" { user = "none" password = "none" auth_type = "api_token_file" api_token_file = "token.json" allow_api_token_file = true org = var.org_name vdc = var.org_vdc url = var.vcd_url max_retry_timeout = var.vcd_max_retry_timeout allow_unverified_ssl = var.vcd_allow_unverified_ssl }
Опишите создание каталога:
# catalog resource "vcd_catalog" "catalog" { name = "test-deploy-catalog" delete_force = "true" delete_recursive = "true" }
Опишите создание шаблона OVA в каталоге:
resource "vcd_catalog_vapp_template" "ova" { catalog_id = vcd_catalog.catalog.id name = "test-deploy-ova" description = "PhotonOS 4.0 GA" ova_path = "./${var.ova}" }
Опишите источник данных для получения ID Edge Gateway:
# nsxt edge data "vcd_org_vdc" "my_vdc" { name = var.org_vdc } data "vcd_nsxt_edgegateway" "nsxt-edge" { name = var.edge_name owner_id = data.vcd_org_vdc.my_vdc.id }
Опишите создание сети организации «test-deploy-net-web»:
# nsxt networks resource "vcd_network_routed_v2" "test-deploy-net-web" { name = "test-deploy-net-web" edge_gateway_id = data.vcd_nsxt_edgegateway.nsxt-edge.id gateway = var.gateway_web_ip prefix_length = 24 tatic_ip_pool { start_address = var.server_web_ip end_address = var.server_web_ip } }
Опишите создание профиля приложения Edge Gateway:
# nsxt port profiles resource "vcd_nsxt_app_port_profile" "web-profile" { name = "test-deploy-web-profile" scope = "TENANT" context_id = data.vcd_org_vdc.my_vdc.id app_port { protocol = "TCP" port = ["80"] } }
Опишите создание DNAT-правила «test-deploy-dnat-rule» для публикации веб-приложения:
resource "vcd_nsxt_nat_rule" "dnat" { edge_gateway_id = data.vcd_nsxt_edgegateway.nsxt-edge.id name = "test-deploy-dnat-rule" rule_type = "DNAT" firewall_match = "MATCH_EXTERNAL_ADDRESS" external_address = data.vcd_nsxt_edgegateway.nsxt-edge.primary_ip dnat_external_port = "80" internal_address = var.server_web_ip app_port_profile_id = vcd_nsxt_app_port_profile.web-profile.id depends_on = [vcd_nsxt_app_port_profile.web-profile] }
Опишите создание IPSet:
# nsxt ipset resource "vcd_nsxt_ip_set" "server_web_set" { edge_gateway_id = data.vcd_nsxt_edgegateway.nsxt-edge.id name = "test-deploy-server-web-set" description = var.server_web_ip ip_addresses = [var.server_web_ip] } resource "vcd_nsxt_ip_set" "edge_ip_set" { edge_gateway_id = data.vcd_nsxt_edgegateway.nsxt-edge.id name = "test-deploy-edge-ip-set" description = data.vcd_nsxt_edgegateway.nsxt-edge.primary_ip ip_addresses = [data.vcd_nsxt_edgegateway.nsxt-edge.primary_ip] }
Опишите создание правила межсетевого экрана:
# nsxt firewall resource "vcd_nsxt_firewall" "rules" { edge_gateway_id = data.vcd_nsxt_edgegateway.nsxt-edge.id depends_on = [vcd_nsxt_ip_set.server_web_set] rule { action = "ALLOW" name = "test-deploy-web-from-internet" direction = "IN_OUT" ip_protocol = "IPV4" destination_ids = [vcd_nsxt_ip_set.edge_ip_set.id] app_port_profile_ids = [vcd_nsxt_app_port_profile.web-profile.id] } }
Опишите создание vApp:
# vapp resource "vcd_vapp" "test-deploy-vapp-web" { name = "test-deploy-vapp-web" depends_on = [vcd_network_routed_v2.test-deploy-net-web] }
Опишите создание сети vApp:
# vapp networks resource "vcd_vapp_org_network" "vapp_web_network" { vapp_name = vcd_vapp.test-deploy-vapp-web.name org_network_name = vcd_network_routed_v2.test-deploy-net-web.name depends_on = [vcd_vapp.test-deploy-vapp-web] reboot_vapp_on_removal = true }
Опишите создание VM:
# vms resource "vcd_vapp_vm" "test-deploy-vm-web" { vapp_name = vcd_vapp.test-deploy-vapp-web.name name = "test-deploy-vm-web" vapp_template_id = vcd_catalog_vapp_template.ova.id memory = 384 cpus = 1 accept_all_eulas = "true" depends_on = [vcd_vapp.test-deploy-vapp-web, vcd_vapp_org_network.vapp_web_network] network { type = "org" name = vcd_network_routed_v2.test-deploy-net-web.name ip_allocation_mode = "POOL" is_primary = "true" connected = "true" } customization { enabled = "true" allow_local_admin_password = "true" auto_generate_password = "false" admin_password = "P@ssw0rd" initscript = "mkdir /tmp/node && cd /tmp/node && echo 'CSA-Lab WEB server on 80 port' > index.html && /bin/systemctl stop iptables && /usr/bin/python3 -m http.server 80 &" } }
Проверьте веб-адрес:
# output output "web_address_for_check" { value = "http://${data.vcd_nsxt_edgegateway.nsxt-edge.primary_ip}" }
Выполните проверку с помощью команды
terraform plan
.Terraform показывает планируемые изменения.
Выполните команду
terraform apply
.Terraform разворачивает 11 ресурсов и создает веб-сервис в облаке.
для Dev & Test