Создание сетевой связанности
Чтобы опубликовать сервис 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-01.cloud.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 опишите переменные:
# variablesvariable "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"}Опишите провайдеры:
# terraformterraform {required_providers {vcd = {source = "vmware/vcd"version = ">=3.10.0"}}required_version = ">= 1.5.5"}Опишите подключение:
# providerprovider "vcd" {user = "none"password = "none"auth_type = "api_token_file"api_token_file = "token.json"allow_api_token_file = trueorg = var.org_namevdc = var.org_vdcurl = var.vcd_urlmax_retry_timeout = var.vcd_max_retry_timeoutallow_unverified_ssl = var.vcd_allow_unverified_ssl}Опишите создание каталога:
# catalogresource "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.idname = "test-deploy-ova"description = "PhotonOS 4.0 GA"ova_path = "./${var.ova}"}Опишите источник данных для получения ID Edge Gateway:
# nsxt edgedata "vcd_org_vdc" "my_vdc" {name = var.org_vdc}data "vcd_nsxt_edgegateway" "nsxt-edge" {name = var.edge_nameowner_id = data.vcd_org_vdc.my_vdc.id}Опишите создание сети организации «test-deploy-net-web»:
# nsxt networksresource "vcd_network_routed_v2" "test-deploy-net-web" {name = "test-deploy-net-web"edge_gateway_id = data.vcd_nsxt_edgegateway.nsxt-edge.idgateway = var.gateway_web_ipprefix_length = 24tatic_ip_pool {start_address = var.server_web_ipend_address = var.server_web_ip}}Опишите создание профиля приложения Edge Gateway:
# nsxt port profilesresource "vcd_nsxt_app_port_profile" "web-profile" {name = "test-deploy-web-profile"scope = "TENANT"context_id = data.vcd_org_vdc.my_vdc.idapp_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.idname = "test-deploy-dnat-rule"rule_type = "DNAT"firewall_match = "MATCH_EXTERNAL_ADDRESS"external_address = data.vcd_nsxt_edgegateway.nsxt-edge.primary_ipdnat_external_port = "80"internal_address = var.server_web_ipapp_port_profile_id = vcd_nsxt_app_port_profile.web-profile.iddepends_on = [vcd_nsxt_app_port_profile.web-profile]}Опишите создание IPSet:
# nsxt ipsetresource "vcd_nsxt_ip_set" "server_web_set" {edge_gateway_id = data.vcd_nsxt_edgegateway.nsxt-edge.idname = "test-deploy-server-web-set"description = var.server_web_ipip_addresses = [var.server_web_ip]}resource "vcd_nsxt_ip_set" "edge_ip_set" {edge_gateway_id = data.vcd_nsxt_edgegateway.nsxt-edge.idname = "test-deploy-edge-ip-set"description = data.vcd_nsxt_edgegateway.nsxt-edge.primary_ipip_addresses = [data.vcd_nsxt_edgegateway.nsxt-edge.primary_ip]}Опишите создание правила межсетевого экрана:
# nsxt firewallresource "vcd_nsxt_firewall" "rules" {edge_gateway_id = data.vcd_nsxt_edgegateway.nsxt-edge.iddepends_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:
# vappresource "vcd_vapp" "test-deploy-vapp-web" {name = "test-deploy-vapp-web"depends_on = [vcd_network_routed_v2.test-deploy-net-web]}Опишите создание сети vApp:
# vapp networksresource "vcd_vapp_org_network" "vapp_web_network" {vapp_name = vcd_vapp.test-deploy-vapp-web.nameorg_network_name = vcd_network_routed_v2.test-deploy-net-web.namedepends_on = [vcd_vapp.test-deploy-vapp-web]reboot_vapp_on_removal = true}Опишите создание VM:
# vmsresource "vcd_vapp_vm" "test-deploy-vm-web" {vapp_name = vcd_vapp.test-deploy-vapp-web.namename = "test-deploy-vm-web"vapp_template_id = vcd_catalog_vapp_template.ova.idmemory = 384 cpus = 1accept_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.nameip_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 &"}}Проверьте веб-адрес:
# outputoutput "web_address_for_check" {value = "http://${data.vcd_nsxt_edgegateway.nsxt-edge.primary_ip}"}Выполните проверку с помощью команды terraform plan.
Terraform показывает планируемые изменения.
Выполните команду terraform apply.
Terraform разворачивает 11 ресурсов и создает веб-сервис в облаке.