正确使用Terraform外部数据源

时间:2018-03-09 20:35:38

标签: terraform terraform-provider-azure terraform-template-file

我在Azure中使用来自bash云外壳的Terraform。我正在尝试将外部数据源添加到我的Terraform配置文件中,该文件将使用az cli来查询模板部署的Microsoft.Web / hostingEnvironment上的virtualip对象。

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 "external" "aseVip" {
      program = ["az", "resource", "show", "--ids", "${var.ilbase_resourceId}"]
    }

当我执行配置时,我收到以下错误:

    data.external.aseVip: data.external.aseVip: command "az" produced invalid JSON: json: cannot unmarshal object into Go value of type string

任何想法我做错了什么?

2 个答案:

答案 0 :(得分:1)

我发现问题是Terraform外部数据源还不能处理命令返回的复杂结构。我能够通过在脚本开头添加一个AZ CLI命令块来解决这个问题,该脚本用于部署获取IP地址并将其作为变量传递给Terraform配置的Application Gateway。下面是我正在使用的脚本块:

ilbase_virtual_ip=$(
  az resource show \
  --ids "/subscriptions/$subscription_id/resourceGroups/$ilbase_rg_name/providers/Microsoft.Web/hostingEnvironments/$ilbase_name/capacities/virtualip" \
  --query "additionalProperties.internalIpAddress"
)

答案 1 :(得分:0)

当您在会话中工作时,该命令将成功。我想当你从shell运行它时,你已经完成了az login。当terraform执行您的命令时,它不使用您现有的会话。您需要创建一个PS1脚本,您可以在其中指定登录,或者您提供凭据以便您的请求成功。

无论您的选择是什么,请考虑脚本应该具有的唯一输出是JSON。如果任何其他命令在输出中添加了某些内容(例如,当您执行登录时,您有一个包含订阅信息的输出)那么您将遇到相同的错误,因为输出不是正确的JSON。您将需要将这类额外输出传递给Out-Null,使其“无声”,并将您从请求中收到的JSON写入输出。

我希望这可以提供帮助。