Francílio Araújo

Cola de Terraform

Conceitos

Linguagem

Resumo:

  • Terraform utiliza HCL como linguagem
  • HCL é uma linguagem de configuração construída por dois conceitos principais:
# Atributos
attribute = "value"

# Bloco
type ["value" ...] {
    (outros atributos ou blocos)
}
  • Valores de atributos também podem ser expressões
# Operações entre valores
soma = 1 + valor

# Interpolação de strings
mensagem = "Olá, ${nome}"

# Utilização de funções
mensagem_gritando = upper(mensagem)

Configuração do terraform

Referência: terraform (en)

terraform {
    # Declara a versão requerida do terraform
    required_version = "..."
    # Configuração do backend
    backend "<tipo>" {
        ...
    }
}

Declarando uma versão

  • 1.0.2, ou = 1.0.2
  • != 1.0.2
  • > 2
  • >= 2.0.5, < 3.0
  • ~> 1.0.2
  • ~> 2.1

Referência sobre backend: backend (en)

Provedor (provider)

Referência: Provedores (en)

terraform {
    # Define a versão do provedor
    required_providers {
        <nome> = {
            source  = <endereço>
            version = <versão>
        }
    }
}

# Configurações do provedor
provider "<nome>" {
    ...
}

Configuração múltipla de um provedor

provider "aws" {
    region = "us-east-1"
}

provider "aws" {
    # Define um alias para esta configuração
    alias  = "west"
    region = "us-east-2"
}

resource "aws_instance" "foo" {
    # Declara que este recurso faz uso da configuração
    # com alias "west" do provedor "aws"
    provider = aws.west
    ...
}

Passando um provedor alternativo para um módulo

Declarando o módulo:

terraform {
    required_providers {
        aws = {
            source  = "hashicorp/aws"
            version = "~> 5.0"
            # Declara um provedor com alias para o módulo,
            # já que módulos não possuem blocos provider
            configuration_aliases = [aws.backup]
        }
    }
}

data "aws_ami" "amazon_linux" {
    provider = aws.backup
}

Ao utilizar o módulo:

provider "aws" {
    alias  = "west"
    region = "us-west-2"
}

module "web-server" {
    source    = "./modules/web-server"
    # Passa o provedor com alias para o módulo
    providers = {
        aws.backup = aws.west
    }
}

Recursos (resources)

Referência: recursos (en)

# Deve ser referenciado como "tipo.nome"
resource "<tipo>" "<nome>" {
    ...

    # Permite definir timeouts para operações
    # específicas. Disponível apenas em alguns
    # recursos
    timeouts {
        create = "60m"
        delete = "2h
    }

}

Fontes de dados (data source)

Referência: fontes de dados (en)

# Deve ser referenciado como "data.tipo.nome"
data "<tipo>" "<nome>" {
    ...
}

Variáveis (variables)

Referência: variáveis (en)

# Deve ser referenciado como var.nome
variable "<nome>" {
    type        = string|number|bool|list(...)|tuple([...])|set(...)|map(...)|object({...})
    description = "..."

    # Opcionais

    # Declara um valor padrão, caso nenhum valor seja definido
    default   = ...
    # Marca o valor como sensível e previne que seja exibido
    # em saída da CLI
    sensitive = true
    # Declara que o valor pode ser nulo
    nullable  = true
    # Declara como o valor será validado
    validation {
        # Expressão que retorna verdadeiro ou falso
        condition     = ...
        # Mensagem que será exibida, caso o valor não seja válido
        error_message = "..." 
    }
}

Definindo valores para variáveis no módulo raiz:

  1. Argumentos -var e -var-file da CLI
  2. Arquivos
    1. *.auto.tfvars e *.auto.tfvars.json em ordem léxica
    2. terraform.tfvars.json
    3. terraform.tfvars
  3. Variáveis de ambiente (TF_VAR_*)
  4. O argumento default no bloco da variável

