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

Файлы-зоны

Держать всё в одном config.yaml необязательно. include подключает файлы-зоны рядом с конфигом, каждый со своими группами:

~/.config/hostsctl/
├── config.yaml settings, include, общие группы
└── zones/
├── 10-local.hosts обычный hosts-синтаксис
├── 20-work.yaml группы в YAML
└── 30-ads.yaml удалённый блоклист

Шаблоны разворачиваются относительно каталога конфига. Их порядок задаёт порядок групп в /etc/hosts, а там выигрывает первая подходящая строка — так что порядок не косметика. Внутри одного шаблона файлы сортируются по имени, поэтому префиксы 10-, 20- работают как ожидается.

.hosts — обычный hosts-синтаксис, одна группа на файл

Заголовок раздела «.hosts — обычный hosts-синтаксис, одна группа на файл»

Имя группы берётся из имени файла (10-local.hostslocal), шапка становится описанием, комментарий над строкой или в её конце — комментарием записи, а закомментированная строка — выключенной записью:

# Локальная разработка
127.0.0.1 k8s.orb.local
10.30.13.37 sre-mcp.local # стенд
# 127.0.0.1 old.local

Шапка — ровно одна строка комментария: следующие комментарии до первой записи считаются комментарием к ней.

В .hosts-зоне помещается ровно одна группа, и в ней нельзя держать source — для удалённого списка нужен .yaml.

Принимаются три формы: groups: [...], голый список групп и одна группа без name (имя берётся из имени файла).

zones/20-work.yaml
description: Work stands
entries:
- ip: 10.0.0.7
hostnames: [stand.local]
Terminal window
hostsctl zone list # шаблоны, файлы, что в них лежит
hostsctl zone add 'legacy/*.hosts' # подключить существующие файлы
hostsctl zone rm 'legacy/*.hosts' # отключить; файлы остаются на диске

zone add сразу загружает найденные файлы, поэтому конфликт имён групп всплывает в этот момент, а не при следующем запуске.

Terminal window
hostsctl group add work --file zones/20-work.yaml
hostsctl add 10.0.0.7 stand.local --group work
hostsctl group move blocklist --file zones/30-ads.yaml
hostsctl group move blocklist --file main
hostsctl edit work # откроет файл именно этой группы

Если путь из --file не подходит ни под один шаблон, он дописывается в include — иначе группа потерялась бы при следующем чтении.

Каждая группа помнит файл, из которого загрузилась. Изменение через CLI пишется обратно в этот файл и в его формате, а файл, содержимое которого не изменилось, не перезаписывается вообще — так mtime остаётся осмысленным, а git diff тихим.

Свои *.hosts, лежащие где угодно на диске, подключаются как есть, без конвертации:

Terminal window
hostsctl zone add '/Users/me/Work/hosts/*.hosts'

Учти: при первой же правке через CLI hostsctl перепишет такой файл своим форматированием — выровняет колонки и вынесет шапку наверх. Содержимое сохранится, раскладка нет.

  • Имена групп уникальны по всем файлам. Дубль — ошибка с указанием обоих файлов.
  • В .hosts-зоне одна группа, и у неё не может быть source.
  • Файл-зона, из которой не получилось ни одной группы, просто пропускается.