Перейти к содержимому
Aback Tools Logo

Что такое HCL и HOCON? Языки конфигурации с объяснением

HCL и HOCON простыми словами: HCL работает в Terraform, Packer и Vault, HOCON — в Akka и Play. Сравнение синтаксиса, подстановок, совместимости с JSON и случаев применения.

DH
Tutorials & How-Tos13 мин чтения2,750 слов

HCL и HOCON — два языка конфигурации, с которыми вы столкнётесь в разработке инфраструктуры и приложений: HCL в экосистеме HashiCorp (Terraform, Packer, Vault), HOCON в экосистеме JVM (Akka, Play Framework, инструменты Lightbend). Оба создавались для решения одной проблемы — JSON слишком многословен и неудобен для сложной конфигурации, — но идут разными путями и не взаимозаменяемы. В этом руководстве оба формата разбираются с нуля: как они выглядят, где применяются, как соотносятся и когда выбирать каждый.

2014Первый выпуск HCLОт HashiCorp для Terraform
2011Первый выпуск HOCONОт Typesafe для Akka
4+Крупные инструменты на HCLTerraform, Packer, Vault, Consul

Что такое файл HCL?

HCL расшифровывается как HashiCorp Configuration Language. Это предметно-ориентированный язык конфигурации, созданный HashiCorp в 2014 году, изначально для поддержки Terraform. Файлы HCL используют расширение `.hcl` (или `.tf` именно для Terraform) и рассчитаны на читаемость человеком, разбор машиной и совместимость с JSON: любой корректный документ JSON является корректным HCL.

HCL не является языком программирования. Он не выполняет вычислений, не определяет функции и не управляет ходом программы так, как Python или JavaScript. Это декларативный язык конфигурации: вы описываете желаемое состояние инфраструктуры, а инструмент, читающий HCL (Terraform, Packer, Vault, Consul, Nomad), решает, как его достичь. Это ограничение намеренно — оно делает конфигурации HCL предсказуемыми и проверяемыми.

Основы синтаксиса HCL

HCL использует блочную структуру с атрибутами, вложенными блоками и выражениями. Атрибуты — это пары «ключ — значение»; блоки группируют связанные атрибуты и могут быть вложенными. Комментарии задаются `#` или `//` для одной строки и `/* */` для нескольких.

Базовая структура HCL
hcl
# Однострочный комментарий
resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t3.micro"

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

  # Вложенный блок
  root_block_device {
    volume_size = 20
    encrypted   = true
  }
}

Где используется HCL

  • Terraform — основной потребитель HCL; каждый файл `.tf` это HCL, описывающий облачную и локальную инфраструктуру.
  • Packer — на HCL2 (вторая версия языка) описываются сборки образов машин для AMI AWS, образов GCP и других.
  • Vault — HCL используется в файлах политик, определяющих правила контроля доступа в HashiCorp Vault.
  • Consul — файлы конфигурации сервисной сети, проверки работоспособности и описания сервисов пишутся на HCL.
  • Nomad — спецификации заданий оркестрации нагрузок пишутся на HCL.

Note

У HCL две версии: HCL1 (исходная, использовалась в раннем Terraform) и HCL2 (выпущена в 2019 году, используется в Terraform 0.12+). HCL2 добавила полноценное вычисление выражений, выражения for, динамические блоки и более строгий синтаксис. Если вы встретите старый код Terraform, где `=` не применяется единообразно для присваивания атрибутов, скорее всего это HCL1. Все современные инструменты HashiCorp используют HCL2.

Что такое HOCON?

HOCON расшифровывается как Human-Optimized Config Object Notation. Он создан Typesafe (сегодня Lightbend) в 2011 году как формат конфигурации библиотеки Typesafe Config, которая лежит в основе Akka, Play Framework, Lagom и других JVM-фреймворков. Файлы HOCON используют расширение `.conf` и являются строгим надмножеством JSON: любой корректный файл JSON корректен и как HOCON.

