Skip to main content

Конфигурация и модули

Модуль – это шаблон или функция, описывающая, как настроить определенный компонент системы.

Модуль описывает, как что-то должно работать, его свойства и возможности. Например, модуль для nginx описывает, как настроить веб-сервер, но не указывает, какие сайты будут на нем размещаться.
Модули позволяют разбивать конфигурацию системы на управляемые части, делая ее более структурированной, повторно используемой и масштабируемой.

Функции модуля

  1. Абстракция. Модули скрывают детали реализации, предоставляя стандартизированный интерфейс для настройки компонентов системы. В этом смысле он больше похож на описание и функциональность класса в языке программирования.
  2. Повторное использование. Один и тот же модуль может использоваться в разных частях системы или в разных конфигурациях для однотипных настроек.

Структура модуля

  1. Импорт других модулей(imports).
  2. Объявление возможностей(options). 
  3. Определение возможностей(config).
{
  imports = [
    # Пути к другим модулям.
    # Модули могут импортировать другие модули, позволяя
    # создавать иерархическую структуру конфигурации.
  ];

  options = {
    # Объявление возможностей.
    # Объявляет какие настройки пользователь этого модуля может устанавливать.
    # Обычно это включает общий пункт "enable" изначально установленный в ложное значение.
  };

  config = {
    # Определение возможностей.
    # Определяет какие другие настройки, службы и ресурсы должны быть включены.
    # Обычно это зависит от того выбрал ли пользователь этого модуля 
    # пункт "enable" используя объявление выше.
    # Варианты для модулей импортированных в секции "imports" могут быть установлены здесь.
  };
}

Каждый модуль может объявлять новые варианты, которые являются настройками для компонентов системы. Например, модуль для настройки веб-сервера может иметь варианты порта и директории сайта.

Все модули получают доступ к переменной config, которая содержит текущие значения вариантов из других модулей, что позволяет модулям взаимодействовать друг с другом и использовать ранее определенные настройки.

Поскольку модули описывают желаемое состояние системы, а не шаги по его достижению, NixOS является декларативной системой, где конфигурация выражается в виде модулей.

Примеры использования модулей

  1. Управление службами. Модуль может описывать настройку и запуск службы, например, веб-сервера nginx, включая его конфигурацию и зависимости.
  2. Настройки пользователя. NixOS home-manager использует модули для управления настройками пользователя и содержимым его домашнего каталога, например, настройками оболочки или приложения.
  3. Пакеты. Модули могут описывать сборку и установку пакетов, а также управлять их зависимостями.

Преимущества модулей

  1. Воспроизводимость. Модули упрощают создание воспроизводимых конфигураций, которые можно легко применить на разных машинах.
  2. Управление. Разбиение конфигурации на модули делает ее более управляемой и понятной, даже для сложных систем.
  3. Повторное использование. Модули могут быть повторно использованы в разных конфигурациях, что сокращает дублирование кода.