Locais (locals)

Referência: locais (en)

locals {
    # Deve ser referenciado como local.nome
    <nome> = <valor>
    ...
}

Podem existir múltiplos blocos locals

Saídas (outputs)

Referência: saídas (en)

output "<nome>" {
    description = "..."
    value       = ...
    # Marca o valor como sensível e previne que seja exibido
    # em saída da CLI
    sensitive   = true
}

Módulos (modules)

Referência: módulos (en)

Utilizando um módulo:

# Deve ser referenciado como module.nome
module "<nome>" {
    source  = "..."
    version = "..."
    ...
}

Meta-argumentos

Referência: meta-argumentos (en)

Valores efêmeros

Referência: gerencie dados sensíveis (en)

Disponível a partir do terraform v1.10

  • Argumento ephemeral = true em variáveis e saídas de módulos
  • Recursos efêmeros (ephemeral)
# Deve ser referenciado como ephemeral.nome
ephemeral "<tipo>" "<nome>" {
    ...
}

Disponível a partir do terraform v1.11

  • Argumento somente para escrita em recursos

Importando recursos

Referência: Importando (en)

Disponível a partir do terraform v1.12

# Deve estar em um arquivo com extensão .tfquery.hcl
# Deve ser referenciado como list.tipo.nome
list "<tipo>" "<nome>" {
    provider         = ...
    config           = ...
    include_resource = ...
    limit            = ...
}
import {
    id = "<id do recurso>"
    to = tipo.nome
}

resource "<tipo>" "<nome>" {
    ...
}

Alterando o estado

Referência: estado (en)

Disponível a partir do terraform v1.7

# Declara um recurso como removido
removed {
    from = tipo.nome
    lifecycle {
        destroy = false
    }
}

# Declara um recurso como movido
moved {
    from = <endereço antigo>
    to   = <endereço novo>
}

Ações (action)

Referência: ações (en)

Disponível a partir do terraform v1.14

action "<tipo>" "<nome>" {
    config {
        ...
    }
}

Validações

Referência: valide sua configuração (en)

Disponível a partir do terraform v1.5

check "<nome>" {
    data "<tipo>" "<nome>" {
        ...
    }

    assert {
        condition = ...
        error_message = "..."
    }
}

Teste da configuração

Referência: Testes (en)

Disponível a partir do terraform v1.6

# Deve estar em um arquivo com extensão .tftest.hcl
mock_provider "<nome>" {}

run "<nome>" {
    command = ...

    assert {
        condition = ...
        error_message = "..."
    }
}

Expressões

Referência: expressões (en)

Strings e templates

# String
"Olá"

# String heredoc
<<EOT
Essa string
pode abranger
várias linhas
EOT
<<-EOT
    Essa string
    pode ser identada
EOT

# Interpolação
"Olá, ${var.nome}"

# Diretivas
"Olá, %{ if var.name != "" }${ var.name }%{ else }unnamed%{ endif }"
<<EOT
%{ for ip in aws_instance.exemplo[*].private_ip }
server ${ip}
%{ endfor }
EOT

Operadores

  • Aritméticos: +, -, *, / e %
  • Igualdade: == e !=
  • Comparação: ||, && e !

Expressão condicional

<condição> ? <valor se verdadeiro> : <valor se falso>

Expressão for

# Criando uma tupla
[for <variável> in <coleção> : <resultado>]

# Criando um objeto
{for <variável> in {coleção} : <chave> => <valor>}

# Filtrando elementos
[for <variável> in <coleção> : <resultado> if <condição>]
{for <variável> in {coleção} : <chave> => <valor> if <condição>}

# Agrupando na mesma chave
{for <variável> in {coleção} : <chave> => <valor>...}

Expressões splat

# Equivalente a [for o in <coleção> : o.<atributo>]
<coleção>[*].<atributo>

Blocos dinâmicos