HOCON предназначен для конфигурации приложений во время выполнения, а не для описания инфраструктуры. Его главная особенность — подстановки: возможность ссылаться на другие значения конфигурации в том же файле с помощью синтаксиса подстановки, обращаясь по пути к другим значениям или переменным окружения. Это делает HOCON особенно удобным для многоуровневой конфигурации: базовый файл задаёт значения по умолчанию, файл для конкретной среды переопределяет отдельные значения, а подстановки берут данные из переменных окружения или других источников.

Основы синтаксиса HOCON

Базовая структура HOCON
hocon
# Конфигурация приложения
app {
  name = "my-service"
  version = "1.0.0"

  server {
    host = "0.0.0.0"
    port = 8080
    # Подстановка из переменной окружения
    port = ${?APP_PORT}
  }

  database {
    url = "jdbc:postgresql://localhost:5432/mydb"
    # Подстановка из другого значения конфигурации
    connection-pool = ${app.server.port}
  }
}

# Списки
allowed-origins = ["https://example.com", "https://api.example.com"]

Возможности HOCON помимо JSON

  • Комментарии — однострочные комментарии `#` и `//`; JSON комментариев не поддерживает.
  • Подстановки — `${path.to.value}` ссылается на другие ключи; `${?ENV_VAR}` не вызывает ошибки, если переменная не определена.
  • Директивы include — include "other.conf" объединяет внешние файлы конфигурации на этапе разбора.
  • Слияние объектов — повторяющиеся ключи сливают значения вместо перезаписи; это позволяет строить слоистую конфигурацию.
  • Гибкость записи «ключ — значение» — равнозначно поддерживаются key = value, key : value и key value (через пробел).
  • Строки без кавычек — простые строковые значения не требуют кавычек, если не содержат специальных символов.

Tip

Синтаксис подстановок HOCON — самая мощная возможность для продуктивных развёртываний. Если задать port через подстановку из APP_PORT, а выше указать значение по умолчанию 8080, приложение использует порт 8080 при разработке и значение APP_PORT в продакшене — без единой правки кода.

HCL против HOCON: ключевые различия

HCL и HOCON решают похожие задачи с разных сторон. Оба читабельнее JSON для сложных конфигураций, оба поддерживают комментарии и оба имеют слой совместимости с JSON. Но их цели проектирования, основные сценарии и интеграции с экосистемами настолько различны, что выбирать между ними почти не приходится — инструмент выбирает за вас.

HCL описывает, какая инфраструктура должна существовать. HOCON описывает, как должно вести себя приложение. Разница в назначении определяет каждое проектное решение в обоих языках.

- Философия проектирования HCL и HOCON
ХарактеристикаHCLHOCON
СозданHashiCorp (2014)Typesafe/Lightbend (2011)
Расширение файла.hcl, .tf, .pkr.hcl.conf, .json (подмножество JSON)
Основное применениеИнфраструктура как кодКонфигурация приложения во время работы
ЭкосистемаTerraform, Packer, VaultAkka, Play, Lagom, Spark
Совместимость с JSON✓ JSON — корректный HCL✓ JSON — корректный HOCON
Комментарии✓ # и // и /* */✓ # и //
Подстановки✗ Переменные работают иначе✓ ${path} и ${?ENV_VAR}
Включение файлов✗ Используются модули✓ include "file.conf"
Слияние объектов✗ Блоки упорядочены✓ Повторяющиеся ключи сливаются
Выражения и логика✓ Выражения, циклы for✗ Только декларативные значения
Структура блоков✓ Именованные блоки (resource "")✗ Только вложенные объекты

Ключевое концептуальное различие

HCL императивен по структуре: блоки имеют типы и метки (`resource "aws_instance" "web"`), несущие смысл, который интерпретирует инструмент. Вы объявляете сущности определённого типа с определёнными свойствами. HOCON — чисто формат данных: он задаёт иерархическую структуру «ключ — значение», которую приложения читают при запуске. Понятия типизированных блоков здесь нет; всё это ключ, указывающий на значение, объект или список.

Note

