Pular para o conteúdo
Aback Tools Logo

O que são HCL e HOCON? Linguagens de configuração explicadas

HCL e HOCON explicados: HCL move Terraform, Packer e Vault; HOCON move Akka e Play. Compare sintaxe, substituições, compatibilidade com JSON e quando usar cada um.

DH
Tutorials & How-Tos13 min de leitura2,750 palavras

HCL e HOCON são duas linguagens de configuração que você vai encontrar no desenvolvimento de infraestrutura e de aplicações: HCL no ecossistema HashiCorp (Terraform, Packer, Vault) e HOCON no ecossistema JVM (Akka, Play Framework, ferramentas Lightbend). As duas foram criadas para resolver o mesmo problema (o JSON é verboso e pouco legível demais para configurações complexas), mas seguem abordagens diferentes e não são intercambiáveis. Este guia explica os dois formatos desde o início: como são, onde são usados, como se comparam e quando escolher cada um.

2014Primeira versão do HCLPela HashiCorp para o Terraform
2011Primeira versão do HOCONPela Typesafe para o Akka
4+Ferramentas importantes usam HCLTerraform, Packer, Vault, Consul

O que é um arquivo HCL?

HCL significa HashiCorp Configuration Language. É uma linguagem de configuração específica de domínio criada pela HashiCorp em 2014, inicialmente para dar suporte ao Terraform. Os arquivos HCL usam a extensão `.hcl` (ou `.tf` especificamente para Terraform) e foram projetados para serem legíveis por humanos, analisáveis por máquinas e compatíveis com JSON: todo documento JSON válido também é HCL válido.

HCL não é uma linguagem de programação. Ele não executa cálculos, não define funções nem controla o fluxo do programa como Python ou JavaScript. É uma linguagem de configuração declarativa: você descreve o estado desejado da infraestrutura e a ferramenta que lê o HCL (Terraform, Packer, Vault, Consul, Nomad) decide como alcançá-lo. Essa restrição é intencional: torna as configurações HCL previsíveis e auditáveis.

Fundamentos da sintaxe HCL

HCL usa uma estrutura em blocos com atributos, blocos aninhados e expressões. Os atributos são pares chave-valor; os blocos agrupam atributos relacionados e podem ser aninhados. Os comentários usam `#` ou `//` em uma linha e `/* */` em várias.

Estrutura básica do HCL
hcl
# Comentário de uma linha
resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t3.micro"

  tags = {
    Name        = "web-server"
    Environment = "production"
  }

  # Bloco aninhado
  root_block_device {
    volume_size = 20
    encrypted   = true
  }
}

Onde o HCL é usado

  • Terraform: o principal consumidor de HCL; cada arquivo `.tf` é HCL que descreve infraestrutura na nuvem e on-premises.
  • Packer: o HCL2 (a versão 2 da linguagem) é usado para definir builds de imagens de máquina para AMIs da AWS, imagens do GCP e outras.
  • Vault: o HCL é usado em arquivos de política que definem regras de controle de acesso no HashiCorp Vault.
  • Consul: arquivos de configuração da malha de serviços, verificações de saúde e definições de serviço usam HCL.
  • Nomad: as especificações de job de orquestração de cargas são escritas em HCL.

Note

O HCL tem duas versões: HCL1 (original, usada no início do Terraform) e HCL2 (lançada em 2019, usada pelo Terraform 0.12+). O HCL2 introduziu avaliação real de expressões, expressões for, blocos dinâmicos e sintaxe mais rígida. Se você encontrar código antigo de Terraform que não usa `=` de forma consistente para atribuir atributos, provavelmente é HCL1. Todas as ferramentas modernas da HashiCorp usam HCL2.

O que é HOCON?

HOCON significa Human-Optimized Config Object Notation. Foi criado pela Typesafe (hoje Lightbend) em 2011 como formato de configuração da biblioteca Typesafe Config, que move o Akka, o Play Framework, o Lagom e outros frameworks baseados em JVM. Os arquivos HOCON usam a extensão `.conf` e são um superconjunto estrito do JSON: todo arquivo JSON válido é HOCON válido.

