据我所知,可以使用 Terraform 构建逻辑应用程序。但是,文档仍然不是很好,而且这个功能看起来很新。
TF 和 Azure 逻辑应用程序有哪些限制?有吗?
我想构建两个应用程序,一个是每个月触发的,另一个是由 https 请求触发的。我希望这些然后运行两个 python 脚本,我希望后一个脚本将此脚本的结果返回到调用 https 的客户端。
这可以在 Terraform 中实现自动化吗?目前,关于此的示例和文档很少。任何评论或提示都是有帮助的,并张开双臂迎接!
我正在使用azurerm_virtual_machine_extensionazure 引导一些虚拟机。
我发现的所有示例都使用类似于以下内容的内容:
settings = <<SETTINGS
    {   
    "fileUris": [ "https://my.bootstrapscript.com/script.sh}" ],
    "commandToExecute": "bash script.sh"
    }
SETTINGS
虽然这有效,但我的问题是我必须公开托管script以与fileUris. 设置中是否有允许我从 terraform 文件夹发送本地文件内容的选项?
就像是:
settings = <<SETTINGS
    {   
    "file": [ ${file("./script.txt")} ],
    "commandToExecute": "bash script.sh"
    }
SETTINGS
谢谢。
bootstrapping virtual-machine azure terraform terraform-provider-azure
在为 App Service Plan 编写配置时,我遇到了terraform 文档中保留的参数
保留 - (可选)是否保留此应用服务计划。默认为假。
我不确定这个保留的参数如果设置为 true 会做什么,除了有一个注释说明它必须为 Linux 计划设置为 true。
在Azure 文档中也找不到该属性。此外,我在通过门户创建计划时没有看到该属性。
我想通过为 Terraform 提供 Azure ARM 模板来使用 Terraform 配置 Azure AD 域服务,这是因为 Terrafrom 不支持在本机配置 Azure AD 域服务。
我已经导出了 ARM 模板及其参数,其中一个参数被称为"notificationSettings"一种类型Object,如下所示:
    "notificationSettings": {
        "value": {
            "notifyGlobalAdmins": "Enabled",
            "notifyDcAdmins": "Enabled",
            "additionalRecipients": []
        }
    }
其他参数都是strings,我可以毫无问题地传递它们,例如:
"apiVersion" = "2017-06-01"
我曾尝试将此对象传递给如下参数:
"notificationSettings" = [{
                "notifyGlobalAdmins" = "Enabled"
            "notifyDcAdmins" ="Enabled"
            "additionalRecipients" = []
}]
但是,当我执行时terrafrom apply,terrafrom 抱怨说:
属性“参数”的值不合适:元素“notificationSettings”:需要字符串。
如何将 Object 的参数类型传递给template body?
我还尝试使用parameters_body如下选项将整个 ARM json 参数作为文件提供给 terrafrom :
parameters_body = "${file("${path.module}/temp/params.json")}"
但是,在执行 terrafrom 脚本时出现以下错误: …
我正在使用 Terraform 在 Azure 中设置虚拟网络。
我有几个 VNet,每个 VNet 都有自己的网络安全组 100% 在 Terraform 中管理,在运行 Terraform 之前不存在除资源组之外的资源。
当我Terraform apply第一次运行时,所有资源都被正确创建。但是,如果我再次尝试运行 apply 以更新其他资源,则会收到错误消息,指出 NSG 资源已存在。
Error: A resource with the ID
"/subscriptions/0000000000000000/resourceGroups/SynthArtInfra/providers/Microsoft.Network/networkSecurityGroups/SynthArtInfra_ServerPoolNSG"
already exists - to be managed via Terraform this resource needs to be
imported into the State. Please see the resource documentation for
"azurerm_network_security_group" for more information.
为什么 Terraform 抱怨现有资源,而它应该已经在它的控制之下?
编辑:这是与 NSG 相关的代码,其他一切都与 VPN 网关有关:
# Configure the Azure provider
terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm" …我正在尝试在我的 terraform 执行中使用以下内容:
resource "azurerm_virtual_machine_extension" "vmex" {
    name = "myVM"
    location = "eastus"
    resource_group_name   = "${azurerm_resource_group.rg.name}"
    virtual_machine_name = "${azurerm_virtual_machine.vm.name}"
    publisher = "Microsoft.Compute"
    type = "CustomScriptExtension"
    type_handler_version = "1.9"
    settings = <<SETTINGS
    {
        "fileUris": [
            "https://example.com/scripts/test.ps1"
        ],
        "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File 'test.ps1'"
    }
    SETTINGS
}
当执行时,我得到以下输出:
错误:应用计划时出错:
发生 1 个错误:
azurerm_virtual_machine_extension.vmex:发生 1 个错误:
azurerm_virtual_machine_extension.vmex:长时间运行的操作终止,状态为“失败”:代码 =“VMExtensionProvisioningError”消息 =“VM 在处理扩展“myVM”时报告失败。错误消息:\“已完成执行命令\”。”
Terraform 不会在出现错误时自动回滚。相反,您的 Terraform 状态文件已使用成功完成的所有资源进行了部分更新。请解决上述错误并再次应用以逐步更改您的基础架构。
当我通过 RDP 进入虚拟机时,我可以看到该文件已正确下载到预期的位置,但是,该文件似乎commandToExecute从未执行过。
如果我直接从下载文件夹运行脚本,它就会成功完成。
任何人都可以提供有关如何解决此问题的任何建议吗?
注意:我尝试了尝试引用该文件的各种组合,但所有这些组合似乎都有相同的结果。
更新:按照评论中的建议检查日志后,尝试运行此代码片段时出现的错误是:
"message": "处理 -File ''test.ps1'' 失败,因为该文件没有 '.ps1' 扩展名。请指定有效的 Windows …
我正在 Azure 中的 bash cloud shell 中使用 Terraform。我正在尝试将外部数据源添加到我的 Terraform 配置文件中,该文件将用于az cli查询virtualip模板部署的 Microsoft.Web/hostingEnvironment 上的对象。
AZ CLI 命令行:
az resource show --ids /subscriptions/<subscription Id>/resourceGroups/my-ilbase-rg/providers/Microsoft.Web/hos
tingEnvironments/my-ilbase/capacities/virtualip
从命令行运行时的输出:
   {
      "additionalProperties": {
        "internalIpAddress": "10.10.1.11",
        "outboundIpAddresses": [
          "52.224.70.119"
        ],
        "serviceIpAddress": "52.224.70.119",
        "vipMappings": []
      },
      "id": null,
      "identity": null,
      "kind": null,
      "location": null,
      "managedBy": null,
      "name": null,
      "plan": null,
      "properties": null,
      "sku": null,
      "tags": null,
      "type": null
    }
