Как установить переменную среды в systemd сервисе?

У нас есть один набор переключателей и отдельных VLAN для общего трафика, соединения посетителя (только Интернет), Трафик управления (МОТ), SAN (iSCSI) и медицинское исправление.

Статья Wikipedia имеет намного больше информации, включая использование.

168
задан 4 March 2014 в 10:37
3 ответа

Времена меняются, как и передовой опыт.

текущий лучший способ сделать это - запустить systemctl edit myservice , который создаст файл переопределения для вас или позволяет редактировать существующий.

В обычных установках будет создан каталог /etc/systemd/system/myservice.service.d , а внутри этого каталога будет создан файл, имя которого заканчивается на .conf ( обычно override.conf ), и в этом файле вы можете добавить или переопределить любую часть модуля, поставляемого дистрибутивом.

Например, в файле / etc / systemd / system / myservice.service.d / myenv.conf :

[Service]
Environment="SECRET=pGNqduRFkB4K9C2vijOmUDa2kPtUhArN"
Environment="ANOTHER_SECRET=JP8YLOc2bsNlrGuD6LVTq7L36obpjzxd"

Также обратите внимание, что если каталог существует и пуст, ваша служба будет отключена! Если вы не собираетесь помещать что-либо в каталог,

207
ответ дан 16 December 2019 в 22:45

http: // 0pointer .de / public / systemd-man / systemd.exec.html # Environment = - у вас есть два варианта (один уже указан Майклом):

Environment=

и

EnvironmentFile=
40
ответ дан 16 December 2019 в 22:45

Ответ зависит от того, должна ли переменная быть константа (т. е. не должна изменяться пользователем, получающего модуль) или переменная (предполагается, что она устанавливается пользователем).

Поскольку это ваш локальный модуль, граница довольно размыта, и в любом случае будет работать. Однако, если вы начнете распространять его, и он окажется в / usr / lib / systemd / system , это станет важным.

Постоянное значение

Если значение не нужно изменять для каждого экземпляра, предпочтительным способом было бы поместить его как Environment = непосредственно в файл модуля:

[Unit]
Description=My Daemon

[Service]
Environment="FOO=bar baz"
ExecStart=/bin/myforegroundcmd

[Install]
WantedBy=multi-user.target

Преимущество то есть переменная хранится в одном файле с модулем. Следовательно, файл модуля легче перемещать между системами.

Значение переменной

Однако вышеприведенное решение не работает, когда системный администратор должен изменить значение переменной среды локально. В частности, новое значение необходимо будет устанавливать каждый раз при обновлении файла модуля.

В этом случае должен использоваться дополнительный файл. Как - обычно зависит от политики распространения.

Одно особенно интересное решение - использовать каталог /etc/systemd/system/myservice.service.d . В отличие от других решений, этот каталог поддерживается самой системой systemd и, следовательно, не имеет путей для конкретных дистрибутивов.

В этом случае вы помещаете файл типа /etc/systemd/system/myservice.service.d/local.conf , который добавляет недостающие части файла модуля:

[Service]
Environment="FOO=bar baz"

После этого systemd объединяет два файла при запуске службы (не забудьте systemctl daemon-reload после изменения любого из них). И поскольку этот путь используется systemd напрямую, вы не используете для этого EnvironmentFile = .

Если значение предполагается изменить только в некоторых из затронутых систем, вы можете объединить оба решения , предоставляя значение по умолчанию непосредственно в устройстве и локальное переопределение в другом файле.

вы помещаете файл вроде /etc/systemd/system/myservice.service.d/local.conf , который добавляет недостающие части файла модуля:

[Service]
Environment="FOO=bar baz"

После этого systemd объединяет два файла при запуске службы (не забудьте systemctl daemon-reload после изменения любого из них). И поскольку этот путь используется systemd напрямую, вы не используете для этого EnvironmentFile = .

Если значение предполагается изменить только в некоторых из затронутых систем, вы можете объединить оба решения , предоставляя значение по умолчанию непосредственно в устройстве и локальное переопределение в другом файле.

вы помещаете файл вроде /etc/systemd/system/myservice.service.d/local.conf , который добавляет недостающие части файла модуля:

[Service]
Environment="FOO=bar baz"

После этого systemd объединяет два файла при запуске службы (не забудьте systemctl daemon-reload после изменения любого из них). И поскольку этот путь используется systemd напрямую, вы не используете для этого EnvironmentFile = .

Если значение предполагается изменить только в некоторых из затронутых систем, вы можете объединить оба решения , предоставляя значение по умолчанию непосредственно в устройстве и локальное переопределение в другом файле.

78
ответ дан 16 December 2019 в 22:45

Теги

Похожие вопросы