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-bootstrap
birkaç 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.target
ve 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ı?
while
koş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.