Skip to content

Конфигурирование образа

Конфигурирование образа происходит с помощью YAML-файла конфигурации и команды apm system image build.

Базовый конфиг

Первоначальный файл с которого начинается конфигурация — /etc/apm/image.yml

apm system image build применяет изменения к текущему контейнеру исходя из настроек в image.yml.

Уточнение

При создании образа в CI/CD, файл с конфигурацией копируется с помощью Containerfile из репозиторий в контейнер по вышеуказанному пути

Переменные среды и поля конфигурационного файла используется в приоритете над конфигом и нужны для конфигурирования сборки в CI/CD. Подробнее в разделе «Переменные среды и поля конфигурационного файла»

Пример конфига ALT Atomic Core
yml
name: core
hostname: alt-atomic-core

branding:
  name: alt-atomic-core

kernel:
  flavour: 6.12
  modules:
    - drm

repos:
  clean: true
  branch: sisyphus
  tasks: []

modules:
  - name: Move root
    type: move
    body:
      target: root
      destination: /
      replace: true

  - type: include
    body:
      targets:
        - packages.yml
        - apt-rpm.yml
        - filesystem.yml
        - systemd.yml
        - settings.yml
        - passwd.yml
        - disable-bins.yml

  - name: Configurate grub
    type: shell
    body:
      command: scripts/grub.s

Поля конфигурационного файла

Легенда

! — обязательное поле

ПолеОписаниеИмя переменной среды
name!Имя сборки. Влияет на имя некоторых специфичных для образа файла, которые генерируются во время работы. Например, sources.list.d/<name>.list от repos.APM_BUILD_NAME
image!OCI-образ, на базе которого будет собран образ.APM_BUILD_IMAGE
build-typeТип сборки. Доступны stable, nightly. Может определять некоторую логику и влияет на os-release.APM_BUILD_BUILD_TYPE
hostnameНазначение имени хоста в образе (имеются проблемы, в будущем лучше использовать ReadySet)
brandingИнформация о брендинге образа. Подробнее в разделе «Брендинг».
kernelБлок для работы с ядром. Подробнее в разделе «Ядро».
reposБлок настроек репозиториев. Подробнее в разделе «Репозитории».
modulesМассив модулей. Подробнее в разделе «Модули»

Брендинг (branding)

Набор полей branding, которые содержат информацию о брендинге образа.

ПолеОписаниеИмя переменной среды
nameУстановит пакеты брендинга. Всё из branding-<name>-*.
plymouth-themeЕсли не указан, установит пакет темы по паттерну plymouth-theme-<name> и назначит её через конфигурационный файл в /etc.
Примеры branding

ALT Atomic Core:

yml
branding:
  name: alt-atomic-core

Брендинг с пользовательской темой Plymouth:

yml
branding:
  name: my-cool-alt
  plymouth-theme: cat

Репозитории (repos)

Управление системными репозиториями

ПолеОписаниеИмя переменной среды
cleanОчистить или нет существующие репозитории. Полезно при создании базового образа.
customМассив из ссылок APT-репозиториев в формате rpm http://ftp.altlinux.org/... classic
branchВетка для автоматического добавления заготовленных репозиториев. Доступен только sisyphus. Обязательное поле при указании поля date.APM_BUILD_REPO_BRANCH
dateДата репозитория, если нужен конкретный срез в формате YYYY.MM.DD. При отсутствии берётся не срез, а просто репозиторий.APM_BUILD_REPO_DATE
tasksНомера тасков, которые будут добавлены как репозитории. Допустимы только таски EPERM или TESTED. DONE пока не поддерживаются
Примеры repos

ALT Atomic Core:

yml
repos:
  clean: true
  branch: sisyphus
  tasks: []

Подключение ветки ветки p11 и дополнительных тасков:

yml
repos:
  clean: true
  custom:
    - rpm [p11] http://ftp.altlinux.org/pub/distributions/ALTLinux p11/branch/x86_64 classic
    - rpm [p11] http://ftp.altlinux.org/pub/distributions/ALTLinux p11/branch/noarch classic
    - rpm [p11] http://ftp.altlinux.org/pub/distributions/ALTLinux p11/branch/x86_64-i586 classic
  tasks:
    - 391737
    - 397468

Ядро (kernel)

Блок для работы с ядром

ПолеОписаниеИмя переменной среды
flavourРазновидность ядра. Например, 6.12. Обязателен, если указываются модулиAPM_BUILD_KERNEL_FLAVOUR
modulesМассив дополнительных модулей ядра
include-headersПеременная, указывающая на то, включать ли заголовки ядра при установке
Примеры kernel

ALT Atomic Core:

yml
kernel:
  flavour: 6.12
  modules:
    - drm

Использование ядра без модулей:

yml
kernel:
  flavour: rt
  include-headers: true