resource "<tipo>" "<valor>" {
    dynamic "<bloco>" {
        for_each = <coleção>
        content {
            ...
        }
    }
}

Funções

Referência: funções (en)

# Executando funções internas
<nome>(<argumentos>...)

# Funções de provedores
# Disponível a partir do terraform v1.8
provider::<nome provedor>::<nome função>(<argumentos>...)

Numéricas

FunçãoVersão do TerraformExemplo
abs(n)v0.10.7abs(-5) # 5
ceil(n)v0.10ceil(4.2) # 5
floor(n)v0.10floor(4.8) # 4
log(n, base)v0.10log(16, 2) # 4
max(n...)v0.10max(5, 12, 9) # 12
min(n...)v0.10min(5, 12, 9) # 5
parseint(s, base)v0.12.10parseint("FF", 16) # 255
pow(n, exp)v0.10pow(2, 3) # 8
signum(n)v0.6.12signum(-42) # -1

Strings

FunçãoVersão do TerraformExemplo
chomp(s)v0.9.3chomp("hello\n") # "hello"
endswith(s, suffix)v1.3.0endswith("arquivo.txt", ".txt") # true
format(s, values...)v0.4format("id-%03d", 7) # "id-007"
formatlist(s, values...)v0.5.1formatlist("srv-%02d", [1,2,3]) # ["srv-01","srv-02","srv-03"]
indent(n, s)v0.10.5indent(2, "a\nb") # " a\n b"
join(sep, list)v0.3join(",", ["a","b","c"]) # "a,b,c"
lower(s)v0.6.5lower("HELLO") # "hello"
regex(pattern, s)v0.12.7regex("[0-9]+", "id=42") # "42"
regexall(pattern, s)v0.12.7regexall("[0-9]+", "a1b22") # ["1","22"]
replace(s, substr, repl)v0.4replace("hello world","world","terraform") # "hello terraform"
split(sep, s)v0.4split(",", "a,b,c") # ["a","b","c"]
startswith(s, prefix)v1.3.0startswith("terraform", "terra") # true
strcontains(s, substr)v1.5.0strcontains("terraform", "form") # true
strrev(s)v0.12strrev("abc") # "cba"
substr(s, offset, length)v0.9.2substr("terraform",0,4) # "terr"
templatestring(template, vars)v1.9.0templatestring("hello ${name}", {name="ana"}) # "hello ana"
title(s)v0.7.8title("hello world") # "Hello World"
trim(s, cutset)v0.12.17trim("--hello--","-") # "hello"
trimprefix(s, prefix)v0.12.17trimprefix("dev-app","dev-") # "app"
trimsuffix(s, suffix)v0.12.17trimsuffix("file.txt",".txt") # "file"
trimspace(s)v0.6.11trimspace(" hello ") # "hello"
upper(s)v0.6.5upper("hello") # "HELLO"

Coleções

