systemd 장치 조건에서 여러 호스트 이름을 확인하는 방법

systemd 장치 조건에서 여러 호스트 이름을 확인하는 방법

여러 호스트 이름 패턴을 기반으로 조건부로 시스템 서비스를 시작하려고 합니다.

나는 이것을 시도했지만 운이 없었습니다.

root@linkbox-BI034415:/# systemctl cat mcbapp
# /lib/systemd/system/myservice.service
[Unit]
Description=My Service
Wants=another.service
After=another.service
ConditionHost=HostOne*|HostTwo*
Also tried
ConditionHost={HostOne*,HostTwo*}


[Service]
EnvironmentFile=/etc/default/myenv
ExecStart=/opt/bin/my-apps
Restart=on-failure

[Install]
WantedBy=multi-user.target

어떤 제안이 있으십니까?

답변1

간단히 말해서:

ConditionHost=|HostOne*
ConditionHost=|HostTwo*

쉽게 를 사용하여 조건을 확인할 수 있습니다 systemd-analyze. 이렇게 하면 테스트 속도가 빨라집니다.

ConditionHost다음은 내 컴퓨터( )에서 사용하는 예입니다 stewbian.

여기서는 정확히 일치하는 항목을 성공적으로 얻었습니다.

$ systemd-analyze condition ConditionHost=stewbian
test.service: ConditionHost=stewbian succeeded.
Conditions succeeded

여기서 글로벌 매치를 성공적으로 마쳤습니다

$ systemd-analyze condition ConditionHost=stew*
test.service: ConditionHost=stew* succeeded.
Conditions succeeded.

여기서는 일치 항목이 올바르지 않기 때문에 올바르게 실패했습니다.

$ systemd-analyze condition ConditionHost=machine2
test.service: ConditionHost=machine2

따라서 우선 귀하의 테스트가 에서 작동한다고 말할 수 있지만 ConditionHost=Host*더 정확하기를 원하는 것 같습니다.


~에서man systemd.unit:

여러 조건이 지정된 경우 모든 조건이 적용되면(즉, 논리 AND가 적용됨) 단위가 실행됩니다.

따라서 여러 조건은 별도의 줄에 있어야 하지만 AND로 연결되어 실패합니다.

$ systemd-analyze condition "ConditionHost=machine2" "ConditionHost=stewbian"
test.service: ConditionHost=stewbian succeeded.
test.service: ConditionHost=machine2 failed.
Conditions failed.

그러나 매뉴얼 페이지는 계속됩니다.

조건 확인에서는 조건을 트리거 조건으로 만드는 등호("Condition...=|...") 뒤에 세로 막대 기호("|")를 사용할 수 있습니다. 장치에 대해 하나 이상의 트리거 조건이 정의된 경우 해당 장치에 대해 하나 이상의 트리거 조건이 적용되고 모든 일반(즉, 트리거되지 않는) 조건이 적용되면 장치가 시작됩니다.

따라서 ConditionHost=|각 조건을 사용하면 조건이 OR로 연결됩니다.

$ systemd-analyze condition "ConditionHost=|machine2" "ConditionHost=|stewbian"
test.service: ConditionHost=|stewbian succeeded.
test.service: ConditionHost=|machine2 failed.
Conditions succeeded.

다음과 같이 글로브를 포함할 수도 있습니다.

$ systemd-analyze condition \
    "ConditionHost=|stew*" \
    "ConditionHost=|machine*"
test.service: ConditionHost=|machine* failed.
test.service: ConditionHost=|stew* succeeded.
Conditions succeeded.

파일에서 다음을 사용하십시오.

ConditionHost=|HostOne*
ConditionHost=|HostTwo*

나는 당신이 무엇을 하고 싶은지 알 수 있습니다. 이것문서 설명하다:

이는 호스트 이름 문자열(선택적으로 쉘 스타일 글로브 사용) 이것은 로컬로 설정된 호스트 이름에 대해 테스트되었습니다...

우리가 보면man 7 glob우리는 읽고:

문자열에 "?", "*" 또는 "[" 문자 중 하나가 포함되어 있으면 와일드카드 패턴입니다. 와일드카드 지정은 와일드카드 패턴을 패턴과 일치하는 경로 이름 목록으로 확장하는 작업입니다.

이 정의에서는 및 둘 다 전역으로 간주 |되지 않습니다 {...}. systemd는 {...}일반적인 bashglob으로 간주될 수 있지만 bash가 아니며 해당 정의를 사용하지 않습니다.

관련 정보