Модули (modules)

Массив модулей для выполнения

ПолеОписание
nameИмя модуля, опционально и используется для вывода в логи во время выполнения
typeТипы модуля. Подробнее в разделе Типы модулей
ifУсловие в формате языка Expr для выполнения этого модуля. Может использовать переменные среды и поля конфигурационного файла (подробнее в разделе «Переменные среды и поля конфигурационного файла»)
bodyТело модуля. Наполнение определяется полем type. Подробнее в разделе «Типы модулей»

Использование относительных путей

Относительные пути разворачиваются относительно директории ресурсов (по умолчанию — /etc/apm/resources).

Переменные среды и поля конфигурационного файла

Переменные среды и поля конфигурационного файла доступны в разделе if через структуру Env.VAR и Config.Var из текущего конфигурационного файла соответственно.

Пример модуля с использованием переменных среды и полей конфигурационного файла
yml
modules:
  - type: shell
    if: Env.HOSTNAME == "good_host_name" || Config.Kernel.Flavour == "6.12"
    body:
      command: echo $HOSTNAME

Уточнение

К переменным среды, также, можно обращаться из раздела body в формате $NAME.

Для полей конфигурационного файла это не доступно.

Переменные среды

Переменные среды могут задаваться как в Containerfile, так и во время работы модулей.

Пример Containerfile:

sql
ENV APM_BUILD_BUILD_TYPE="some-build-type"
ENV APM_BUILD_IMAGE="some-image"
ENV APM_BUILD_REPO_DATE="some-date"

Доступ из блока if:

yml
Env.APM_BUILD_BUILD_TYPE
Env.APM_BUILD_IMAGE
Env.APM_BUILD_REPO_DATE

Доступ из блока body:

bash
$APM_BUILD_BUILD_TYPE
$APM_BUILD_IMAGE
$APM_BUILD_REPO_DATE

Поля конфигурационного файла

Имена полей из конфигурационного файла преобразуются в PascalCase.

Пример конфигурационного файла:

yml
name: some-name
image: some-image
build-type: some-type

kernel:
  modules:
    - some-module

Доступ из блока if:

yml
Config.Name
Config.Image
Config.BuildName
Config.Kernel.Modules

Типы модулей

git

Модуль для клонирования и выполнения операций над склонированным репозиторием. После копирования репозитория команды будут выполняться внутри директории репозитория.

Легенда

! — обязательное поле;

? — должно быть указано хотя бы одно из этих полей.

ПолеОписание
url!Ссылка на Git-репозиторий.
command?Команда для выполнения.
commands?Массив команд для выполнения.
depsЗависимости сборки в виде пакетов. Они будут удалены после окончания сборки.

Примечание для command/commands

Если указаны оба поля, то выполнится сначала command, а затем всё из commands.

Пример git-модуля

Клонирование проекта https://github.com/SuperDev/SuperGoProject.git, установка зависимости golang (будет удалено после завершения работы модуля) и выполнение сборки и установки проекта:

yml
modules:
  - type: git
    body:
      url: https://github.com/SuperDev/SuperGoProject.git
	  deps:
	    - golang
      command: |
        go build
        go install

copy

Модуль для копирования файлов и директорий.

Легенда

! — обязательное поле

ПолеОписание
target!Путь до файла, который нужно скопировать.
destination!Абсолютный путь, куда будет скопирован файл.
replaceЗамещать ли объект по пути destination, если он уже существует. По умолчанию — false.
Пример copy-модуля

Копирование файла /etc/apm/resources/scripts/my-script в /usr/bin/my-script с заменой:

yml
modules:
  - type: copy
    body:
      target: scripts/my-script
      destination: /usr/bin/my-script
      replace: true

include

Модуль для включения других конфигурационных файлов. Работает только с массивом modules (поля, не входящие в modules, будут игнорироваться).

Важно

include-модули не работают при использовании apm system image apply.

Легенда

? — должно быть указано хотя бы одно из этих полей.

ПолеОписание
target?Путь к YAML-файлу
targets?Массив путей к YAML-файлам
Пример include-модуля

Подключение файлов конфигурации /etc/apm/resources/packages.yml и /usr/share/strange_place/common.yml:

yml
modules:
  - type: include
    body:
      targets:
        - packages.yml
	    - /usr/share/strange_place/common.yml

Создание символической ссылки (target), которая будет ссылаться на указанный файл или директорию (destination).

Легенда

! — обязательное поле

ИмяОписание
target!Абсолютный путь, где будет создана ссылка
destination!Путь, куда эта ссылка будет вести. Если путь относительный ссылка, создаётся «как есть», без развёртывания пути
replaceЗамещать ли объект по пути target, если он уже существует. По умолчанию — false.

Важно

