Мне нужно передать массив и значения карты в рабочее пространство terraform с помощью terraform api
пытался вызвать
{
"data": {
"id":"",
"attributes": {
"key":"PREFIXES",
"value":'{a = "b"}',
"description":"some description",
"category":"terraform",
"hcl": false,
"sensitive": false
},
"type":"vars"
}
}
и завиток вызов
curl \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/vnd.api+json" \
--request PATCH \
--data @payload.json \
https://app.terraform.io/api/v2/workspaces/$WORKSPACE_ID/vars/$PREFIXES_ID
закончить с ошибкой
{"errors":[{"status":"400","title":"JSON body is invalid","detail":"784: unexpected token at '{ \"data\": { \"id\":\"\", \"attributes\": { \"key\":\"PREFIXES\", \"value\":'{a=\"b\"}', \"description\":\"some description\", \"category\":\"terraform\", \"hcl\": false, \"sensitive\": false }, \"type\":\"vars\" } }'"}]}
Я попытался реализовать то же самое с помощью python. как всегда моя terraform дает ошибки:
Ошибка: недопустимый аргумент for_each
в строке 18 main.tf в ресурсе «aws_s3_bucket_object» «obj»: 18: for_each = переменные.префиксы
python3
def update_workspace_vars(workspace_vars, var_values, params):
headers = {"Authorization": "Bearer " + params["TOKEN"],
"Content-Type": "application/vnd.api+json"}
for k in var_values:
payload = {
"data": {
"id": workspace_vars[k],
"attributes": {
"key": k,
"value": var_values[k],
"category": "terraform"
},
"type": "vars"
}
}
patch_params = dict((k, params[k]) for k in ("workspace_id", "tfe_host"))
patch_params.update({"var_id": workspace_vars[k]})
url = "https://{tfe_host}/api/v2/workspaces/{workspace_id}/vars/{var_id}".format(**patch_params)
response = http.request("PATCH", url, headers=headers, body=json.dumps(payload)).data
var_variables = {"prefixes": {"a": ["a1", "a2", "a3"], "b": ["b1", "b2", "b3"]}}
и мой код терраформирования:
resource "aws_s3_bucket" "b" {
bucket = "my-tf-test-bucket-pinnaka"
acl = "private"
}
resource "aws_s3_bucket_object" "obj" {
for_each = var.prefixes
bucket = aws_s3_bucket.b.id
key = each.key
content = each.value
}```
Ваш JSON кажется недействительным.
{
"data": {
"id":"",
"attributes": {
"key":"PREFIXES",
"value":'{a = "b"}',
"description":"some description",
"category":"terraform",
"hcl": false,
"sensitive": false
},
"type":"vars"
}
}
"value":'{a = "b"}'
недопустимый синтаксис JSON.
Либо используйте "value": { "a" : "b"}
как JSON, либо иначе "value":\"{a=\'b\'}\"
избегайте одинарных кавычек, чтобы {"a"="b"} не анализировался как JSON.
Я создал имена локальных переменных local_prefix и передал var.prefixes в jsoncode.
это сработало.
locals{
local_prefix = jsoncode(var.prefix)
}
применяется for_each для local_prefix
"value":'{a = "b"}',
JSON не использует одинарные кавычки для ключей или значений. Используйте двойные кавычки и избегайте\"
двойных кавычек."value":"{a=\"b\"}",
stackoverflow.com/a/15637481/8016720