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 oneshot
layanan systemd yang berjalan After=network.target
dan 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?
while
kondisi, tetapiif
, yang berarti bahwa jika jalan yang ditentukan dalamConditionPathExists
tidak ada pada saat layanan dimulai sisa layanan hanya tidak akan berjalan. Yaitu, tidak menunggu jalan ada.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 .
sumber