Как запустить и остановить системный блок с другим?

20

Я использую CoreOS для планирования системных модулей с флотом. У меня есть два устройства ( firehose.serviceи firehose-announce.service. Я пытаюсь заставить firehose-announce.serviceих запускаться и останавливаться вместе с firehose.service. Вот файл модуля для firehose-announce.service:

[Unit]
Description=Firehose etcd announcer
BindsTo=firehose@%i.service
After=firehose@%i.service
Requires=firehose@%i.service

[Service]
EnvironmentFile=/etc/environment
TimeoutStartSec=30s
ExecStartPre=/bin/sh -c 'sleep 1'
ExecStart=/bin/sh -c "port=$(docker inspect -f '{{range $i, $e := .NetworkSettings.Ports }}{{$p := index $e 0}}{{$p.HostPort}}{{end}}' firehose-%i); echo -n \"Adding socket $COREOS_PRIVATE_IPV4:$port/tcp to /firehose/upstream/firehose-%i\"; while netstat -lnt | grep :$port >/dev/null; do etcdctl set /firehose/upstream/firehose-%i $COREOS_PRIVATE_IPV4:$port --ttl 300 >/dev/null; sleep 200; done"
RestartSec=30s
Restart=on-failure

[X-Fleet]
X-ConditionMachineOf=firehose@%i.service

Я пытаюсь использовать BindsToс понятием, что запуск и остановка firehose.serviceтакже будут запускаться или останавливаться firehose-announce.service. Но это никогда не происходит правильно. Если firehose.serviceостановлен, то firehose-announce.serviceпереходит в сбойное состояние. Но когда я начинаю firehose.service, firehose-announce.serviceне запускается.

Что я здесь не так делаю?

Энди Шинн
источник
Та же проблема здесь. Вы нашли решение?
Нахимэ

Ответы:

24

Я, кажется, наконец-то наткнулся на правильную комбинацию, чтобы заставить это работать как хотелось.

В моем firehose-announce.serviceблоке я только установил BindsTo. Весь блок это:

[Unit]
Description=Firehose etcd announcer
BindsTo=firehose@%i.service

[Service]
EnvironmentFile=/etc/environment
TimeoutStartSec=30s
ExecStartPre=/bin/sh -c 'sleep 1'
ExecStart=/bin/sh -c "port=$(docker inspect -f '{{range $i, $e := .NetworkSettings.Ports }}{{$p := index $e 0}}{{$p.HostPort}}{{end}}' firehose-%i); echo -n \"Adding socket $COREOS_PRIVATE_IPV4:$port/tcp to /firehose/upstream/firehose-%i\"; while netstat -lnt | grep :$port >/dev/null; do etcdctl set /firehose/upstream/firehose-%i $COREOS_PRIVATE_IPV4:$port --ttl 300 >/dev/null; sleep 200; done"
RestartSec=30s
Restart=on-failure

[X-Fleet]
X-ConditionMachineOf=firehose@%i.service

Это приведет firehose-announce.serviceк остановке устройства, когда это firehose.serviceпроизойдет. Отлично. Но как мы можем начать это снова?

Я изменяю зависимость, чтобы быть в моем firehose.serviceмодуле, вот так:

[Unit]
Description=Firehose server
Wants=firehose-announce@%i.service
Before=firehose-announce@%i.service

[Service]
ExecStartPre=/usr/bin/docker pull firehose/server
ExecStartPre=-/usr/bin/docker rm -f firehose-%i
ExecStart=/usr/bin/docker run --name firehose-%i -p 7474 --env-file /home/core/firehose.env firehose/server
ExecStop=/usr/bin/docker rm -f firehose-%i
User=core
TimeoutStartSec=5m
TimeoutStopSec=20s
RestartSec=30s
Restart=on-failure

[Install]
WantedBy=multi-user.target

[X-Fleet]
X-Conflicts=firehose@*.service

Это говорит о том, что firehose.serviceхочет firehose-announce.serviceзапустить, когда это происходит (но не терпит неудачу, если firehose-announce.serviceне может начать). Это также гарантирует, что firehose.serviceначинается раньше firehose-announce.service.

Я проверил это, и теперь кажется, что блоки останавливаются и запускаются вместе, как хотелось.

Энди Шинн
источник
Отлично, я попробую.
Нахимэ
1
Видимо, Wants = означает необязательный. Требуется = является требованием. BindsTo означает, что если зависимость, т.е. служба firehose, прекращается, то служба firehose-announce также считается остановленной. Звучит как хорошая вещь для меня.
Мэтт
Можно ли получить такое поведение, не касаясь firehouse.service?
buddy123
Я пробовал это решение, но столкнулся с одной проблемой. У меня есть служба A с Требуется = B.service и служба B с BindsTo = A.service. Когда A выходит ненормально, я вижу, как A и B перезапускаются. Но когда A выходит с кодом 0 / SUCESS, оба остаются в остановленном состоянии
Bug Killer
ExecStartPre = {dash} -не имеет смысла для последнего и служит только для всех, кроме последнего ExecStartPre
эффект