我有一个test.js文件,我试图拉在我的Terraform文件夹中,如下所示:
data external "file"{ program = ["curl", "-o", "Content-Type:application/js", "${path.pwd}/testing.js", "https://raw.github.com/test/test.js"] }
继续获取命令“curl”产生的无效JSON:JSON输入的意外结束。当我尝试在PC上本地 curl 时,它可以工作。
64jmpszr1#
external数据源是在Terraform中没有其他数据源可以满足您的需求时的最后手段。在本例中,您似乎希望从远程HTTP端点获取JSON数据。如果是这样,使用the http data source就不那么复杂了:
external
http
data "http" "example" { url = "https://raw.github.com/test/test.js" }
然后,您可以使用data.http.example.response_body来处理从该URL返回的数据。你提到的URL实际上并不起作用,所以我假设你有一些其他的URL,你打算在实践中使用。如果有问题的URL返回JavaScript,那么您可能只是将其作为普通字符串使用,因为Terraform没有内置的解析或处理JavaScript代码的功能。如果您尝试访问的真实的URL实际上返回 JSON 而不是JavaScript,则可以使用the jsondecode function访问该JSON表示的数据结构。例如,您可以将结果分配给named local value,以便您可以从模块中的多个位置使用它:
data.http.example.response_body
jsondecode
locals { example_data = jsondecode(data.http.example.response_body) }
在模块的其他地方,local.example_data将引用解码JSON数据后得到的值,假设主体确实包含有效的JSON。如果没有,那么您将看到与external数据源类似的错误:jsondecode函数只能解码有效的JSON数据。
local.example_data
ghhkc1vu2#
问题不在于curl失败了,而是你没有产生terraform可以使用的输出。你必须生成一个json blob。下面是我使用的外部脚本:用途:
data "external" "terraform_versions" { program = ["scripts/terraform_versions.sh"] }
#!/bin/bash BRANCH=$(git rev-parse --abbrev-ref HEAD) COMMIT=$(git rev-parse HEAD) jq -n --arg branch "${BRANCH}" --arg commit "${COMMIT}" '{"branch":$branch, "commit":$commit}'
其输出数据为:
{ "branch": "master", "commit": "abc123deadbeef..." }
哪些terraform可以消耗:
resource "aws_ssm_parameter" "terraform_branch" { name = "/${terraform.workspace}/tf/branch" type = "SecureString" value = data.external.terraform_versions.result["branch"] overwrite = true } resource "aws_ssm_parameter" "terraform_commit" { name = "/${terraform.workspace}/tf/commit" type = "SecureString" value = data.external.terraform_versions.result["commit"] overwrite = true }
更多here编辑:我个人从未使用过它,但有一个http提供程序可能更适合你的需要。参见here
2条答案
按热度按时间64jmpszr1#
external
数据源是在Terraform中没有其他数据源可以满足您的需求时的最后手段。在本例中,您似乎希望从远程HTTP端点获取JSON数据。如果是这样,使用the
http
data source就不那么复杂了:然后,您可以使用
data.http.example.response_body
来处理从该URL返回的数据。你提到的URL实际上并不起作用,所以我假设你有一些其他的URL,你打算在实践中使用。如果有问题的URL返回JavaScript,那么您可能只是将其作为普通字符串使用,因为Terraform没有内置的解析或处理JavaScript代码的功能。
如果您尝试访问的真实的URL实际上返回 JSON 而不是JavaScript,则可以使用the
jsondecode
function访问该JSON表示的数据结构。例如,您可以将结果分配给named local value,以便您可以从模块中的多个位置使用它:在模块的其他地方,
local.example_data
将引用解码JSON数据后得到的值,假设主体确实包含有效的JSON。如果没有,那么您将看到与external
数据源类似的错误:jsondecode
函数只能解码有效的JSON数据。ghhkc1vu2#
问题不在于curl失败了,而是你没有产生terraform可以使用的输出。你必须生成一个json blob。下面是我使用的外部脚本:用途:
其输出数据为:
哪些terraform可以消耗:
更多here
编辑:我个人从未使用过它,但有一个http提供程序可能更适合你的需要。参见here