Mulai layanan systemd secara kondisional?

14

Di organisasi saya, kami memiliki sejumlah AMI dasar yang mudah digunakan untuk berbagai layanan seperti ECS dan Docker. Karena banyak proyek kami melibatkan CloudFormation, kami menggunakan cfn-bootstrap, yang terdiri dari beberapa skrip dan layanan yang berjalan saat boot untuk menginstal paket tertentu dan melakukan tugas manajemen konfigurasi tertentu untuk kami.

Saat memulai sistem, setara dengan skrip berikut harus dijalankan:

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

Saya berpikir untuk menjalankan ini sebagai oneshotlayanan systemd yang berjalan After=network.targetdan WantedBy=multi-user.target.

Satu-satunya masalah adalah bahwa saya ingin AMI saya fleksibel dan hanya menjalankan ini jika ada file tertentu. Daripada menanamkan skrip di atas ke dalam data pengguna EC2, saya dapat meminta data pengguna hanya mendefinisikan file lingkungan yang mendefinisikan variabel yang saya butuhkan dan hanya menjalankan layanan satu-shot saya jika file lingkungan itu ada:

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

Apakah ada cara untuk membuat systemd hanya menjalankan layanan jika kondisi tertentu terpenuhi?

Naftuli Kay
sumber

Jawaban:

16

systemd menyediakan berbagai macam kondisi yang dapat Anda uji . Misalnya, Anda dapat menggunakan ConditionPathExists=untuk menguji keberadaan file.

[Unit]
ConditionPathExists=/etc/sysconfig/cloudformation
Michael Hampton
sumber
3
Itu perlu dicatat bahwa ini bukan whilekondisi, tetapi if, yang berarti bahwa jika jalan yang ditentukan dalam ConditionPathExiststidak ada pada saat layanan dimulai sisa layanan hanya tidak akan berjalan. Yaitu, tidak menunggu jalan ada.
Mahn
@ Ahn menggunakan pengatur waktu systemd, harus dimungkinkan untuk berulang kali memicu layanan pada interval untuk mengatasi keterbatasan itu.
Naftuli Kay
@Mahn Lihatlah freedesktop.org/software/systemd/man/systemd.path.html# . Itu dapat memonitor jalan dan menyediakan aktivasi berdasarkan, misalnya, ketika jalan muncul.
benf
2

Saya menemukan pertanyaan ini mencari cara untuk memulai layanan systemd menggunakan kondisi. Ada banyak cara:

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

Saya ingin memulai layanan berdasarkan nama host tertentu.

ConditionHost= dapat digunakan untuk mencocokkan dengan nama host atau ID mesin dari host. Ini baik mengambil string nama host (opsional dengan gumpalan gaya shell) yang diuji terhadap nama host set lokal yang dikembalikan oleh gethostname (2), atau ID mesin yang diformat sebagai string (lihat id mesin (5)). Tes dapat dinegasikan dengan menambahkan tanda seru.

Lebih lanjut tentang itu di sini .

radtek
sumber