FunçãoVersão do TerraformExemplo
alltrue(list)v0.14alltrue([true, true, false]) # false
anytrue(list)v0.15anytrue([false, false, true]) # true
chunklist(list, size)v0.10.8chunklist(["a","b","c","d"], 2) # [["a","b"],["c","d"]]
coalesce(a...)v0.6.7coalesce("", "b") # "b"
coalescelist(lists...)v0.9.4coalescelist([], ["a","b"]) # ["a","b"]
compact(list)v0.6.4compact(["a","", "b"]) # ["a","b"]
concat(lists...)v0.12concat(["a"], ["b","c"]) # ["a","b","c"]
contains(collection, value)v0.12contains(["a","b","c"], "b") # true
distinct(list)v0.7distinct(["a","b","a"]) # ["a","b"]
element(list, index)v0.3.5element(["a","b","c"], 1) # "b"
flatten(list)v0.10.3flatten([["a","b"],["c"]]) # ["a","b","c"]
index(list, value)v0.6.4index(["a","b","c"], "b") # 1
keys(map)v0.12keys({a=1,b=2}) # ["a","b"]
length(collection)v0.5length(["a","b","c"]) # 3
lookup(map, key, default)v0.1lookup({a=1}, "b", 0) # 0
matchkeys(values, keys, searchset)v0.9.4matchkeys(["v1","v2"], ["k1","k2"], ["k2"]) # ["v2"]
merge(maps...)v0.7merge({a=1}, {b=2}) # {a=1,b=2}
one(list)v0.15one(["only"]) # "only"
range(max)v0.12.2range(3) # [0,1,2]
reverse(list)v0.12reverse(["a","b","c"]) # ["c","b","a"]
setintersection(sets...)v0.12setintersection(["a","b"], ["b","c"]) # ["b"]
setproduct(sets...)v0.12setproduct(["a","b"], [1,2]) # [["a",1],["a",2],["b",1],["b",2]]
setsubtract(set1, set2)v0.13setsubtract(["a","b","c"], ["b"]) # ["a","c"]
setunion(sets...)v0.12setunion(["a","b"], ["b","c"]) # ["a","b","c"]
slice(list, start, end)v0.9slice(["a","b","c","d"], 1, 3) # ["b","c"]
sort(list)v0.7sort(["c","a","b"]) # ["a","b","c"]
sum(list)v0.13sum([1,2,3]) # 6
transpose(map(list(string)))v0.12transpose({a=["x","y"], b=["x","z"]}) # {"x"=["a","b"],"y"=["a"],"z"=["b"]}
values(map)v0.12values({a=1,b=2}) # [1,2]
zipmap(keys, values)v0.7.8zipmap(["a","b"], [1,2]) # {a=1,b=2}

Codificação

FunçãoVersão do TerraformExemplo
base64decode(s)v0.6.4base64decode("SGVsbG8=") # "Hello"
base64encode(s)v0.6.4base64encode("Hello") # "SGVsbG8="
base64gzip(s)v0.10.3base64gzip("hello") # "H4sIAAAAA..."
csvdecode(s)v0.12csvdecode("name,age\nana,30") # [{name="ana",age="30"}]
jsondecode(s)v0.12jsondecode("{\"a\":1}") # {a=1}
jsonencode(v)v0.12jsonencode({a=1}) # "{\"a\":1}"
textdecodebase64(s, encoding)v0.15textdecodebase64("SGVsbG8=", "UTF-8") # "Hello"
textencodebase64(s, encoding)v0.15textencodebase64("Hello", "UTF-8") # "SGVsbG8="
urlencode(s)v0.10.3urlencode("a b") # "a%20b"
yamldecode(s)v0.12.2yamldecode("a: 1") # {a=1}
yamlencode(v)v0.12.2yamlencode({a=1}) # "a: 1\n"

Sistemas de Arquivo

FunçãoVersão do TerraformExemplo
abspath(path)v0.12.4abspath("modules/vpc") # "/home/user/project/modules/vpc"
dirname(path)v0.9.3dirname("/tmp/file.txt") # "/tmp"
pathexpand(path)v0.8.5pathexpand("~/.config") # /home/user/.config
basename(path)v0.9.3basename("/tmp/file.txt") # "file.txt"
file(path)v0.1file("${path.module}/config.txt") # conteúdo do arquivo
fileexists(path)v0.12fileexists("config.yaml") # true
fileset(path, pattern)v0.12.8fileset("configs", "*.yaml") # ["a.yaml","b.yaml"]
filebase64(path)v0.12filebase64("script.sh") # "IyEvYmluL2Jhc2gK..."
templatefile(path, vars)v0.12templatefile("config.tftpl", {name="app"})

Data e Hora

