Настройка масштаба виртуальной машины Azure с расширением LinuxDiagnostic - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь настроить кластер Service Fabric, и в то же время я создаю масштаб виртуальной машины Azure с LinuxDiagnostic в качестве одного из расширений.Ниже приведен код для установленного масштаба VM:

resource "azurerm_virtual_machine_scale_set" "sf_scale_set" {
  name                = "sf-scale-set-${terraform.workspace}"
  location            = "${var.location}"
  resource_group_name = "${azurerm_resource_group.fusion.name}"

  # automatic rolling upgrade
  automatic_os_upgrade = true
  upgrade_policy_mode  = "Automatic"

  # required when using rolling upgrade policy
  health_probe_id = "${azurerm_lb_probe.sf_lb_probe.id}"

  sku {
    name     = "${var.sf_scale_set_vm_config["name"]}"
    tier     = "${var.sf_scale_set_vm_config["tier"]}"
    capacity = "${var.sf_scale_set_vm_config["capacity"]}"
  }

  storage_profile_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "16.04"
    version   = "6.0.12"
  }

  storage_profile_os_disk {
    name              = ""
    caching           = "ReadWrite"
    create_option     = "FromImage"
    managed_disk_type = "Standard_LRS"
  }

  os_profile_secrets {
    source_vault_id = "${var.sf_vault_id}"

    vault_certificates {
      certificate_url = "${var.sf_vault_url}"
    }
  }

  storage_profile_data_disk {
    lun           = 0
    caching       = "ReadWrite"
    create_option = "Empty"
    disk_size_gb  = 40
  }

  os_profile {
    computer_name_prefix = "sf-vm-${terraform.workspace}"
    admin_username       = "hachadmin"
  }

  os_profile_linux_config {
    disable_password_authentication = true

    ssh_keys {
      path     = "/home/admin/.ssh/authorized_keys"
      key_data = "${file("sshkeys/admin.pub")}"
    }
  }

  network_profile {
    name    = "sf-vm-net-profile-${terraform.workspace}"
    primary = true

    ip_configuration {
      name                                   = "sf-ip-config-${terraform.workspace}"
      primary                                = true
      subnet_id                              = "${azurerm_subnet.sf_vnet_subnet.id}"
      load_balancer_backend_address_pool_ids = ["${azurerm_lb_backend_address_pool.sf_be_vm_set.id}"]
      load_balancer_inbound_nat_rules_ids    = ["${element(azurerm_lb_nat_pool.sf_nat_vm_set.*.id, count.index)}"]
    }
  }

  extension {
    name                 = "sf-scale-set-extension-${terraform.workspace}"
    publisher            = "Microsoft.Azure.ServiceFabric"
    type                 = "ServiceFabricLinuxNode"
    type_handler_version = "1.0"
    settings             = "{  \"certificate\": { \"thumbprint\": \"${var.cert_thumbprint}\", \"x509StoreName\": \"My\" } , \"clusterEndpoint\": \"${azurerm_service_fabric_cluster.sf_service.cluster_endpoint}\", \"nodeTypeRef\": \"${terraform.workspace}-sf-node-type\", \"durabilityLevel\": \"${var.sf_reliability}\",\"nicPrefixOverride\": \"${azurerm_subnet.sf_vnet_subnet.address_prefix}\",\"enableParallelJobs\": \"true\"}"
    protected_settings   = "{\"StorageAccountKey1\": \"${azurerm_storage_account.sf_storage.primary_access_key}\", \"StorageAccountKey2\": \"${azurerm_storage_account.sf_storage.secondary_access_key}\"}"
  }

  extension {
    name                       = "sf-scale-set-linux-diag-extension-${terraform.workspace}"                                                                                                                                                                                                                                        # This extension connects vms to the cluster.
    publisher                  = "Microsoft.OSTCExtensions"
    type                       = "LinuxDiagnostic"
    type_handler_version       = "2.3"
    auto_upgrade_minor_version = true
    protected_settings         = "{\"storageAccountName\": \"${azurerm_storage_account.sf_storage_app_diag.primary_access_key}\", \"StorageAccountKey1\": \"${azurerm_storage_account.sf_storage_app_diag.primary_access_key}\", \"StorageAccountKey2\": \"${azurerm_storage_account.sf_storage_app_diag.secondary_access_key}\"}"
    settings                   = "${data.template_file.settings.rendered}"
  }

  tags {
    Region      = "${var.location}"
    Createdby   = "${var.created_by_tag}"
    Team        = "${var.team_tag}"
    Environment = "${terraform.workspace}"
    ninetofive  = "${var.ninetofivetag}"
  }
}

data "template_file" "settings" {
  template = "${file("${path.module}/diagnostics/settings2.3.json.tpl")}"

  vars {
    xml_cfg           = "${base64encode(data.template_file.wadcfg.rendered)}"
    diag_storage_name = "${azurerm_storage_account.sf_storage_app_diag.name}"
  }
}

data "template_file" "wadcfg" {
  template   = "${file("${path.module}/diagnostics/wadcfg.xml.tpl")}"

  vars {
    virtual_machine_id = "${azurerm_virtual_machine_scale_set.sf_scale_set.id}"
  }
}

Конец файла Wadcfg выглядит следующим образом:

<WadCfg>
<PerformanceCounters scheduledTransferPeriod="PT1M">
.....
......
    </PerformanceCounters>
    <Metrics resourceId="${virtual_machine_id}">
      <MetricAggregation scheduledTransferPeriod="PT1H"/>
      <MetricAggregation scheduledTransferPeriod="PT1M"/>
    </Metrics>
  </DiagnosticMonitorConfiguration>
</WadCfg>

Файл Settings2.3.json.tpl равен

{
  "xmlCfg": "${xml_cfg}",
  "storageAccount": "${diag_storage_name}"
}

При попытке запустить код Terraform я получаю следующую ошибку:

[+] Found tfvars file ./profiles/eu-sprint/eu-sprint.tfvars

Error: Cycle: data.template_file.wadcfg, data.template_file.settings, azurerm_virtual_machine_scale_set.sf_scale_set

Я предполагаю, что Terraform пытается отобразить шаблон wadcfg.xml.tpl без установленного масштаба виртуальной машины Azure.Вот некоторые из моих вопросов:

  • Как заставить Terraform ждать, пока не будет создан набор масштабов виртуальной машины Azure, прежде чем пытаться отобразить файл wadcfg.xml.tpl
  • Как частьрендеринга моего wadcfg.xml.tpl Я передаю идентификаторы виртуальных машин, я знаю, что это сработает, если я создаю только один экземпляр, но будет ли приведенный выше код работать и для масштабирования виртуальной машины, установленного без явного циклического обхода каждой виртуальной машины?Если бы мне пришлось обходить каждый из них, какой подход был бы возобновлен?
  • Я видел, что существует ресурс https://www.terraform.io/docs/providers/azurerm/r/virtual_machine_extension.html для установки расширения ВМ, будет ли это также работать для масштабирования ВМ?Если нет, то нет ли лучшего способа организовать мои настройки и часть protected_settings так, чтобы они были удобны для чтения?

Буду признателен за помощь.

...