Eu tenho um código terraform que se parece com isto:
locals {
overrides = {
foo = {
connections = {
connection-one = {
bool_setting = "true"
}
connection-two = {
string_value = "primary"
}
}
}
}
my_json = {
"description" = "blah"
"psk" = {
for_each = try(local.overrides.foo.connections, {}) # <-- problem
each.key : random_string.password[each.key]
}
}
}
resource "random_string" "password" {
for_each = try(local.overrides.foo.connections, {})
length = 20
special = true
}
output "json_output" {
value = jsonencode(local.my_json)
}
Eu sei que meu código está errado porque for_each
não são permitidos blocos onde apontei o problema, mas minha esperança é que esse trecho demonstre o que estou tentando alcançar.
NB: local.overrides
nem sempre pode ter o connections
atributo, daí o try()
.
Eu gostaria de uma saída parecida com a abaixo:
{
"description": "blah",
"psk": {
"connection-one": "g2rL6IEF1XXp_JL]N<H!",
"connection-two": "EVBQvSj@5a9lo:OZ<S_T"
}
}
Como faço para conseguir isso no Terraform?
O
for_each
argumento nos blocosresource
,data
edynamic "..."
é uma parte intrínseca desses recursos específicos da linguagem e não é uma unidade independente que você pode usar isoladamente em outras partes da sua configuração.No entanto, se você precisar gerar uma nova sequência ou valor de mapeamento a partir de uma coleção existente em um local que espera uma expressão, poderá usar uma
for
expressão , projetada para esse propósito específico.Para produzir um mapeamento de instâncias
random_string.password
apenas para a senha gerada (sem as outras partes de cada objeto), você poderia escrever uma expressão como esta:Esta expressão baseia-se no facto de se
random_string.password
materializar como um mapa desde chaves de instância até objectos que representam cada uma das instâncias desse recurso. A documentaçãorandom_string
diz que instâncias desse tipo possuem um atributoresult
contendo a string gerada e, portanto,obj.result
nesta expressão define o valor de cada elemento do resultado como o valor doresult
atributo da instância de recurso correspondente.Veja como você pode integrar isso em sua
local.my_json
definição:Aliás:
Se essas strings que você está gerando realmente são senhas, pode ser mais apropriado usá-
random_password
las, que possuem um conjunto semelhante de recursos e argumentos.Além de ser apenas uma descrição melhor da intenção do recurso, o provedor também declara o resultado desse tipo de recurso como "sensível" para que o Terraform não mostre as senhas geradas na IU por padrão, mas ainda as salve em o estado para que você possa recuperá-los usando comandos
terraform output -raw json_output
quando necessário.