在我的 Terraform 配置中,我为--ids值创建一个变量:
    variable ilbase_resourceId {
      default = "/subscriptions/<subscription Id>/resourceGroups/my-ilbase-rg/providers/Microsoft.Web/hostingEnvironments/my-ilbase/capacities/virtualip"
    }
然后我以这种方式构建数据源:
    data …我的 terraform 目录结构如下:
terraform/
main.tf  modules  outputs.tf  provider.tf  variables.tf
./modules:
compute  network  resourcegroup
./modules/compute:
main.tf  outputs.tf  variables.tf
./modules/network:
main.tf  outputs.tf  variables.tf
./modules/resourcegroup:
main.tf  outputs.tf  variables.tf
资源组模块配置文件如下:
目的:在这个模块中,我引用了一个现有的资源组,我想用它来创建一个虚拟机及其关联的对象。
主文件
data "azurerm_resource_group" "tf-rg-external" {
  name = var.rg_name
}
变量.tf
variable "rg_name" {
  type = string
}
网络模块
目的:我想使用资源组模块中的资源组在此模块中引用。这样,我在一个地方定义并在 root 和其他模块中使用它,例如计算、应用服务、aks 等
主文件
# Reference existing Virtual Network
data "azurerm_virtual_network" "tf-vn" {
  name                = var.vnet_name
  resource_group_name = module.resource_groups.external_rg_name
}
# Reference existing subnet
data "azurerm_subnet" "tf-sn" {
  name                 = …azure-virtual-machine azure-virtual-network terraform terraform-provider-azure
我正在尝试使用 Terraform 来自动部署环境,但设置有些棘手:
我需要配置 DNS CNAME 记录,但我的问题是,根据环境,我需要在Dyn DNS或 Azure DNS 中配置该记录(并且它们是互斥的)
Dyn而且,出于同样的原因,例如,当我想在 Azure 中配置时初始化 Terraform 提供程序对我来说是没有意义的。
我认为可行的是包括两个providers:
provider azurerm {
  version = "=1.44.0"
  client_id       = var.dns_provider_client_id
  client_secret   = var.dns_provider_client_secret
  subscription_id = var.dns_provider_subscription_id
  tenant_id       = var.dns_provider_tenant_id
}
provider dyn {
  version = "=1.2.0"
  customer_name = var.dyn_customer_name
  password      = var.dyn_password
  username      = var.dyn_username
}
然后,在运行时,我会将与我不使用的提供程序相关的变量设置为空字符串,然后,在配置记录时,在此处tf plan的帮助下,我认为我可以有条件地配置资源:
resource azurerm_dns_cname_record dns_name {
  count = var.dyn_dns_zone.name == "" ? 1 : 0
  name                = "..."
  record              = …从昨晚开始,我在使用 Terraform 将 Web 应用程序部署到 azure 时遇到错误:
Error creating/updating App Service Plan "test-euw-asp" (Resource Group "test-middle-euw-rg"): web.AppServicePlansClient#CreateOrUpdate: Failure sending request: StatusCode=400 -- Original Error: Code="LinkedInvalidPropertyId" Message="Property id '' at path 'properties.hostingEnvironmentProfile.id' is invalid. Expect fully qualified resource Id that start with '/subscriptions/{subscriptionId}' or '/providers/{resourceProviderNamespace}/'."
看起来它正在“hostingEnvironmentProfile”对象中发送一个空的“id”。
2020-02-25T15:31:56.0433755Z 2020-02-25T15:31:56.041Z [DEBUG] plugin.terraform-provider-azurerm_v1.44.0_x4.exe: {"kind":"Windows","location":"westeurope","properties":{"hostingEnvironmentProfile":{"id":""},"perSiteScaling":false,"maximumElasticWorkerCount":1,"reserved":false,"isXenon":false},"sku":{"name":"S1","tier":"standard","size":"S1","capacity":1},"tags":{}}
我确实将提供程序版本设置为 1.44.0
provider "azurerm" {
  version = "~>1.44.0"
}
我的地形配置
resource "azurerm_resource_group" "rg" {
    name = var.ResourceGroupNameApp
    location = "West europe"
}
resource "azurerm_app_service_plan" "asp" {
    name = var.asp-name
    resource_group_name …