FunçãoVersão do TerraformExemplo
formatdate(layout, timestamp)v0.12formatdate("YYYY-MM-DD", "2024-01-02T15:04:05Z") # "2024-01-02"
plantimestamp()v1.5plantimestamp() # "2026-03-16T12:00:00Z"
timeadd(timestamp, duration)v0.11.2timeadd("2024-01-01T00:00:00Z", "24h") # "2024-01-02T00:00:00Z"
timecmp(timestamp_a, timestamp_b)v1.3timecmp("2024-01-01T00:00:00Z","2024-01-02T00:00:00Z") # -1
timestamp()v0.8timestamp() # "2026-03-16T12:34:56Z"

Hash e Criptografia

FunçãoVersão do TerraformExemplo
base64sha256(s)v0.6.11base64sha256("hello") # "LPJNul+wow4m..."
base64sha512(s)v0.9.5base64sha512("hello") # "m3HSJL1i..."
bcrypt(s, cost)v0.9.7bcrypt("secret", 10) # "$2a$10$..."
filebase64sha256(path)v0.12filebase64sha256("script.sh") # "47DEQpj8HBSa..."
filebase64sha512(path)v0.12filebase64sha512("script.sh") # "z4PhNX7vuL3x..."
filesmd5(path)v0.12filesmd5("script.sh") # "2fd4e1c67a2d..."
filesha1(path)v0.12filesha1("script.sh") # "3aa8bfae18f2..."
filesha256(path)v0.12filesha256("script.sh") # "9f86d081884c..."
filesha512(path)v0.12filesha512("script.sh") # "cf83e1357eef..."
md5(s)v0.6.12md5("hello") # "5d41402abc4b2a76b9719d911017c592"
rsadecrypt(cipher, privatekey)v0.11.2rsadecrypt(file("./ciphertext), file("privatekey.pem)) # "Olá, mundo!"
sha1(s)v0.6.9sha1("hello") # "aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d"
sha256(s)v0.6.10sha256("hello") # "2cf24dba5fb0a..."
sha512(s)v0.12sha512("hello") # "9b71d224bd62..."
uuid()v0.6.13uuid() # "3b12f1df-5232-4e0f-9b0e-3c3c9f0f0e91"
uuidv5(namespace, name)v0.12.2uuidv5("dns","example.com") # "cfbff0d1-9375-5685-968c-48ce8b15ae17"

Redes IP

FunçãoVersão do TerraformExemplo
cidrhost(prefix, hostnum)v0.6.6cidrhost("10.0.0.0/24", 5) # "10.0.0.5"
cidrnetmask(prefix)v0.6.6cidrnetmask("10.0.0.0/24") # "255.255.255.0"
cidrsubnet(prefix, newbits, netnum)v0.6.6cidrsubnet("10.0.0.0/16", 8, 2) # "10.0.2.0/24"
cidrsubnets(prefix, newbits...)v0.12.10cidrsubnets("10.0.0.0/16", 8, 8) # ["10.0.0.0/24","10.0.1.0/24"]

Conversão de tipos

FunçãoVersão do TerraformExemplo
tobool(v)v0.12tobool("true") # true
tonumber(v)v0.12tonumber("42") # 42
tostring(v)v0.12tostring(42) # "42"
tolist(v)v0.12tolist(["a","b"]) # ["a","b"]
toset(v)v0.12toset(["a","b","a"]) # ["a","b"]
tomap(v)v0.12tomap({a=1, b=2}) # {a=1, b=2}

Utilidades

FunçãoVersão do TerraformExemplo
can(expr)v0.12.20can(regex("[0-9]+", "abc")) # false
try(exprs...)v0.12.20try(var.obj.name, "default") # "default"
ephemeralasnull(v)v1.10ephemeralasnull(var.tmp) # null (se valor efêmero)
issensitive(v)v1.8issensitive(var.secret) # true
nonsensitive(v)v0.15nonsensitive(var.secret)
sensitive(v)v0.15sensitive("secret")
type(v)v1.0type({a=1}) # object({a=number})

CLI

Subcomandos principais

