ConditionHost
유닛 파일의 조건을 사용하여 systemd 유닛을 특정 호스트로 제한할 수 있다는 것을 알고 있습니다 . 이는 ConditionHost
호스트 이름 호출 결과에 대해 테스트되었습니다.
내가 찾을 수 없는 것은(하지만 가능하기를 바랍니다) DNS 별칭을 기반으로 동일한 작업을 수행하는 방법입니다. 그래서 유닛 파일에 지정된 DNS 별칭이 현재 호스트로 확인되는 호스트에서 systemd 유닛을 시작할 수 있는 방법이 있기를 바랐습니다.
배경: 현재 우리는 systemd 서비스로 시작되어 systemd 대상으로 그룹화된 일련의 애플리케이션/서비스를 보유하고 있습니다. 각 서비스 단위 파일에는 서비스가 실행되어야 하는 호스트를 지정하는 ConditionHost가 포함되어 있습니다. 유닛 파일은 RPM을 통해 배포되며 모든 유닛 파일은 모든 호스트에 설치됩니다. 이제 이러한 모든 호스트에서 동일한 systemd 대상을 시작할 수 있으며 systemd는 호스트 이름을 기반으로 올바른 호스트에서 올바른 서비스를 시작합니다. 클라이언트는 일반적으로 호스트 이름 대신 DNS 별칭을 사용하여 서비스에 직접 액세스합니다.
위 호스트 중 하나에 장애가 발생하면 동일한 구성의 백업 호스트를 쉽게 사용할 수 있으며 이에 따라 DNS 별칭이 업데이트됩니다. 그러나 불행하게도 이제 영향을 받는 서비스의 ConditionHost 사양을 반영하도록 systemd 단위 파일도 업데이트해야 합니다.
systemd가 호스트 이름 대신 DNS 별칭을 사용할 수 있다면 1) DNS 별칭을 업데이트하고 2) 대체 시스템에서 systemd 대상을 다시 시작하는 것만으로도 충분하다는 아이디어입니다.
답변1
DNS 별칭 검사가 통과한 경우에만 서비스를 실행하는 래퍼 스크립트를 작성할 수 있습니다. 확인할 값은 환경 변수로 전달될 수 있습니다.
서비스 파일:
[Service]
Environment=CONDITION_DNSALIAS=abc
Exec=/path/to/dnsaliascheck-wrapper exec args
...
래퍼 스크립트:
#!/bin/sh
check_dns_alias() {
# Your logic to check DNS alias here, return 0 for success and 1 otherwise.
return 0
}
if [ -z "$@" ]; then
echo "No arguments!"
return 1
fi
# If CONDITION_DNSALIAS is empty, the check should pass
if [ -z "$CONDITION_DNSALIAS" ] || check_dns_alias ; then
unset CONDITION_DNSALIAS
exec "$@"
fi
echo "DNS alias condition not met"
exit 0
check_dns_alias
비교를 위해 변수를 사용하여 실제 검사를 작성해야 합니다 CONDITION_DNSALIAS
.