Bắt đầu dịch vụ systemd có điều kiện?


14

Tại tổ chức của tôi, chúng tôi có một số AMI cơ sở dễ sử dụng cho các dịch vụ khác nhau như ECS và Docker. Do nhiều dự án của chúng tôi liên quan đến CloudFormation, chúng tôi đang sử dụng cfn-bootstrap, bao gồm một vài tập lệnh và dịch vụ chạy trên boot để cài đặt các gói nhất định và thực hiện một số tác vụ quản lý cấu hình nhất định cho chúng tôi.

Khi khởi động một hệ thống, phải thực hiện một đoạn mã tương đương sau:

#!/bin/bash

# capture stderr only
output="$(cfn-init -s $STACK_NAME -r $RESOURCE_NAME --region $REGION >/dev/null)"

# if it failed, signal to CloudFormation that it failed and include a reason
returncode=$?
if [[ $returncode == 0]]; then
    cfn-signal -e $returncode -r "$output"
    exit $returncode
fi

# otherwise, signal success
cfn-signal -s

Tôi đã nghĩ đến việc chạy nó như một oneshotdịch vụ systemd chạy After=network.targetWantedBy=multi-user.target.

Vấn đề duy nhất là tôi muốn AMI của mình linh hoạt và chỉ thực hiện điều này nếu tồn tại một tệp nhất định. Thay vì nhúng tập lệnh trên vào dữ liệu người dùng EC2, tôi có thể có dữ liệu người dùng chỉ cần xác định tệp môi trường xác định các biến tôi cần và chỉ chạy dịch vụ one-shot của mình nếu tệp môi trường đó tồn tại:

#cloud-init
write_files:
    - path: /etc/sysconfig/cloudformation
      # ...
      content: |
          CFN_STACK_NAME="stack-name"
          CFN_RESOURCE="resource-name"
          CFN_REGION="region"

Có cách nào để systemd chỉ chạy một dịch vụ nếu đáp ứng một điều kiện nhất định không?

Câu trả lời:


16

systemd cung cấp một loạt các điều kiện bạn có thể kiểm tra . Chẳng hạn, bạn có thể sử dụng ConditionPathExists=để kiểm tra sự tồn tại của một tập tin.

[Unit]
ConditionPathExists=/etc/sysconfig/cloudformation

3
Điều đáng chú ý là đây không phải là một whileđiều kiện, nhưng có ifnghĩa là nếu đường dẫn được chỉ định ConditionPathExistskhông tồn tại vào thời điểm dịch vụ bắt đầu thì phần còn lại của dịch vụ sẽ không chạy. Tức là, nó không chờ con đường tồn tại.
Mahn

@Mahn sử dụng bộ đếm thời gian systemd, có thể liên tục kích hoạt dịch vụ trên một khoảng thời gian để khắc phục giới hạn đó.
Naftuli Kay

@Mahn Hãy xem freedesktop.org/software/systemd/man/systemd.path.html# . Nó có thể giám sát một đường dẫn và cung cấp kích hoạt dựa trên, ví dụ, khi một đường dẫn tồn tại.
benf

2

Tôi vấp phải câu hỏi này để tìm cách bắt đầu một dịch vụ systemd bằng một điều kiện. Có rất nhiều cách:

ConditionArchitecture=, ConditionVirtualization=, ConditionHost=, ConditionKernelCommandLine=, ConditionSecurity=, ConditionCapability=, ConditionACPower=, ConditionNeedsUpdate=, ConditionFirstBoot=, ConditionPathExists=, ConditionPathExistsGlob=, ConditionPathIsDirectory=, ConditionPathIsSymbolicLink=, ConditionPathIsMountPoint=, ConditionPathIsReadWrite=, ConditionDirectoryNotEmpty=, ConditionFileNotEmpty=, ConditionFileIsExecutable=

Tôi muốn bắt đầu dịch vụ dựa trên một tên máy chủ cụ thể.

ConditionHost= có thể được sử dụng để khớp với tên máy chủ hoặc ID máy của máy chủ. Việc này sẽ lấy một chuỗi tên máy chủ (tùy chọn với các chuỗi kiểu vỏ) được kiểm tra đối với tên máy chủ được đặt cục bộ như được trả về bởi gethostname (2) hoặc ID máy được định dạng dưới dạng chuỗi (xem id máy-id (5)). Bài kiểm tra có thể được phủ định bằng cách thêm dấu chấm than.

Thêm về điều đó ở đây .

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.