O HOCON foi pensado para a configuração em tempo de execução de aplicações, e não para definir infraestrutura. Seu recurso de destaque são as substituições: a capacidade de referenciar outros valores de configuração no mesmo arquivo pela sintaxe de substituição, referenciando por caminho outros valores de configuração ou variáveis de ambiente. Isso torna o HOCON especialmente adequado à configuração em camadas: um arquivo base define padrões e um arquivo específico de ambiente sobrescreve valores individuais, com substituições puxando de variáveis de ambiente ou de outras fontes de configuração.

Fundamentos da sintaxe HOCON

Estrutura básica do HOCON
hocon
# Configuração da aplicação
app {
  name = "my-service"
  version = "1.0.0"

  server {
    host = "0.0.0.0"
    port = 8080
    # Substituição a partir de uma variável de ambiente
    port = ${?APP_PORT}
  }

  database {
    url = "jdbc:postgresql://localhost:5432/mydb"
    # Substituição a partir de outro valor de configuração
    connection-pool = ${app.server.port}
  }
}

# Listas
allowed-origins = ["https://example.com", "https://api.example.com"]

Recursos do HOCON além do JSON

  • Comentários: comentários de uma linha com `#` e `//`; o JSON não aceita comentários.
  • Substituições: `${path.to.value}` referencia outras chaves; `${?ENV_VAR}` não falha se a variável não estiver definida.
  • Diretivas include: include "other.conf" funde arquivos de configuração externos no momento da análise.
  • Fusão de objetos: chaves duplicadas fundem seus valores em vez de sobrescrevê-los; permite configuração em camadas.
  • Flexibilidade de chave-valor: aceita key = value, key : value e key value (separado por espaço) de forma equivalente.
  • Strings sem aspas: valores de string simples não precisam de aspas, a menos que contenham caracteres especiais.

Tip

A sintaxe de substituição do HOCON é o recurso mais poderoso para implantações em produção. Definir port com uma substituição que referencia APP_PORT e um valor padrão de 8080 logo acima faz a aplicação usar a porta 8080 em desenvolvimento e o valor de APP_PORT em produção, sem mudar nada no código.

HCL vs HOCON: diferenças principais

HCL e HOCON resolvem problemas parecidos por ângulos diferentes. Os dois são mais legíveis que o JSON em configurações complexas, os dois aceitam comentários e os dois têm uma camada de compatibilidade com JSON. Mas seus objetivos de projeto, casos de uso principais e integrações de ecossistema são tão distintos que você raramente escolhe entre eles: a ferramenta que você usa escolhe por você.

HCL descreve qual infraestrutura deve existir. HOCON descreve como uma aplicação deve se comportar. A diferença de propósito molda cada decisão de projeto nas duas linguagens.

- Filosofias de projeto do HCL e do HOCON
AspectoHCLHOCON
Criado porHashiCorp (2014)Typesafe/Lightbend (2011)
Extensão de arquivo.hcl, .tf, .pkr.hcl.conf, .json (subconjunto JSON)
Uso principalInfraestrutura como códigoConfiguração de execução da aplicação
EcossistemaTerraform, Packer, VaultAkka, Play, Lagom, Spark
Compatível com JSON✓ JSON é HCL válido✓ JSON é HOCON válido
Comentários✓ # e // e /* */✓ # e //
Substituições✗ Usa variáveis de outro modo✓ ${path} e ${?ENV_VAR}
Incluir arquivos✗ Usa módulos em vez disso✓ include "file.conf"
Fusão de objetos✗ Blocos são ordenados✓ Chaves duplicadas se fundem
Expressões e lógica✓ Expressões, laços for✗ Apenas valores declarativos
Estrutura de blocos✓ Blocos com nome (resource "")✗ Apenas objetos aninhados

A diferença conceitual essencial

O HCL é imperativo quanto à estrutura: os blocos têm tipos e rótulos (`resource "aws_instance" "web"`) que carregam significado semântico interpretado pela ferramenta. Você declara entidades de um certo tipo com certas propriedades. O HOCON é puramente um formato de dados: define uma estrutura hierárquica de chave-valor que as aplicações leem ao iniciar. Não tem noção de blocos com tipo; tudo é uma chave apontando para um valor, um objeto ou uma lista.

Note

