¿Es posible anular un archivo de unidad systemd para crear un archivo de unidad de plantilla?

8

Sé que systemd proporciona un mecanismo excelente para anular un archivo de unidad proporcionado por el paquete para influir en la configuración / comportamiento del servicio. Esto normalmente se realiza mediante el siguiente comando

sudo systemctl edit <unitfile>

para crear un archivo conf de anulación en

/etc/systemd/system/<unitfile.d>/

Systemd también proporciona un mecanismo separado para definir un archivo de unidad de plantilla y crear una instancia para crear unidades específicas de instancia en tiempo de ejecución. Esto requiere nombrar el archivo de plantilla como

<servicename>@.service

y luego instanciarlo como

systemctl start <servicename>@<instancename>

Ahora, tengo una situación en la que me gustaría ejecutar un servicio proporcionado por paquetes como instancias de unidades múltiples. Quiero evitar crear mi propio archivo de unidad de plantilla, así que estoy tratando de ver si el archivo de unidad proporcionado por el paquete se puede reemplazar para crear el archivo de unidad de plantilla.

Dado que, según tengo entendido, el archivo de unidad de plantilla tiene una convención de nomenclatura que es diferente del archivo de unidad normal, creo que no puedo anular el archivo de unidad proporcionado por el paquete con un archivo de plantilla colocándolo en / etc / systemd / system.

¿Hay alguna forma definida de lograr lo que estoy tratando de hacer?

Escenario específico: el paquete grafana instala un archivo de unidad grafana-server.service. Quiero ejecutar dos instancias de grafana en mi máquina, una para DEV y STG. He podido hacer esto:

  • modifique el archivo grafana-server.service (usando% I para establecer ubicaciones de carpetas y rutas de archivos)
  • cambie el nombre del grafana-server.service modificado a grafana-server @ .service
  • iniciar instancias de grafana usando:

    sudo systemctl start grafana-server@dev
    

    y

    sudo systemctl start grafana-server@stg
    

Sin embargo, esto rompe el enlace del archivo de unidad de servicio proporcionado por grafana, y si mejoran el archivo de servicio cuando actualizo, tendré que rehacer esta actividad nuevamente. Mi objetivo es evitar esta dependencia directa y, en su lugar, convertirla en una dependencia de anulación.

¿Alguna idea?

sujitv
fuente

Respuestas:

6

Para las dos opciones a continuación, primero anule el grafana-server.service (sin la @) /etc/systemd/systemy suprima ExecStart(suponiendo que use eso) para que no comience nada. En /etc/systemd/system/grafana-server.service.d/10-disable-execstart.conf:

[Service]
ExecStart=
WorkingDirectory=/path/to/your/confdir

Opción 1: anulación de instancias genéricas

Cree uno [email protected]que corresponda a su configuración con la siguiente configuración [Unit]y [Service]:

[Unit]
PartOf=grafana-server.service
ReloadPropagatedFrom=grafana-server.service

Estos deberían vincular el inicio / detención / reinicio del servidor grafana a todas sus instancias juntas. La magia no está muy bien documentada, pero si coloca <instance_name>.confarchivos en su /path/to/your/confdir, ¡todas esas instancias se vincularán automáticamente!

Opción 2: anulación de instancias específicas para mantener la configuración del paquete

Si desea conservar todas las bondades de actualización del archivo de servicio del paquete, pero acepta mantener las opciones de instancias personalizadas, cree un enlace simbólico para cada nombre de instancia de genérico

/lib/systemd/system/grafana-server.service

a

/etc/systemd/system/grafana-service@<instance>.service

y luego anula solo las opciones específicas de esa instancia usando

/etc/systemd/system/grafana-server@<instance>.service.d/99-my-options.conf

Asegúrese de agregar la siguiente configuración a [Unit]y [Service]para 99-my-options.conf:

[Unit]
PartOf=grafana-server.service
ReloadPropagatedFrom=grafana-server.service

Esto asumirá para cada instancia todas las grafana-server.serviceopciones y las anulará con todas las opciones en el 99-my-options.confarchivo y también vinculará las acciones de inicio / detención / reinicio a grafana-server.service.

En ambas opciones, si corres

systemctl start grafana-server.service

Se /path/to/confdir/<instance>.confiniciarán todas las instancias que tengan un archivo. Lo mismo se aplica a stope restartY siempre se puede administrar de forma individual mediante el uso de su grafana-server@<instance>nombre de servicio.

RDP
fuente