Вопрос или проблема
Я ознакомился с документацией по файлам systemd.path: https://www.freedesktop.org/software/systemd/man/latest/systemd.path.html, и в частности в документации они упоминают:
PathExists=, PathExistsGlob=, PathChanged=, PathModified=, DirectoryNotEmpty=
…
Аргументы этих директив должны быть абсолютными путями файловой системы.
Поэтому я ищу, возможно, какой-то обходной путь для определения оператора PathModified с использованием переменной вместо абсолютного пути. На самом деле я пытаюсь создать шаблонный файл единицы systemd .path, в котором переменная PATH может быть динамически назначена, поскольку это шаблон. Хотя я прекрасно понимаю, что код ниже вызывает ошибку, я пытаюсь сделать что-то вроде этого:
# /etc/systemd/system/[email protected]
[Path]
EnvironmentFile=/etc/systemd/system/traefik.env
PathModified="${TRAEFIK_PATH}"
Unit="srv-watcher@%i.service"
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/traefik.env
TRAEFIK_PATH=/usr/bin/traefik
UPGRADE_PATH=/root/bin/upgrade_traefik.sh
Я не совсем уверен, существует ли способ systemd для создания этих файлов шаблонов .path ([email protected]), однако мне просто кажется странным, что файлы .service и .timer определенно обладают “шаблонной функциональностью”. Я полагаю, я мог бы использовать другой инструмент шаблонизации, такой как ansible/jinja2, который “динамически” создаст файлы systemd .path, содержащие “фиксированный” или “абсолютный” путь для объявления PathModified, однако было бы действительно неплохо избежать использования другого инструмента или метода, если это возможно.
Ответ или решение
Вопрос, который вы подняли, касается ограничения systemd в использовании динамических переменных для объявления путей в unit-файлах типа .path. В документации действительно указано, что параметры, такие как PathModified
, должны быть абсолютными путями файловой системы, и использование переменных, как вы описали, вызовет ошибку.
Проблема с переменными в .path файлах
Как вы правильно заметили, unit-файлы systemd, такие как .service и .timer, поддерживают шаблоны с использованием переменных (например, %i
), но для .path файлов такой функциональности нет. Это связано с тем, что .path файлы предназначены для определения наблюдаемых путей, и их параметры должны быть статичными, чтобы гарантировать корректное отслеживание изменений.
Альтернативные подходы
Хотя прямого способа ввода переменных в .path файлы нет, существует несколько обходных путей и стратегий, которые могут помочь вам в решении этой задачи:
-
Создание шаблонов с помощью сторонних инструментов:
Вы уже упомянули использование таких инструментов, как Ansible или Jinja2, которые могут динамически генерировать необходимые .path файлы с определёнными путями. Это оставляет за вами возможность управлять версиями и конфигурациями без изменения исходного кода. В этом случае, вам нужно будет создать playbook или шаблон, который будет подставлять нужные значения в .path файл. -
Использование скриптов и временных файлов:
Вы можете создать простой скрипт, который будет генерировать ваш .path файл и сохранять его в нужное место. Например, в скрипте можно считывать переменные из файла окружения и создавать .path файл с правильными путями. Важно запускать этот скрипт каждый раз перед тем, как вы будете перезапускать systemd, чтобы убедиться, что ваш файл актуален. -
Использование служебных единиц:
Рассмотрите возможность создания дополнительных unit-файлов, которые будут управлять вашими путями. Например, можно создать сервис, который будет отслеживать изменения в определённых директориях и отправлять уведомления о изменениях в ваш основной сервис (через сигнал, сокет и т.д.). -
Символические ссылки:
Если ваши пути могут сменяться, и вы знаете их заранее, можно создать несколько символических ссылок на ваши файлы и изменять их в зависимости от условий. В .path файле вы просто укажите путь к символической ссылке, и, меняя саму ссылку, вы сможете управлять наблюдаемыми директориями.
Заключение
В зависимости от вашей архитектуры и потребностей вам необходимо выбрать наиболее подходящий подход. Хотя на первый взгляд может показаться, что systemd не поддерживает гибкость в .path файлах, существуют различные способы обхода этого ограничения. Самое главное, независимо от выбранного метода, помните о необходимости следить за модификациями и контролировать версионность вашего решения. Такой подход не только поможет вам обойти существующие ограничения, но и даст вам возможность более эффективно управлять конфигурацией вашего приложения.