正确使用Terraform外部数据源

正确使用Terraform外部数据源,terraform,terraform-provider-azure,terraform-template-file,Terraform,Terraform Provider Azure,Terraform Template File,我正在Azure中使用bash cloud shell中的Terraform。我正在尝试将外部数据源添加到我的Terraform配置文件中,该文件将使用az cli在模板部署的Microsoft.Web/hostingEnvironment上查询virtualip对象 AZ CLI命令行: az资源展示--ids/subscriptions//resourceGroups/my-ilbase rg/providers/Microsoft.Web/hos tingEnvironments/my i

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

AZ CLI命令行:
az资源展示--ids/subscriptions//resourceGroups/my-ilbase rg/providers/Microsoft.Web/hos
tingEnvironments/my ilbase/Capacity/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
    }
在我的地形配置中,我为
--ids
值创建了一个变量:

    variable ilbase_resourceId {
      default = "/subscriptions/<subscription Id>/resourceGroups/my-ilbase-rg/providers/Microsoft.Web/hostingEnvironments/my-ilbase/capacities/virtualip"
    }
当我执行配置时,会出现以下错误:

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

知道我做错了什么吗?

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

无论您的选择是什么,都要考虑脚本应该具有的唯一输出是JSON。如果任何其他命令向输出中添加了某些内容(例如,当您登录时,您有一个包含订阅信息的输出),那么您将遇到与输出不是正确的JSON相同的错误。您需要通过管道将这种额外的输出传输到
Out Null
,使它们“静默”,只需将从请求接收到的JSON写入输出


我希望这能有所帮助。

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

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

应该不需要在Cloud Shell中进行身份验证…您必须进行身份验证才能进入它。Terraform和AZ CLI一样,都是云壳所固有的!云壳,对不起,我的错。那么,如果解决了登录问题,那么在shell中执行命令后,JSON是唯一的输出吗?这是我在尝试使用外部数据源时遇到的问题。是的,如果我从cloud shell中手动执行az cli命令,它将返回我在原始帖子中列出的JSON格式的信息。很可能是登录。terraform不在shell中运行命令,因此在shell中运行AZ时使用的令牌在terraform运行时不可用
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"
)