Apakah mungkin untuk menimpa file unit systemd untuk membuat file unit template?

8

Saya tahu bahwa systemd menyediakan mekanisme yang sangat baik untuk mengganti file unit yang disediakan paket untuk mempengaruhi konfigurasi layanan / perilaku. Ini biasanya dilakukan dengan menggunakan perintah di bawah ini

sudo systemctl edit <unitfile>

untuk membuat file conf override di

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

Systemd juga menyediakan mekanisme terpisah untuk mendefinisikan file unit template, dan memerintahkannya untuk membuat unit spesifik instans saat runtime. Ini membutuhkan penamaan file templat sebagai

<servicename>@.service

dan kemudian instantiating sebagai

systemctl start <servicename>@<instancename>

Sekarang, saya memiliki situasi di mana saya ingin menjalankan layanan yang disediakan paket sebagai beberapa instance unit. Saya ingin menghindari membuat file unit template saya sendiri, jadi saya mencoba untuk melihat apakah file unit yang disediakan paket dapat diganti untuk membuat file unit template.

Karena, menurut pemahaman saya, file unit template memiliki konvensi penamaan yang berbeda dari file unit biasa, saya pikir saya tidak bisa menimpa file unit yang disediakan paket dengan file template dengan meletakkannya di / etc / systemd / system.

Apakah ada cara yang pasti untuk mencapai apa yang saya coba lakukan?

Skenario khusus: Paket grafana menginstal file unit grafana-server.service. Saya ingin menjalankan dua contoh grafana di komputer saya - masing-masing untuk DEV dan STG. Saya sudah bisa melakukan ini:

  • ubah file grafana-server.service (menggunakan% I untuk mengatur lokasi folder & jalur file)
  • ganti nama grafana-server.service yang dimodifikasi menjadi grafana-server @ .service
  • mulai contoh grafana dengan menggunakan:

    sudo systemctl start grafana-server@dev
    

    dan

    sudo systemctl start grafana-server@stg
    

Namun, ini memutus tautan dari file unit layanan yang disediakan grafana, dan jika mereka meningkatkan file layanan ketika saya memutakhirkan, saya perlu mengulang kegiatan ini lagi. Tujuan saya adalah untuk menghindari ketergantungan langsung ini, dan alih-alih mengubahnya menjadi ketergantungan override.

Adakah pikiran?

sujitv
sumber

Jawaban:

6

Untuk kedua opsi di bawah ini, pertama-tama timpa layanan grafana-server.service (tanpa @) /etc/systemd/systemdan tekan ExecStart(seandainya ia menggunakan itu) untuk membuatnya tidak memulai apa-apa. Pada /etc/systemd/system/grafana-server.service.d/10-disable-execstart.conf:

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

Opsi 1 - Mengganti dengan instance generik

Buat [email protected]yang sesuai dengan pengaturan Anda dengan konfigurasi berikut untuk [Unit]dan [Service]:

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

Ini harus mengikat server grafana start / stop / restart ke semua instance Anda bersama-sama. The magic tidak didokumentasikan dengan baik, tetapi jika Anda meletakkan <instance_name>.conffile pada Anda /path/to/your/confdir, semua contoh tersebut akan terikat otomatis!

Opsi 2 - Mengganti instance spesifik untuk menjaga konfigurasi paket

Jika Anda ingin menjaga semua pembaruan dari file layanan paket, tetapi menerima opsi instance kustom pemeliharaan, buat tautan simbolis untuk setiap nama instance dari generik

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

untuk

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

dan kemudian menimpa hanya opsi spesifik dari instance yang menggunakan

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

Pastikan untuk menambahkan konfigurasi berikut ke [Unit]dan [Service]ke 99-my-options.conf:

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

Ini akan mengasumsikan untuk setiap instance semua grafana-server.serviceopsi dan akan menimpanya dengan semua opsi pada 99-my-options.conffile dan juga mengikat tindakan start / stop / restart ke layanan grafana-server.service.

Pada kedua opsi, jika Anda menjalankan

systemctl start grafana-server.service

semua instance Anda yang memiliki /path/to/confdir/<instance>.conffile akan dimulai. Hal yang sama berlaku untuk stopdan restartDAN Anda selalu dapat mengelolanya secara individual dengan menggunakan grafana-server@<instance>nama layanan mereka .

RDP
sumber