Нельзя использовать HCL там, где ожидается HOCON, и наоборот. Приложение Akka, настроенное на чтение `application.conf`, будет использовать парсер HOCON/Typesafe Config; файл HCL вызовет ошибку разбора. Аналогично Terraform принимает в файлах конфигурации только HCL2 (или JSON) — HOCON не является допустимым входом для Terraform.

Работа с файлами HCL на практике

Файлы HCL чаще всего правят в рамках проекта Terraform, хотя те же принципы применимы к Packer, Vault и Nomad. Корректность форматирования и структуры важна, потому что инструменты HashiCorp строго проверяют HCL на этапе plan или validate, а неправильно оформленные блоки дают ошибки, которые трудно отследить, если файл не имеет единообразных отступов.

1

Форматируйте файлы HCL для единообразия

Форматтер HCL от Aback Tools форматирует и приводит в порядок файлы HCL: отступ в 2 пробела, единообразные интервалы в атрибутах и аккуратная структура блоков. Вставьте любой файл `.hcl` или `.tf` и получите единообразный результат, готовый к работе с Terraform, Packer, Vault, Consul или Nomad — полностью в браузере.

2

Конвертируйте HCL в YAML при необходимости

Когда системе CI, инструменту документации или обработчику конвейера нужна конфигурация HCL в формате YAML, структурную трансляцию выполняет конвертер HCL в YAML. Это часто требуется при извлечении определений переменных Terraform для использования в плейбуках Ansible или config map в Kubernetes.

3

Проверяйте имена ресурсов HCL в Terraform

Имена ресурсов HCL в Terraform должны следовать единым соглашениям в команде, чтобы код оставался удобным для ревью. Проверка соглашений об именовании ресурсов Terraform по адресу `/tools/data/validators/terraform-resource-naming-convention-checker` проверяет, что имена ресурсов, переменных и модулей соответствуют выбранному стилю, до запуска `terraform plan`.

Форматтер HCL

Форматируйте и приводите в порядок любой файл HCL или Terraform: отступ в 2 пробела, единообразные интервалы в атрибутах и аккуратная структура блоков — прямо в браузере.

Open tool

Работа с файлами HOCON на практике

В проектах JVM файлы конфигурации HOCON обычно лежат в `src/main/resources/application.conf`. Приложения Akka используют HOCON для настройки акторной системы, параметров диспетчеров и конфигурации расширений. Play Framework применяет его для маршрутов, подключений к базе данных и настроек приложения. Формат снисходителен к записи (строки без кавычек, гибкие операторы присваивания, комментарии), но форматирование с учётом отступов делает файлы понятнее и проще в поддержке.

Форматирование файлов HOCON

Форматтер HOCON от Aback Tools форматирует конфигурации HOCON с единообразным отступом в 4 пробела, правильными интервалами «ключ — значение», аккуратной обработкой подстановок и соглашениями Typesafe Config. Это особенно полезно при правке больших конфигураций Akka или Play, где форматирование стало неоднородным из-за разных авторов.

Конвертация HOCON в YAML

Когда инструменту в вашем конвейере нужен YAML, а конфигурация приложения написана на HOCON, конвертер HOCON в YAML переводит структуру «ключ — значение» в эквивалент YAML. Учтите, что особенности HOCON (подстановки, директивы include и слитые ключи) разрешаются до конвертации, поэтому итоговый YAML отражает финальную объединённую конфигурацию, а не исходный синтаксис шаблона HOCON.

Warning

Подстановки и директивы include в HOCON разрешает библиотека Typesafe Config на этапе разбора, а не статически в файле. При конвертации HOCON в YAML инструментом подстановки, ссылающиеся на переменные окружения, появятся как буквальные значения либо будут опущены, если переменная не задана в среде конвертации. Проверяйте результат перед использованием в продакшене.

Форматтер HOCON

Форматируйте файлы конфигурации HOCON с единообразным отступом в 4 пробела, корректной обработкой подстановок и соглашениями Typesafe Config — полностью в браузере.

Open tool

HCL и HOCON рядом с другими форматами конфигурации

