เริ่มบริการ systemd ตามเงื่อนไขหรือไม่


14

ที่องค์กรของฉันเรามี AMI พื้นฐานที่ใช้งานง่ายสำหรับบริการต่าง ๆ เช่น ECS และ Docker เนื่องจากโครงการหลายโครงการของเราเกี่ยวข้องกับ CloudFormation เราจึงใช้cfn-bootstrapงานซึ่งประกอบด้วยสคริปต์สองสามตัวและบริการที่ใช้งานขณะบูตเพื่อติดตั้งแพคเกจบางชุดและทำงานการจัดการการกำหนดค่าบางอย่างสำหรับเรา

เมื่อเริ่มต้นระบบต้องใช้สคริปต์ต่อไปนี้ที่เทียบเท่ากัน:

#!/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

ผมคิดว่าการทำงานนี้เป็น systemd oneshotบริการซึ่งวิ่งและAfter=network.targetWantedBy=multi-user.target

ปัญหาเดียวคือฉันต้องการให้ AMI ของฉันมีความยืดหยุ่นและใช้งานได้ก็ต่อเมื่อมีไฟล์ที่แน่นอน แทนที่จะฝังสคริปต์ข้างต้นลงในข้อมูลผู้ใช้ EC2 ฉันสามารถให้ข้อมูลผู้ใช้เพียงแค่กำหนดไฟล์สภาพแวดล้อมที่กำหนดตัวแปรที่ฉันต้องการและเรียกใช้บริการ one-shot ของฉันหากไฟล์สภาพแวดล้อมนั้นมีอยู่:

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

มีวิธีที่จะทำให้ systemd ทำงานบริการเท่านั้นหากตรงตามเงื่อนไขที่กำหนด?

คำตอบ:


16

systemd ให้เงื่อนไขที่หลากหลายที่คุณสามารถทดสอบได้ ตัวอย่างเช่นคุณสามารถใช้ConditionPathExists=เพื่อทดสอบการมีอยู่ของไฟล์

[Unit]
ConditionPathExists=/etc/sysconfig/cloudformation

3
เป็นที่น่าสังเกตว่านี่ไม่ใช่whileเงื่อนไข แต่ifหมายความว่าหากเส้นทางที่ระบุConditionPathExistsไม่มีอยู่ในขณะที่บริการเริ่มต้นบริการที่เหลือจะไม่ทำงาน คือมันไม่รอให้เส้นทางมีอยู่
Mahn

@Mahn ใช้ systemd timer มันเป็นไปได้ที่จะทริกเกอร์การบริการเป็นระยะ ๆ เพื่อเอาชนะข้อ จำกัด นั้น
Naftuli Kay

@Mahn ลองดูที่freedesktop.org/software/systemd/man/systemd.path.html# มันสามารถตรวจสอบเส้นทางและให้การเปิดใช้งานตามตัวอย่างเช่นเมื่อเส้นทางเข้ามาอยู่
benf

2

ฉันสะดุดกับคำถามนี้มองหาวิธีที่จะเริ่มบริการ systemd โดยใช้เงื่อนไข มีหลายวิธี:

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

ฉันต้องการเริ่มบริการตามชื่อโฮสต์ที่ระบุ

ConditionHost= อาจใช้เพื่อจับคู่กับชื่อโฮสต์หรือหมายเลขเครื่องของโฮสต์ สิ่งนี้ใช้สตริงชื่อโฮสต์ (เป็นทางเลือกกับเชลล์สไตล์ globs) ซึ่งทดสอบกับชื่อโฮสต์ที่ตั้งไว้ภายในเครื่องซึ่งส่งคืนโดย gethostname (2) หรือหมายเลขเครื่องที่จัดรูปแบบเป็นสตริง (ดู machine-id (5)) การทดสอบอาจถูกเพิกเฉยโดยทำเครื่องหมายอัศเจรีย์ไว้ก่อน

เพิ่มเติมเกี่ยวกับที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.