Você não pode usar HCL onde se espera HOCON, nem o contrário. Uma aplicação Akka configurada para ler `application.conf` usará o analisador de HOCON/Typesafe Config; entregar um arquivo HCL a ela gerará erro de análise. Do mesmo modo, o Terraform só aceita HCL2 (ou JSON) nos arquivos de configuração: HOCON não é uma entrada válida para o Terraform.

Trabalhar com arquivos HCL na prática

Arquivos HCL são editados com mais frequência como parte de um projeto Terraform, embora os mesmos princípios valham para Packer, Vault e Nomad. Acertar no formato e na estrutura importa porque as ferramentas da HashiCorp validam o HCL de forma rígida na fase de plan ou validate, e blocos HCL malformados geram erros difíceis de rastrear se o arquivo não estiver consistentemente indentado.

1

Formate seus arquivos HCL para manter a consistência

O Formatador HCL do Aback Tools formata e embeleza arquivos HCL com indentação de 2 espaços, espaçamento consistente de atributos e estrutura de blocos limpa. Cole qualquer arquivo `.hcl` ou `.tf` e receba uma saída formatada de forma uniforme, pronta para usar com Terraform, Packer, Vault, Consul ou Nomad, tudo no seu navegador.

2

Converta HCL para YAML quando necessário

Quando um sistema de CI, ferramenta de documentação ou processador de pipeline precisa da configuração HCL em formato YAML, o Conversor de HCL para YAML faz a tradução estrutural. Isso é comum ao extrair definições de variáveis do Terraform para usar em playbooks do Ansible ou config maps do Kubernetes.

3

Valide a nomenclatura de recursos HCL do Terraform

Nomes de recursos HCL no Terraform precisam seguir convenções consistentes em todo o time para manter o código revisável. O Verificador de convenções de nomenclatura de recursos do Terraform, em `/tools/data/validators/terraform-resource-naming-convention-checker`, valida se os nomes dos seus recursos, variáveis e módulos seguem o estilo escolhido antes de você rodar `terraform plan`.

Formatador HCL

Formate e embeleze qualquer arquivo HCL ou do Terraform com indentação de 2 espaços, espaçamento consistente de atributos e estrutura de blocos limpa, no seu navegador.

Open tool

Trabalhar com arquivos HOCON na prática

Em projetos JVM, os arquivos de configuração HOCON normalmente ficam em `src/main/resources/application.conf`. Aplicações Akka usam HOCON para a configuração do sistema de atores, ajustes de dispatcher e configuração de extensões. O Play Framework usa para rotas, conexões de banco de dados e configurações da aplicação. O formato é permissivo (strings sem aspas, operadores de atribuição flexíveis, comentários), mas uma formatação sensível a espaços torna os arquivos mais fáceis de ler e manter.

Formatar arquivos HOCON

O Formatador HOCON do Aback Tools formata arquivos de configuração HOCON com indentação consistente de 4 espaços, espaçamento correto de chave-valor, tratamento limpo de substituições e as convenções do Typesafe Config. Isso é especialmente útil ao editar arquivos grandes de Akka ou Play que acumularam formatação inconsistente por causa de vários colaboradores.

Converter HOCON para YAML

Quando uma ferramenta do seu pipeline espera YAML mas a configuração da sua aplicação é HOCON, o Conversor de HOCON para YAML traduz a estrutura de chave-valor do HOCON para o equivalente em YAML. Note que os recursos específicos do HOCON (substituições, diretivas include e chaves fundidas) são resolvidos antes da conversão, então a saída YAML reflete a configuração final fundida, e não a sintaxe bruta do template HOCON.

Warning

Substituições e diretivas include do HOCON são resolvidas no momento da análise pela biblioteca Typesafe Config, e não de forma estática no arquivo. Ao converter HOCON para YAML com uma ferramenta, substituições que referenciam variáveis de ambiente aparecerão como seu valor literal ou serão omitidas se a variável não estiver definida no ambiente de conversão. Verifique a saída antes de usar em produção.

Formatador HOCON

Formate arquivos de configuração HOCON com indentação consistente de 4 espaços, tratamento correto de substituições e as convenções do Typesafe Config, tudo no seu navegador.

