使用LinuxDiagnostic扩展设置Azure虚拟机规模设置

时间:2019-02-25 11:01:30

标签: azure terraform azure-diagnostics azure-vm-scale-set

我正在尝试设置Service Fabric集群,同时我正在创建一个以LinuxDiagnostic作为扩展之一的Azure虚拟机规模集。以下是虚拟机规模集的代码:

bar(foo);

Wadcfg文件的结尾如下:

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}"
  }
}

Settings2.3.json.tpl文件为

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

在尝试运行Terraform代码时,出现以下错误:

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

我假设Terraform尝试在未设置Azure VM缩放比例的情况下渲染模板wadcfg.xml.tpl。以下是我的一些问题:

  • 我如何强制Terraform在创建wadcfg.xml.tpl文件之前等到创建Azure VM比例集之后
  • 作为传递wadcfg.xml.tpl的一部分,我要传递虚拟机ID,我知道如果我仅创建一个实例,这将起作用,但是上面的代码也将适用于虚拟机缩放比例集,而无需我明确遍历每个虚拟机的?如果万一我不得不遍历它们,那么推荐的方法是什么?
  • 我看到有一个https://www.terraform.io/docs/providers/azurerm/r/virtual_machine_extension.html资源可用于安装VM扩展,这也适用于VM扩展集吗?如果没有更好的方法,我可以组织我的设置和protected_settings部分,使它们对读者友好吗?

在这里,我会有所帮助。

0 个答案:

没有答案