HCL и HOCON существуют в более широком ландшафте форматов конфигурации. Выбор подходящего редко бывает свободным: инструменты, которые вы используете, диктуют формат. Но понимание того, где какой формат уместен, помогает рассуждать о переносимости конфигурации и компромиссах в инструментах.

Сравнение основных форматов конфигурации

ФорматЧитабельностьКомментарииЛучше всего для
JSON✗ Многословен✗ НетAPI, обмен данными
YAML✓ Очень высокая✓ #K8s, CI/CD, общая конфигурация
TOML✓ Хорошая✓ #Конфигурация приложений, Rust, Python
INI✓ Простой✓ # ;Простые «ключ — значение», старые приложения
HCL✓ Хорошая✓ # //Инфраструктура как код
HOCON✓ Хорошая✓ # //Конфигурация JVM-приложений, Akka, Play

HCL и YAML вместе в работе с Terraform

На практике проект Terraform использует HCL для всех описаний инфраструктуры, а конвейер CI/CD, который запускает Terraform, часто настроен на YAML (GitHub Actions, GitLab CI, CircleCI). Они сосуществуют без конфликта: HCL — вход Terraform, YAML — вход конвейера. Если вы работаете с обоими, дисциплина форматирования нужна одинаковая. Для ошибок YAML в файлах CI напрямую применим разбор из статьи Как находить и исправлять ошибки YAML.

HOCON, TOML и YAML для конфигурации приложений

Для приложений, не работающих на JVM, TOML и YAML встречаются чаще, чем HOCON. TOML — стандарт для Rust (Cargo.toml), упаковки Python (pyproject.toml) и статических сайтов на Hugo. YAML доминирует в Kubernetes, Ansible, Docker Compose и большинстве cloud-native инструментов. HOCON — правильный выбор именно тогда, когда ваш рантайм это JVM-фреймворк со встроенным Typesafe Config: возможности HOCON достаются бесплатно, а борьба с фреймворком ради другого формата создаёт больше проблем, чем решает.


Связанные материалы о форматах

Если вы оцениваете форматы конфигурации для нового проекта, парные статьи этой серии рассматривают ближайшие альтернативы. Как создать файл INI описывает самый простой формат конфигурации. Как правильно комментировать в YAML разбирает особенности синтаксиса YAML. А Что на самом деле проверяет terraform validate? показывает, как ошибки HCL проявляются именно в рабочем процессе Terraform.

Tip

Если вы пишете новую библиотеку или инструмент, которому нужен формат конфигурации, рассмотрите TOML прежде HCL или HOCON. У TOML широкая поддержка парсеров во всех основных языках, простая спецификация и отсутствие привязки к экосистеме. HCL оставьте для инструментов HashiCorp, а HOCON — для интеграций с JVM/Typesafe Config, где формат ожидается фреймворком.

Key takeaways

  • HCL (HashiCorp Configuration Language) — декларативный формат для инфраструктуры как кода, используемый Terraform, Packer, Vault, Consul и Nomad. Актуальная версия — HCL2.
  • HOCON (Human-Optimized Config Object Notation) — надмножество JSON для конфигурации JVM-приложений во время выполнения, используемое Akka, Play Framework и инструментами Lightbend.
  • Оба формата поддерживают комментарии и совместимы с JSON, но они не взаимозаменяемы: инструмент, который вы используете, определяет формат.
  • Ключевая особенность HCL — типизированные именованные блоки (`resource "aws_instance" "web"`); ключевая особенность HOCON — подстановки переменных (`${?ENV_VAR}`) и слияние объектов.
  • Используйте форматтер HCL для единообразного форматирования HCL и форматтер HOCON для HOCON — оба работают в браузере без загрузки файлов.
  • Для проектов вне JVM и вне HashiCorp обычно лучше подходят TOML или YAML: шире поддержка парсеров и нет привязки к экосистеме.

Частые вопросы

