Um servidor, dois UPS da APC em fontes de alimentação redundantes: Como acionar o desligamento?

10

Eu tenho um servidor em rack e suas fontes de alimentação redundantes conectadas a dois APC Smart-UPS 3000 XLM. Cada no-break está conectado a duas fontes de energia elétrica diferentes.

Duas instâncias do apcupsd estão em execução, cada uma conectada ao seu próprio no-break. Ambos podem detectar quando um no-break está com bateria e cada no-break pode acionar um desligamento no servidor.

A pergunta é: como NÃO desligar se APENAS UM UPS ficar sem bateria?

Nota: O Smart-UPS 3000 XLM possui uma função "Power Sync" capaz de conectar-se ao seu par e detectar seu status. Mas quando puxei o plugue de um deles, o pedido de desligamento foi enviado de qualquer maneira. Estou pensando em modificar os scripts de desligamento para verificar com "apcaccess" se os outros ups estão inativos. Qualquer experiência sobre isso seria apreciada!

Falken
fonte

Respostas:

13

Atualmente, quando um dos dois UPS morre, o evento doshutdown é acionado e executa o script padrão via apccontrol . O script doshutdown ignora o segundo no-break, pois eles não estão conectados a eventos e prossegue normalmente com o desligamento.

Para que os eventos doshutdown estejam um pouco conectados, as duas instâncias do apcupsd precisam de um arquivo de configuração especificamente customizado. A diferença residirá no diretório a partir do qual os scripts de eventos devem ser executados.

Principais propriedades dos primeiros ups, em /etc/apcupsd/apcupsd.ups0.conf

SCRIPTDIR /etc/apcupsd/ups0
UPSNAME ups0
DEVICE /dev/ups0
PWRFAILDIR /etc/apcupsd/ups0
NOLOGINDIR /etc/apcupsd/ups0
NISPORT 3551
EVENTSFILE /var/log/apcupsd.0.events

E para os ups1, em /etc/apcupsd/apcupsd.ups1.conf

SCRIPTDIR /etc/apcupsd/ups1
UPSNAME ups1
DEVICE /dev/ups1
PWRFAILDIR /etc/apcupsd/ups1
NOLOGINDIR /etc/apcupsd/ups1
NISPORT 3552
EVENTSFILE /var/log/apcupsd.1.events

Cada scriptdir deve obter uma cópia dos scripts padrão.
Queremos personalizar o script doshutdown , que não desligará diretamente a máquina, mas deverá verificar se o outro no-break ainda está ligado ou está no modo de desligamento.

Na parte superior do script doshutdown , poderíamos adicionar algo como

para ups0

if [ ! -f /tmp/ups1.is.down ]
then
  touch /tmp/ups0.is.down
  exit 99
fi

para ups1

if [ ! -f /tmp/ups0.is.down ]
then
  touch /tmp/ups1.is.down
  exit 99
fi

o status 99 tem um significado especial, que diz ao apccontrol para interromper a ação em andamento. As cinco linhas verificam se o outro arquivo no-break foi criado; se não , o arquivo inativo é criado para os altos inativos e sai. Se sim , o que significa que o outro no-break está inoperante, este também está desativado, portanto, o script deve continuar e desligar a máquina.

Os arquivos /tmp/usp[01].is.downindicam se os ups [01] estão atualmente inativos.

Importante: o script init.d start do apcupsd deve remover esses arquivos, se eles foram criados em uma sessão anterior:

rm -f /tmp/usp[01].is.down

Finalmente, os diretórios criados acima, / etc / apcupsd / ups [01], devem ter acesso ao usuário apcupsd (ou a qualquer usuário relevante que esteja executando as instâncias).

chown -R apcupsd /etc/apcupsd/ups[01]

Por favor, dê uma olhada na documentação detalhada .

editar fixo os /tmp/ups[01].is.downnomes, o .isestava faltando.

Anel Ø
fonte
1
e usuários regulares podem parar seu servidor com touch /tmp/ups1.is.down; toque em /tmp/ups0.is.down: D Portanto, seria melhor usar / var / run, por exemplo. Btw. se alguém recortar e colar a solução, o rm -f /tmp/usp[01unette.is.down é um erro de digitação. E, a propósito, você deve excluir o /tmp/ups[01unette.is.down da caixa de bateria externa do apccontrol, quando a energia retornar.
precisa saber é o seguinte
1
Eu sugiro que você toque no seu próprio arquivo is.down ANTES de verificar o outro - do jeito que está agora, acho que há uma pequena janela de condição de corrida se os dois ups saírem exatamente ao mesmo tempo.
precisa saber é o seguinte
4

Olhe NUT. Ele lida bem com isso. Defina o número de fontes de alimentação de cada no-break e o número de fontes de alimentação necessárias. O desligamento não será acionado enquanto houver fontes de alimentação suficientes fora do no-break.

BillThor
fonte