# Prepara o diretório atual
terraform init      [opções]
# Checa se a configuração é válida
terraform validate  [opções]
# Reformata a configuração no estilo padrão
terraform fmt       [opções] [alvo...]
# Mostra as mudanças requeridas pela configuração atual
terraform plan      [opções]
# Cria ou atualiza a infraestrutura
terraform apply     [opções] [arquivo]
# Destroi infraestrutura criada anteriormente
terraform destroy   [opções]

Init

Referência: init (en)

Uso: terraform init [opções]

  • -upgrade atualiza módulos e plugins
  • -backend-config=(<atributo>=<valor>|<arquivo>) completa a configuração do backend
  • -migrate-state tenta migrar o estado para o novo backend

Validate

Referência: validate (en)

Uso: terraform validate [opções]

Fmt

Referência: fmt (en)

Uso: terraform fmt [opções] [alvo...]

  • -check apenas checa se a configuração está formatada
  • -diff mostra o diff das modificações
  • -list=false não mostra a lista de arquivos inconsistentes

Plan

Referência: plan (en)

Uso: terraform plan [opções]

  • -var <nome>=<valor> define o valor de uma variável
  • -var-file=<arquivo> define o valor de variáveis através de um arquivo .tfvars
  • -out=<arquivo> salva o plano gerado em um arquivo
  • -target=<endereço> foca apenas no recurso em em recursos que ele depende
  • -destroy cria um plano pra remover os recursos
  • -invoke=action.<tipo>.<nome>cria um plano para uma ação

Apply

Referência: apply (en)

Uso: terraform apply [opções] [arquivo]

  • -auto-approve pula a aprovação

Destroy

Referência: destroy (en)

Uso: terraform destroy [opções]

Outros subcomandos

# Permite testar expressões em um prompt interativo
terraform console   [opções]
# Exibe o estado atual ou um plano
terraform show      [opções] [arquivo]
# Mostra informações sobre os provedores requeridos
terraform providers
# Mostra informações sobre os módulos
# Disponível a partir do terraform v1.10
terraform modules
# Permite alterar o estado
terraform state     <subcomando> [opções] [argumentos]
# Permite utilizar workspaces
terraform workspace <subcomando> [opções] [argumentos]

Console

Referência: console (en)

Uso: terraform console [opções]

  • -var <nome>=<valor> define o valor de uma variável
  • -var-file=<arquivo> define o valor de variáveis através de um arquivo .tfvars
  • -plan cria um plano e permite avaliar expressões como se o plano já estivesse aplicado

Show

Referência: show (en)

Uso: terraform show [opções] [arquivo]

Providers

Referência: providers (en)

Uso: terraform providers

Modules

Referência: modules (en)

Uso: terraform modules

State

Referência: state (en)

Uso: terraform state <subcomando> [opções] [argumentos]

Workspace

Referência: workspace (en)

Uso: terraform workspace <subcomando> [opções] [argumentos]

HCP Terraform

Referência: O que é HCP Terraform? (en)

terraform {
    cloud {
        organization = "..."

        workspaces {
            project = "..."
            name    = "..."
        }
    }
}

Linguagem

Referência: stacks (en)

# Deve estar em um arquivo com extensão .tfcomponent.hcl
required_providers {
    <nome_local> = {
        source  = "..."
        version = "..."
    }
}

provider "<nome_local>" "<nome>" {
    config {
        ...
    }
}

variable "<nome>" {
    ...
}

locals {
    ...
}

removed {
    source = "..."
    from   = ...

    providers = {
        ...
    }
}

component "<nome>" {
    source = "..."
    inputs = {
        ...
    }
    providers = {
        <nome> = provider.nome_local.nome
    }
}

output "<nome>" {
    ...
}
# Deve estar em um arquivo com extensão .tfdeploy.hcl
# Deve ser referenciado como store.varset.nome
store "varset" "<nome>" {
    id       = "..."
    name     = "..."
    category = "..."
}