Файл HCL — это файл конфигурации, написанный на HashiCorp Configuration Language, декларативном формате, созданном HashiCorp в 2014 году. Файлы HCL используют расширение .hcl (или .tf для Terraform, .pkr.hcl для Packer) и описывают желаемое состояние инфраструктуры с помощью типизированных именованных блоков и присваиваний атрибутов. Любой корректный документ JSON одновременно является корректным HCL2, что упрощает миграцию. HCL используется в Terraform, Packer, Vault, Consul и Nomad.

HOCON расшифровывается как Human-Optimized Config Object Notation. Это формат конфигурации, созданный Typesafe (сегодня Lightbend) в 2011 году как надмножество JSON. Файлы HOCON используют расширение .conf и поддерживают комментарии, подстановки переменных (${?ENV_VAR}), директивы include и слияние объектов. HOCON — родной формат конфигурации для Akka, Play Framework, Lagom и других JVM-фреймворков, использующих библиотеку Typesafe Config.

HCL предназначен для инфраструктуры как кода: он использует типизированные именованные блоки для объявления инфраструктурных ресурсов и интерпретируется инструментами HashiCorp. HOCON предназначен для конфигурации приложений во время выполнения: он использует иерархическую структуру «ключ — значение» с подстановками и слиянием, интерпретируемую библиотекой Typesafe Config. Оба формата совместимы с JSON и поддерживают комментарии, но они не взаимозаменяемы: Terraform ожидает HCL, Akka ожидает HOCON, и ни один парсер не принимает формат другого.

Нет. Kubernetes и GitHub Actions используют парсеры YAML, которые ожидают синтаксис YAML. Синтаксис HCL другой (типизированные блоки, имена атрибутов без кавычек, иная нотация списков) и не является корректным YAML. Эти инструменты не содержат встроенной поддержки парсера HCL. Точно так же HOCON нельзя использовать для манифестов Kubernetes. Если нужно связать HCL с инструментом на YAML, используйте конвертер HCL в YAML, чтобы получить YAML-представление ваших данных конфигурации.

HCL — это язык конфигурации, который использует Terraform, но HCL не является Terraform. HCL — универсальный язык конфигурации, который применяют и другие инструменты HashiCorp: Packer, Vault, Consul и Nomad читают файлы HCL. Terraform — инструмент развёртывания инфраструктуры, который использует HCL как формат конфигурации. Когда говорят «файлы Terraform», имеют в виду файлы .tf, написанные на HCL2, но сам HCL — самостоятельная спецификация языка, опубликованная HashiCorp.

Да. Любой корректный файл JSON одновременно является корректным HOCON: парсер HOCON принимает синтаксис JSON без изменений. HOCON расширяет JSON, добавляя комментарии (# и //), необязательные запятые и кавычки для простых строк, присваивание «ключ — значение» через = или :, подстановки (${path}), директивы include и слияние объектов, когда один и тот же ключ встречается несколько раз. Совместимость с JSON означает, что можно начать с конфигурации JSON и постепенно переходить на возможности HOCON, не переписывая файл.

Для файлов HCL используйте форматтер HCL от Aback Tools по адресу /tools/data/formatters/hcl-formatter: он применяет отступ в 2 пробела, единообразные интервалы в атрибутах и аккуратную структуру блоков. Для файлов Terraform также подходит официальная команда `terraform fmt`. Для файлов HOCON используйте форматтер HOCON по адресу /tools/data/formatters/hocon-formatter — он даёт единообразный отступ в 4 пробела и соглашения Typesafe Config. Оба инструмента работают в браузере без загрузки файлов.

Используйте HOCON, если вы создаёте JVM-приложение на фреймворке, который уже включает Typesafe Config (Akka, Play, Lagom): поддержка HOCON достаётся бесплатно, а документация фреймворка подразумевает именно этот формат. Используйте YAML, если приложение не JVM, если вы контейнеризуете его с Docker/Kubernetes или используете фреймворк вроде Spring Boot с родной поддержкой YAML. Смешение форматов в проекте создаёт лишнюю сложность в инструментах — согласуйте формат конфигурации с тем, что ваш фреймворк ожидает изначально.

ShareXLinkedIn