Có thể ghi đè tệp đơn vị systemd để tạo tệp đơn vị mẫu không?


8

Tôi biết rằng systemd cung cấp một cơ chế tuyệt vời để ghi đè tệp đơn vị được cung cấp gói để ảnh hưởng đến cấu hình / hành vi dịch vụ. Điều này thường được thực hiện bằng cách sử dụng lệnh dưới đây

sudo systemctl edit <unitfile>

để tạo một tập tin conf ghi đè tại

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

Systemd cũng cung cấp một cơ chế riêng để xác định tệp đơn vị mẫu và khởi tạo nó để tạo các đơn vị cụ thể trong thời gian chạy. Điều này đòi hỏi phải đặt tên tệp mẫu là

<servicename>@.service

và sau đó khởi tạo nó như là

systemctl start <servicename>@<instancename>

Bây giờ, tôi có một tình huống mà tôi muốn chạy một dịch vụ được cung cấp theo gói như nhiều trường hợp đơn vị. Tôi muốn tránh tạo tệp đơn vị mẫu của riêng mình, vì vậy tôi đang cố gắng xem liệu tệp đơn vị được cung cấp gói có thể được ghi đè để tạo tệp đơn vị mẫu không.

Vì theo hiểu biết của tôi, tệp đơn vị mẫu có quy ước đặt tên khác với tệp đơn vị thông thường, tôi nghĩ rằng tôi không thể ghi đè tệp đơn vị được cung cấp gói bằng tệp mẫu bằng cách đặt nó vào / etc / systemd / system.

Có cách nào xác định để đạt được những gì tôi đang cố gắng làm không?

Kịch bản cụ thể: Gói grafana cài đặt tệp đơn vị grafana-server.service. Tôi muốn chạy hai phiên bản grafana trên máy của mình - mỗi phiên bản cho DEV và STG. Tôi đã có thể làm điều này:

  • sửa đổi tệp grafana-server.service (sử dụng% I để đặt vị trí thư mục & đường dẫn tệp)
  • đổi tên grafana-server.service đã sửa đổi thành grafana-server @ .service
  • bắt đầu các trường hợp của grafana bằng cách sử dụng:

    sudo systemctl start grafana-server@dev
    

    sudo systemctl start grafana-server@stg
    

Tuy nhiên, điều này phá vỡ liên kết từ tệp đơn vị dịch vụ do grafana cung cấp và nếu họ nâng cao tệp dịch vụ khi tôi nâng cấp, tôi sẽ cần làm lại hoạt động này một lần nữa. Mục tiêu của tôi là để tránh sự phụ thuộc trực tiếp này, và thay vào đó chuyển đổi nó thành một phụ thuộc ghi đè.

Có suy nghĩ gì không?

Câu trả lời:


6

Đối với cả hai tùy chọn bên dưới, trước tiên hãy ghi đè grafana-server.service (không có @) /etc/systemd/systemvà tắt ExecStart(giả sử nó sử dụng điều đó) để làm cho nó không khởi động được gì. Vào /etc/systemd/system/grafana-server.service.d/10-disable-execstart.conf:

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

Tùy chọn 1 - Ghi đè với các trường hợp chung

Tạo một grafana-server@.servicetương ứng với các cài đặt của bạn với cấu hình sau [Unit][Service]:

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

Chúng nên liên kết grafana-server start / stop / restart với tất cả các thể hiện của bạn với nhau. Các phép thuật không phải là rất tốt tài liệu, nhưng nếu bạn đặt <instance_name>.confcác tập tin trên của bạn /path/to/your/confdir, tất cả những trường hợp đó sẽ bị ràng buộc Automagically!

Tùy chọn 2 - Ghi đè các trường hợp cụ thể để giữ cấu hình gói

Nếu bạn muốn giữ tất cả các ưu điểm cập nhật từ tệp dịch vụ gói, nhưng chấp nhận các tùy chọn thể hiện tùy chỉnh, hãy tạo một liên kết tượng trưng cho mỗi tên đối tượng từ chung

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

đến

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

và sau đó chỉ ghi đè các tùy chọn cụ thể của trường hợp đó bằng cách sử dụng

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

Hãy chắc chắn để thêm cấu hình sau để [Unit][Service]để 99-my-options.conf:

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

Điều này sẽ giả sử cho từng trường hợp tất cả các grafana-server.servicetùy chọn và sẽ ghi đè chúng bằng tất cả các tùy chọn trong 99-my-options.conftệp và cũng liên kết các hành động start / stop / restart với grafana-server.service.

Trên cả hai tùy chọn, nếu bạn chạy

systemctl start grafana-server.service

tất cả các phiên bản của bạn có /path/to/confdir/<instance>.conftệp sẽ được bắt đầu. Điều tương tự cũng áp dụng cho stoprestartAND bạn luôn có thể quản lý chúng riêng bằng cách sử dụng của họ grafana-server@<instance>tên dịch vụ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.