Open tool

HCL e HOCON ao lado de outros formatos de configuração

HCL e HOCON convivem com um panorama mais amplo de formatos de configuração. Escolher o certo raramente é uma decisão livre: as ferramentas que você usa ditam o formato. Mas entender onde cada formato se encaixa ajuda a raciocinar sobre portabilidade de configuração e trade-offs de ferramentas.

Comparação dos principais formatos de configuração

FormatoLegívelComentáriosIdeal para
JSON✗ Verboso✗ NenhumAPIs, intercâmbio de dados
YAML✓ Muito✓ #K8s, CI/CD, configuração geral
TOML✓ Bom✓ #Config de apps, Rust, ferramentas Python
INI✓ Simples✓ # ;Chave-valor simples, aplicações legadas
HCL✓ Bom✓ # //Infraestrutura como código
HOCON✓ Bom✓ # //Config de apps JVM, Akka, Play

HCL e YAML juntos em fluxos de trabalho com Terraform

Na prática, um projeto Terraform usa HCL para todas as definições de infraestrutura, enquanto o pipeline de CI/CD que roda o Terraform costuma ser configurado em YAML (GitHub Actions, GitLab CI, CircleCI). Os dois convivem sem conflito: o HCL é a entrada do Terraform e o YAML é a entrada do pipeline. Se você trabalha com os dois, a mesma disciplina de formatação se aplica. Para erros de YAML nos seus arquivos de CI, o fluxo de Como detectar e corrigir erros de YAML se aplica diretamente.

HOCON, TOML e YAML para configuração de aplicações

Para aplicações que não são JVM, TOML e YAML são escolhas mais comuns que HOCON. O TOML é o padrão do Rust (Cargo.toml), do empacotamento Python (pyproject.toml) e de sites estáticos em Hugo. O YAML domina Kubernetes, Ansible, Docker Compose e a maior parte das ferramentas cloud native. O HOCON é a escolha certa especificamente quando o seu runtime é um framework JVM que já vem com Typesafe Config: você ganha os recursos do HOCON de graça, e brigar com o framework para usar outro formato cria mais problemas do que resolve.


Artigos relacionados sobre formatos

Se você está avaliando formatos de configuração para um projeto novo, os artigos complementares desta série cobrem as alternativas mais próximas. Como criar um arquivo INI trata do formato de configuração mais simples. Como comentar em YAML corretamente detalha a sintaxe do YAML. E O que o terraform validate realmente verifica? mostra como erros de HCL aparecem em um fluxo de trabalho com Terraform.

Tip

Se você está escrevendo uma biblioteca ou ferramenta nova que precisa de um formato de configuração, considere o TOML antes do HCL ou do HOCON. O TOML tem amplo suporte de analisadores em todas as linguagens importantes, uma especificação simples e nenhum acoplamento de ecossistema. Reserve o HCL para ferramentas da HashiCorp e o HOCON para integrações JVM/Typesafe Config em que o framework espera esse formato.

Key takeaways

  • HCL (HashiCorp Configuration Language) é um formato declarativo de infraestrutura como código, usado por Terraform, Packer, Vault, Consul e Nomad. A versão atual é o HCL2.
  • HOCON (Human-Optimized Config Object Notation) é um superconjunto do JSON para configuração de execução de aplicações JVM, usado por Akka, Play Framework e ferramentas Lightbend.
  • Os dois formatos aceitam comentários e são compatíveis com JSON, mas não são intercambiáveis: a ferramenta que você usa determina qual formato adotar.
  • O recurso-chave do HCL são os blocos com tipo e nome (`resource "aws_instance" "web"`); o do HOCON são as substituições de variáveis (`${?ENV_VAR}`) e a fusão de objetos.
  • Use o Formatador HCL para formatação HCL consistente e o Formatador HOCON para HOCON: os dois rodam no navegador, sem envio de arquivos.
  • Para projetos que não são JVM nem da HashiCorp, TOML ou YAML costumam ser escolhas melhores que HCL ou HOCON, pelo suporte mais amplo de analisadores e pela ausência de acoplamento de ecossistema.

Perguntas frequentes

