조건부로 시스템 서비스를 시작 하시겠습니까?


14

우리 조직에는 ECS 및 Docker와 같은 다양한 서비스를위한 여러 가지 사용하기 쉬운 기본 AMI가 있습니다. 많은 프로젝트가 CloudFormation과 관련되어 있기 때문에 우리는 cfn-bootstrap몇 가지 스크립트와 부팅시 실행되어 특정 패키지를 설치하고 특정 구성 관리 작업을 수행하는 서비스로 구성되어 있습니다.

시스템을 시작할 때 다음과 같은 스크립트를 실행해야합니다.

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

나는 systemd로 이것을 실행하는 생각을 oneshot실행 서비스 After=network.targetWantedBy=multi-user.target.

유일한 문제는 AMI를 유연하게 유지하고 특정 파일이있는 경우에만이를 실행한다는 것입니다. 위의 스크립트를 EC2 사용자 데이터에 포함시키는 대신, 사용자 데이터가 필요한 변수를 정의하는 환경 파일을 정의하고 해당 환경 파일이 존재하는 경우에만 원샷 서비스를 실행하도록 할 수 있습니다.

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

주어진 조건이 충족 된 경우에만 systemd가 서비스를 실행하도록하는 방법이 있습니까?

답변:


16

systemd는 테스트 할 수있는 다양한 조건을 제공합니다 . 예를 들어 ConditionPathExists=파일이 있는지 테스트 하는 데 사용할 수 있습니다 .

[Unit]
ConditionPathExists=/etc/sysconfig/cloudformation

3
이것이 while조건 이 아니라는 것을 주목할 가치가 있습니다. 그러나 if지정된 경로 ConditionPathExists가 서비스가 시작될 때 존재하지 않으면 나머지 서비스는 실행되지 않습니다. 즉, 경로가 존재하기를 기다리지 않습니다.
Mahn

@Mahn은 시스템 타이머를 사용하여 그 한계를 극복하기 위해 일정한 간격으로 서비스를 반복적으로 트리거 할 수 있어야합니다.
Naftuli Kay

@Mahn freedesktop.org/software/systemd/man/systemd.path.html#을 살펴보십시오 . 예를 들어 경로가 존재하는 시점을 기반으로 경로를 모니터링하고 활성화를 제공 할 수 있습니다.
benf

2

조건을 사용하여 시스템 서비스를 시작하는 방법을 찾기 위해이 질문을 우연히 발견했습니다. 여러 가지 방법이 있습니다.

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

특정 호스트 이름을 기준으로 서비스를 시작하고 싶었습니다.

ConditionHost=는 호스트 이름 또는 호스트의 컴퓨터 ID와 일치시키는 데 사용될 수 있습니다. gethostname (2)에 의해 리턴 된 로컬로 설정된 호스트 이름 또는 문자열로 형식화 된 시스템 ID에 대해 테스트되는 호스트 이름 문자열 (선택적으로 쉘 스타일 glob 사용)을 사용합니다 (machine-id (5) 참조). 느낌표를 붙여서 테스트를 무시할 수 있습니다.

그것에 대한 자세한 내용은 여기참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.