Restringindo unidades systemd a um host específico baseado no alias de DNS?

0

Eu sei que é possível restringir as unidades systemd a um host específico usando a condição ConditionHost no arquivo da unidade. Esse ConditionHost é testado em relação ao resultado de chamar o nome do host.

O que não consegui encontrar (mas espero que isso seja possível) é uma maneira de fazer o mesmo com base em um alias de DNS. Então, eu estou esperando uma maneira de iniciar unidades do sistema em hosts onde o alias do DNS especificado no arquivo de unidade é resolvido para o host atual.

Antecedentes: No momento, temos uma série de aplicativos / serviços, iniciados como serviços systemd e agrupados em alvos do systemd. Cada arquivo de unidade de serviço contém um ConditionHost especificando em qual host esse serviço deve ser executado. Os arquivos da unidade são distribuídos via RPMs e todos os arquivos da unidade são instalados em todos os hosts. Agora é possível iniciar o mesmo destino systemd em todos esses hosts e o systemd cuidará de iniciar os serviços corretos nos hosts corretos, com base no nome do host. Os serviços geralmente são acessados por clientes usando um alias de DNS e não usando diretamente o nome do host.

Se um dos hosts acima quebrar, pode-se facilmente usar um sobressalente com a mesma configuração e atualizar o alias de DNS de acordo. A inconveniência é, no entanto, que os arquivos da unidade systemd agora também precisam ser atualizados para refletir a especificação do ConditionHost para os serviços afetados.

A idéia era que, se o systemd pudesse usar o alias do DNS em vez do nome do host, seria suficiente 1) atualizar o alias do DNS e 2) reiniciar o destino do systemd na máquina substituta.

    
por Jeroen Hegeman 16.10.2018 / 09:38

1 resposta

0

Você pode escrever um script de wrapper que execute o serviço somente se a verificação de alias do DNS for aprovada. O valor a ser verificado pode ser passado como variável ambiental.

Arquivo de serviço:

[Service]
Environment=CONDITION_DNSALIAS=abc
Exec=/path/to/dnsaliascheck-wrapper exec args
...

Roteiro do Wrapper:

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

Você precisa gravar a verificação real em check_dns_alias , usando a variável CONDITION_DNSALIAS para comparar.

    
por 16.10.2018 / 10:35

Tags