Um arquivo HCL é um arquivo de configuração escrito em HashiCorp Configuration Language, um formato declarativo criado pela HashiCorp em 2014. Os arquivos HCL usam a extensão .hcl (ou .tf para Terraform, .pkr.hcl para Packer) e descrevem o estado desejado da infraestrutura usando blocos com tipo e nome e atribuições de atributos. Todo documento JSON válido também é HCL2 válido, o que facilita a migração. HCL é usado por Terraform, Packer, Vault, Consul e Nomad.

HOCON significa Human-Optimized Config Object Notation. É um formato de configuração criado pela Typesafe (hoje Lightbend) em 2011 como superconjunto do JSON. Os arquivos HOCON usam a extensão .conf e oferecem suporte a comentários, substituições de variáveis (${?ENV_VAR}), diretivas include e fusão de objetos. HOCON é o formato de configuração nativo do Akka, Play Framework, Lagom e de outros frameworks JVM que usam a biblioteca Typesafe Config.

HCL é para infraestrutura como código: usa blocos com tipo e nome para declarar recursos de infraestrutura e é interpretado pelas ferramentas da HashiCorp. HOCON é para a configuração de execução de aplicações: usa estrutura hierárquica de chave-valor com substituições e fusão, interpretada pela biblioteca Typesafe Config. Os dois são compatíveis com JSON e aceitam comentários, mas não são intercambiáveis: o Terraform espera HCL, o Akka espera HOCON e nenhum analisador aceita o formato do outro.

Não. O Kubernetes e o GitHub Actions usam analisadores de YAML que esperam sintaxe YAML. O HCL tem uma sintaxe diferente (blocos com tipo, nomes de atributo sem aspas, notação de lista distinta) que não é YAML válido. Essas ferramentas não trazem suporte nativo a analisador HCL. Do mesmo modo, você não pode usar HOCON para manifestos do Kubernetes. Se precisar fazer a ponte do HCL para uma ferramenta baseada em YAML, use o Conversor de HCL para YAML para gerar uma representação YAML dos seus dados de configuração.

HCL é a linguagem de configuração que o Terraform usa, mas HCL não é Terraform. HCL é uma linguagem de configuração de propósito geral que outras ferramentas da HashiCorp também usam: Packer, Vault, Consul e Nomad leem arquivos HCL. Terraform é uma ferramenta de provisionamento de infraestrutura que, por acaso, usa HCL como formato de configuração. Quando as pessoas dizem «arquivos do Terraform», querem dizer arquivos .tf escritos em HCL2, mas o HCL em si é uma especificação de linguagem independente publicada pela HashiCorp.

Sim. Todo arquivo JSON válido também é HOCON válido: o analisador HOCON aceita a sintaxe JSON sem modificações. HOCON estende o JSON adicionando comentários (# e //), vírgulas e aspas opcionais para strings simples, atribuição chave-valor com = ou :, substituições (${path}), diretivas include e fusão de objetos quando a mesma chave aparece várias vezes. Essa compatibilidade com JSON significa que você pode começar com uma configuração JSON e adotar recursos do HOCON aos poucos, sem reescrever o arquivo.

Para arquivos HCL, use o Formatador HCL do Aback Tools em /tools/data/formatters/hcl-formatter: ele aplica indentação de 2 espaços, espaçamento consistente de atributos e estrutura de blocos limpa. Para arquivos do Terraform especificamente, o comando oficial `terraform fmt` também formata arquivos .tf. Para arquivos HOCON, use o Formatador HOCON em /tools/data/formatters/hocon-formatter para indentação consistente de 4 espaços e as convenções do Typesafe Config. As duas ferramentas rodam no navegador sem precisar enviar arquivos.

Use HOCON quando estiver construindo uma aplicação JVM com um framework que já traz Typesafe Config (Akka, Play, Lagom): você ganha o suporte a HOCON de graça e a documentação do framework parte desse formato. Use YAML quando construir uma aplicação que não seja JVM, ao containerizar com Docker/Kubernetes ou ao usar um framework como Spring Boot com suporte nativo a YAML. Misturar formatos em um projeto cria complexidade desnecessária de ferramentas: alinhe o formato de configuração com o que o seu framework de execução espera nativamente.

ShareXLinkedIn