Systemd hizmeti şartlı olarak başlatılsın mı?


14

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ı?

Yanıtlar:


16

systemd test edebileceğiniz çok çeşitli koşullar sağlar . Örneğin ConditionPathExists=, bir dosyanın var olup olmadığını sınamak için kullanabilirsiniz .

[Unit]
ConditionPathExists=/etc/sysconfig/cloudformation

3
Bunun bir whilekoşul olmadığını belirtmek gerekir , ancak bir if, belirtilen yol ConditionPathExists, hizmet başlatıldığında mevcut değilse, hizmetin geri kalanının çalışmayacağı anlamına gelir. Yani, yolun var olmasını beklemiyor.
Mahn

@Bir sistemd zamanlayıcısı kullanarak, bu sınırlamanın üstesinden gelmek için hizmeti bir aralıkta tekrar tekrar tetiklemek mümkün olmalıdır.
Naftuli Kay

@Mahn freedesktop.org/software/systemd/man/systemd.path.html# adresine bir göz atın . Bir yolu izleyebilir ve örneğin bir yol oluştuğunda etkinleştirme sağlayabilir.
benf

2

Bir koşul kullanarak bir systemd hizmeti başlatmanın yollarını arayan bu soru üzerine tökezledim. Birçok yolu var:

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

Hizmeti belirli bir ana bilgisayar adına göre başlatmak istedim.

ConditionHost= ana bilgisayarın ana makine adı veya makine kimliğiyle eşleşmek için kullanılabilir. Bu, gethostname (2) tarafından döndürülen yerel olarak ayarlanmış ana bilgisayar adına karşı test edilen bir ana bilgisayar adı dizesi (isteğe bağlı olarak kabuk stili glob'larıyla) veya dize olarak biçimlendirilmiş bir makine kimliğini alır (bkz. Makine kimliği (5)). Test bir ünlem işareti eklenerek reddedilebilir.

Burada daha fazlası .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.