Como eu faço certos serviços dependentes de certas interfaces? [duplicado]

4

Com o SystemD, como posso tornar determinados serviços dependentes de determinadas interfaces de rede?

Por exemplo, digamos que eu tenha uma interface de ligação 802.1ad preciso aguardar o acesso à minha SAN / NAS antes de exibir libvirtd , mesmo que eu tenha acesso à rede disponível por meio de uma interface diferente. Ou digamos que eu tenho uma sshfs mount eu quero subir automaticamente (e ser derrubado automaticamente) dependente de uma conexão VPN?

Qual é a maneira idiomática de lidar com dependências refinadas em interfaces de rede?

Atualmente, estou usando o NetworkManager no Ubuntu e no CentOS7, mas estou aberto a outros mecanismos apropriados para o gerenciamento do estado da rede.

    
por Michael Mol 23.04.2017 / 12:44

1 resposta

2

Não há realmente um padrão construído de maneira que eu não pense, mas há algumas coisas que você pode aproveitar em systemd .

ExecStartPre =

Additional commands that are executed before [...] the command in ExecStart=, respectively. Syntax is the same as for ExecStart=, except that multiple command lines are allowed and the commands are executed one after the other, serially.

If any of those commands (not prefixed with "-") fail, the rest are not executed and the unit is considered failed.

Restart = em falha

Configures whether the service shall be restarted when the service process exits, is killed, or a timeout is reached.

If set to on-failure, the service will be restarted when the process exits with a non-zero exit code, is terminated by a signal (including on core dump, but excluding the aforementioned four signals), when an operation (such as service reload) times out, and when the configured watchdog timeout is triggered.

Os comandos são considerados com falha se retornarem códigos de saída diferentes de zero, portanto, definindo o ExecStartPre como algo que comprove que sua interface está funcionando, você pode ter certeza de que seu serviço exigirá isso.

Alguns exemplos:

ExecStartPre=/usr/bin/ping -c 1 ${SAN_IP}

ExecStartPre=/usr/sbin/iscsiadm -m session

Pessoalmente, gosto da variante iscsiadm do seu caso de uso. Se houver conexões iscsi, o valor de retorno será 0, caso contrário, retornará 21 (o que causaria a falha do serviço). A variante ping pode funcionar para uma variedade maior de usos, mas eu diria que na maioria dos casos você pode querer encontrar um comando mais adequado para verificar o status da rede. Você pode até tentar usar ssh se você tiver a configuração das chaves para verificar as coisas em outro host.

A questão é que ExecStartPre pode permitir que você faça com que seu serviço falhe com base em qualquer comando. Apenas certifique-se de que qualquer comando que você usa retornará códigos de saída diferentes de zero quando você quiser (por exemplo, cat ing um arquivo vazio retorna 0, enquanto cat ing um arquivo inexistente retorna 1)

Depois de algumas considerações e do comentário do consulente, eu diria que a maneira melhor de definir uma condição complexa para um serviço é criar outro serviço para ele depender.

Crie um novo serviço que use o comando para verificar o status como ExecStart . Dê-lhe o Restart=on-failure . Em seguida, faça seu serviço original Require e After .

O exemplo de ExecStartPre que usei acima está distorcendo sua finalidade original, que era configurar as coisas para o serviço ser executado corretamente. Ele ainda pode ser aplicado e o conhecimento ainda é útil, então estou deixando-o intacto.

    
por 26.04.2017 / 23:51