Ubuntu 16.04: atualizações autônomas são executadas em momentos aleatórios

Ubuntu 16.04: atualizações autônomas são executadas em momentos aleatórios

Configurei atualizações autônomas para instalar pacotes de segurança e notificar por e-mail quando isso acontecer.

Percebi que a instalação acontece em momentos muito aleatórios. Eu sei que as versões mais recentes adicionaram um atraso aleatório de até 30 minutos a partir do tempo de execução do cron.daily.

No entanto, os atrasos que estou enfrentando são muito maiores do que isso. Vejo atualizações autônomas sendo executadas às 9h, 15h, 12h... Os logs mostram o mesmo, então não é apenas a entrega do e-mail que demora mais.

A tarefa de atualização autônoma é a primeira no cron.daily, o que significa que não há nenhuma tarefa anterior com grandes tempos de execução.

Alguém experimentou algo semelhante?

Responder1

Depois de depurar isso, encontrei a solução.

A causa raiz desse problema reside no fato de que no Ubuntu 16.04 e mais recente, as atualizações autônomas usam o systemd - e não o cron - para agendar as atualizações com um enorme atraso aleatório:

/lib/systemd/system/apt-daily.timerestá configurado com

OnCalendar=*-*-* 6,18:00
RandomizedDelaySec=12h

Isso significa que funcionará duas vezes ao dia, às 6h e às 18h, com atraso aleatório de até 12 horas. Como isso nem sempre é aceitável para ambientes de produção, tive que substituir essas configurações.

Para manter os arquivos de configuração do pacote intactos, defini minha substituição em/etc/systemd/system/apt-daily.timer.d/override.conf(Atualizar: leia a edição no final desta resposta para obter mais informações sobre o nome do arquivo e a localização, pois parece estar ligeiramente sujeito a alterações).

Aí eu coloquei

[Timer]
OnCalendar=
OnCalendar=06:00
RandomizedDelaySec=1h

para que as atualizações autônomas sejam executadas às 6h, mais um atraso aleatório de até uma hora.

Então simplesmente reiniciei o cronômetro systemctl restart apt-daily.timer(eventualmente preciso recarregar o daemon).

As atualizações autônomas agora são executadas em horários previsíveis novamente!

Editar: Parece que no Ubuntu 18.04 as coisas mudaram um pouco. A substituição agora deve ser armazenada em/etc/systemd/system/apt-daily-upgrade.timer.d/override.confe fique assim:

[Timer]
OnCalendar=*-*-* 6:00
RandomizedDelaySec=1h

@PerlDuck mencionou uma maneira de criar um arquivo de substituição com o nome e local corretos em um comentário abaixo. Em vez de criar um arquivo manualmente, considere executarsudo systemctl edit apt-daily.timer

Responder2

A melhor maneira de atualizar o tempo de atualização autônoma, conforme eu o compilei de várias fontes e testei em nosso sistema, éuse exclusivamente os systemctlcomandose evite tentar encontrar os arquivos adequados para editar.

A única coisa que você precisa saber com certeza é o nome do serviço, que no nosso caso éapt-daily-upgrade(se não tiver certeza, procure por $ systemctl | grep apt). Quando um serviço systemd tem um timer definido, ele é referenciado como #{service_name}.timer, portanto é apt-daily-upgrade.timerpara nós.

Como a configuração do sistema não deve ser editada, teremos quesubstituir a configuração do temporizador padrãono sistema. Para isso você precisa editar algumas partes da configuração original, então vamos mostrar primeiro:

$ systemctl cat apt-daily-upgrade.timer 
# /lib/systemd/system/apt-daily-upgrade.timer
[Unit]
Description=Daily apt upgrade and clean activities
After=apt-daily.timer

[Timer]
OnCalendar=*-*-* 6:00
RandomizedDelaySec=12h
Persistent=true

[Install]
WantedBy=timers.target

Precisaremos atualizar os valores OnCalendare RandomizedDelaySecna [Timer]seção. Vamos criar o arquivo de configuração de substituição por meio do seguinte comando:

$ systemctl edit apt-daily-upgrade.timer

Isso deverá abrir um editor com um arquivo em branco e precisamos colocar lá a [Timer]seção alterada, pelo menos:

[Timer]
# Reset the system calendar config first
OnCalendar=
# Set a new calendar timer with a 60 minute threshold
OnCalendar=*-*-* 21:00
RandomizedDelaySec=60m

Como você pode ver, atualizamos o OnCalendarvalor para acionar as atualizações automáticas à noite, em vez de pela manhã. A OnCalendarlinha em branco acima deve estar presente comoeste valor de configuração éaditivo, ou seja, pode ser especificado mais de uma vez e apenas defini-lo com um valor em branco redefine todos OnCalendaros valores anteriores (aqueles da configuração do sistema).

Depois de salvar o arquivo, podemos verificar se o systemd sabe disso (não há necessidade de executar systemctl daemon-reload, o editcomando faz isso para nós ao sair do editor) executando systemctlnovamente como acima:

$ systemctl cat apt-daily-upgrade.timer

# /lib/systemd/system/apt-daily-upgrade.timer
[Unit]
Description=Daily apt upgrade and clean activities
After=apt-daily.timer

[Timer]
OnCalendar=*-*-* 6:00
RandomizedDelaySec=12h
Persistent=true

[Install]
WantedBy=timers.target

# /etc/systemd/system/apt-daily-upgrade.timer.d/override.conf
[Timer]
# Reset the system calendar config first
OnCalendar=
OnCalendar=*-*-* 21:00
RandomizedDelaySec=60m

Agora ele mostra duas configurações, com a nossa personalizada substituindo a padrão. Bom!

A verificação final de que tudo funciona conforme o esperado pode ser feita através do list-timerscomando systemctl:

$ systemctl list-timers
NEXT                        LEFT          LAST                        PASSED       UNIT                         ACTIVATES                     
...
Thu 2020-08-06 21:51:36 UTC 12h left      Thu 2020-08-06 07:10:20 UTC 2h 20min ago apt-daily-upgrade.timer      apt-daily-upgrade.service               
...             

Encontre a linha adequada na saída e observe a NEXTcoluna - o valor ali deve refletir o horário da atualização autônoma recém-configurada.

Responder3

A documentação oficial do debian emhttps://wiki.debian.org/UnattendedUpgradesatualmente contém um erro que está enganando muitas pessoas. Ele afirma que você pode substituir o tempo de atualização criando um arquivo chamado

/etc/systemd/system/apt-daily-upgrade.d/override.conf

Porém o caminho correto é

/etc/systemd/system/apt-daily-upgrade.timer.d/override.conf

Responder4

Oapt-daily.timerestá configurado para ser executado duas vezes por dia e não interromperá o ambiente de produção, pois simplesmente atualiza e baixa os pacotes que precisam ser atualizados. Você só precisa substituirapt-daily-upgrade.timerpara um momento que teria menos probabilidade de impactar seu ambiente de produção, pois é quando as atualizações são realmente instaladas. Além disso, há uma configuração para reinicializar para coisas que exigem isso em 50 atualizações autônomas que você deve considerar configurar para que sejam realmente aplicadas e que também tenha um cronômetro. Além disso, a partir de 22.04, o cronômetro de atualização foi alterado para o padrão 6h + 1h, então a maioria não precisará alterar isso.

informação relacionada