Окончание пути (имя файла или директории) в полях target и destination должны совпадать. Если target/home, то строго destination должен записываться в формате <path>/home, где <path> — какой-то путь

Пример link-модуля

Создать ссылку /home, которая будет ссылаться на /var/home, с заменой, если /home существует.

yml
modules:
  - type: link
    body:
      target: /home
      destination: /var/home
      replace: true

merge

Вставка содержимого одного файла в конец другого. Полезно для модификации конфигурационных файлов.

Легенда

! — обязательное поле

ИмяОписание
target!Путь к файлу, содержимое которого нужно добавить
destination!Путь к файлу, в конец которого нужно добавить содержимое
Пример merge-модуля

Дополнение файла /path/to/file2 содержимым файла /etc/apm/resources/path/to/file1

yml
modules:
  - type: merge
    body:
      target: path/to/file1
      destination: /path/to/file2

replace

Замена содержимого файла по регулярному выражению.

Легенда

! — обязательное поле

ИмяОписание
target!Абсолютный путь до файла
pattern!Шаблон регулярного выражения
repl!Текст, на который нужно заменить совпадения

::: Пример replace-модуль

В файле /path/ заменить все символы (.*) на строку (Что вы делаете в моём холодильнике?)

yml
modules:
  - type: replace
    body:
      target: /path/to/file
      pattern: .*
      repl: Что вы делаете в моём холодильнике?

:::

move

Легенда

! — обязательное поле

ИмяОписание
target!Абсолютный путь к объекту, который нужно переместить
destination!Абсолютный путь к объекту, куда нужно переместить объект
replaceЗамещать ли объект по пути destination, если он уже существует. По умолчанию — false.
create-linkСоздать ли в target относительную ссылку на destination после перемещения. Подробнее в разделе про link-модуль.
Пример move-модуля

Переместить файл /path/to/file1 в /path/to/file2 с заменой, если file2 существует, со ссылкой /path/to/file1 на /path/to/file2:

yml
modules:
  - type: move
    body:
      target: /path/to/file1
      destination: /path/to/file2
      replace: true
      create-link: true

packages

Действия с пакетами в рамках одной транзакции.

ИмяОписание
installМассив пакетов для установки
removeМассив пакетов для удаления
Пример packages-модуля

Будет установлен пакет stprl и удалён пакет flatpak:

yml
modules:
  - type: packages
    body:
      install:
        - stplr
	  remove:
	    - flatpak

remove

Удаление файлов и директорий

Легенда

? — должно быть указано хотя бы одно из этих полей.

ИмяОписание
target?Путь к объекту, который нужно удалить
targets?Массив путей к объектам, которые нужно удалить

Примечание для target/targets

Если указаны оба поля, то выполнится сначала target, а затем всё из targets.

Пример remove-модуля

Удалить файл /path/to/file:

yml
modules:
  - type: packages
    body:
      target: /path/to/file

shell

Выполнение Bash-команд

Легенда

? — должно быть указано хотя бы одно из этих полей.

ИмяОписание
command?Команда для выполнения
commands?Массив команд для выполнения

Примечание

Команды будут выполняться относительно директории ресурсов. По умолчанию — /etc/apm/resources).

Если указаны оба поля, то выполнится сначала command, а затем всё из commands.

Пример shell-модуля

Выполнить cat somefile > /path/to/file и export ARCH=$(uname -m)

yml
modules:
  - type: shell
    body:
      commands:
        - cat somefile > /path/to/file
        - export ARCH=$(uname -m)

systemd

Модуль для включения сервсисов SystemD.

Легенда

? — должно быть указано хотя бы одно из этих полей.

ИмяОписание
target?Имя сервиса
targets?Массив имён сервисов
enabledВключить ли серсвис. По умолчанию — false
globalВключить ли пользовательский сервис глобально (для всех пользователей). По умолчанию — false

Примечание для target/targets

Если указаны оба поля, то выполнится сначала target, а затем всё из targets.

Пример systemd-модуля

Включить сервисы service1 и service2, а также включить пользовательский сервис user-service

yml
modules:
  - type: systemd
    body:
      targets: 
        - service1
        - service2
      enabled: true
  - type: systemd
    body:
      target: user-service
      enabled: true
      global: true

mkdir

Создание директорий по абсолютным путям.

Легенда

? — должно быть указано хотя бы одно из этих полей.

ИмяОписание
target?Абсолютный путь к директории, которую нужно создать
targets?Массив абсолютных путей к директориям, которые нужно создать

Примечание для target/targets

Если указаны оба поля, то выполнится сначала target, а затем всё из targets.

Пример mkdir-модуля

Создать директорию /usr/new-dir

modules:
  - type: mkdir
    body:
      targets: /usr/new-dir

Опубликовано под лицензией GPL-3.0+. Содержание доступно по лицензии CC BY-SA 4.0, если не указано иное.