# Deve ser referenciado como identity_token.tipo.jwt
identity_token "<tipo>" {
    audience = [...]
}

# Deve ser referenciado como deployment_auto_approve.nome
deployment_auto_approve "<nome>" {
    check {
        condition = ...
        reason    = "..."
    }
}

# Deve ser referenciado como deployment_group.nome
deployment_group "<nome>" {
    auto_approve_checks = [
        deployment_auto_approve.nome
    ]
}

# Deve ser referenciado como upstream_input.nome
upstream_input "<nome>" {
    type   = "..."
    source = "..."
}

locals {
    ...
}

deployment "<nome>" {
    inputs = {
        ...
    }

    deployment_group = deployment_group.nome
}

publish_output "<nome>" {
    description = "..."
    value       = ...
}

CLI

Referência: terraform stacks (en)

# Inicializa a stack
terraform stacks init               [opções]
# Cria uma stack
terraform stacks create             -organization-name ... -project-name ... -stack-name ... [opções]
# Lista as stacks
terraform stacks list               -organization-name ... [opções]
# Valida a stack
terraform stacks validate           [opções]
# Formata a stack
terraform stacks fmt                [opções] [arquivo...]
# Exibe as versões dos provedores da stack
terraform stacks provider-lock      [opções]
# Gerencia os deployments
terraform stacks deployment-run     <subcomando>
# Gerencia os grupos de deployment
terraform stacks deployment-group   <subcomando> [opções]
# Gerencia configurações
terraform stacks configuration      <subcomando> [opções]

Stack init

Referência: stacks init (en)

Uso: terraform stacks init [opções]

  • -upgrade Atualiza módulos e plugins

Stack create

Referência: stacks create (en)

Uso: terraform stacks create -organization-name ... -project-name ... -stack-name ... [opções]

  • -with-template Gera configuração inicial

Stack list

Referência: stacks list (en)

Uso: terraform stacks list -organization-name ... [opções]

Stack validate

Referência: stacks validate (en)

Uso: terraform stacks validate [opções]

Stack fmt

Referência: stacks fmt (en)

Uso: terraform stacks fmt [opções] [arquivo...]

Stack provider-lock

Referência: stacks provider-lock (en)

Uso: terraform stacks provider-lock [opções]

Stack deployment-run

Referência: stacks deployment-run (en)

Uso: terraform stacks deployment-run <subcomando>

Stack deployment-group

Referência: stacks deployment-group (en)

Uso: terraform stacks deployment-group <subcomando>

  • list [opções] lista grupos de deployment em uma configuração
  • approve-all-plans <identificação> aprova todos os planos para um grupo de deployment
    • -deployment-group-id ...
    • -organization-name ... -project-name ... -stack-name ... -deployment-group-name ...
  • rerun -deployment-names ... <identificação> reexecuta deployments dentro de um grupo de deployment
    • -deployment-group-id ...
    • -organization-name ... -project-name ... -stack-name ... -deployment-group-name ...
  • watch <identificação> acompanha o progresso de um deployment
    • -deployment-group-id ...
    • -organization-name ... -project-name ... -stack-name ... -deployment-group-name ...

Stack configuration

Referência: stacks configuration (en)

Uso: terraform stacks configuration <subcomando>

  • list <identificação> lista as versões de configurações de uma stack
    • -stack-id ...
    • -organization-name ... -project-name ... -stack-name ...
  • upload <identificação> faz o upload das configurações de componente e deployment
    • -stack-id ...
    • -organization-name ... -project-name ... -stack-name ...
  • fetch <identificação> faz o download da última configuração da stack
    • -stack-id ...
    • -organization-name ... -project-name ... -stack-name ...
  • watch <identificação> acompanha o progresso do deployment da stack
    • -stack-id ...
    • -organization-name ... -project-name ... -stack-name ...

OpenTofu

Incompatibilidades:

  • Meta-argumento enabled