Kuruluşumda ECS ve Docker gibi farklı hizmetler için kullanımı kolay bazı temel AMI'ler var. Projelerimizin çoğu CloudFormation içerdiğinden, cfn-bootstrapbirkaç komut dosyası ve belirli paketleri yüklemek ve bizim için belirli yapılandırma yönetimi görevlerini yapmak için önyükleme üzerinde çalışan bir hizmetten oluşan bir kullanıyoruz .
Bir sistemin başlangıcında, aşağıdaki komut dosyasının eşdeğeri yürütülmelidir:
#!/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
Ben systemd olarak bu çalışan düşünüyordum oneshotçalışan hizmet After=network.targetve WantedBy=multi-user.target.
Tek sorun, AMI'mın esnek olmasını ve yalnızca belirli bir dosya varsa bunu yürütmesini istiyorum. Yukarıdaki komut dosyasını EC2 kullanıcı verilerine gömmek yerine, kullanıcı verilerine ihtiyacım olan değişkenleri tanımlayan bir ortam dosyası tanımlayabilir ve bu ortam dosyası mevcutsa yalnızca bir kerelik hizmetimi çalıştırabilirim:
#cloud-init
write_files:
- path: /etc/sysconfig/cloudformation
# ...
content: |
CFN_STACK_NAME="stack-name"
CFN_RESOURCE="resource-name"
CFN_REGION="region"
Systemd'i yalnızca belirli bir koşul karşılandığında bir hizmeti çalıştırmanın bir yolu var mı?
whilekoşul olmadığını belirtmek gerekir , ancak birif, belirtilen yolConditionPathExists, hizmet başlatıldığında mevcut değilse, hizmetin geri kalanının çalışmayacağı anlamına gelir. Yani, yolun var olmasını beklemiyor.