Pular para o conteúdo

Versões de software e reconstruções

Duas variáveis do Terraform definem o software de um Customer Edge: ce_os_version para o sistema operacional e ce_sw_version para o build do F5 Distributed Cloud. Ambas se comportam de maneira oposta à leitura óbvia — um campo vazio resulta no build mais recente em vez de nenhum, e uma versão que instala em um nó pode falhar em outro idêntico com um disco menor.

Separar as fases é o ponto central. Quando confundidas, o comportamento parece contraditório.

Na primeira inicialização, um nó instala o que ce_sw_version nomeia. terraform/modules/ce-node implanta a imagem do marketplace com version = "latest", portanto o build com o qual um nó chega é o que essa imagem atualmente fornece — e isso muda ao longo do tempo. ce_sw_version escolhe o destino, não se algo acontece, e deixá-lo vazio significa que o servidor escolhe, e não que o nó permanece parado. O mesmo vale para ce_os_version.

Não presuma que a direção dessa mudança é para cima. Observado em 2026-07-28, a imagem fornecia um build marcado como 20260703-e2c462a — mais recente que o crt-20250613-3382 desta frota e mais recente que o crt-20260201-0179 que o tenant estava anunciando. Nomear um build mais antigo do que o que a imagem carrega solicita que o nó retroceda, e isso é rotineiro: esta frota foi criada dessa forma e está em execução.

Deixar um campo de versão vazio é a escolha mais arriscada, não a neutra. Na criação, o servidor não deixa um campo vazio em paz — ele o preenche com a versão mais recente anunciada e instala essa versão. Um site criado com ambos os campos não definidos retornou fixado em crt-20260201-0179 e OS 9.2026.14, as duas versões que o tenant estava anunciando, e a instalação então falhou. Observado em 2026-07-29.

Há duas consequências. Vazio significa “me dê o mais recente”, portanto uma implantação sem fixação é a mais propensa a encontrar o limite de disco descrito abaixo. E você não pode isolar um campo deixando o outro vazio, porque o servidor o preenche — defina ambos deliberadamente, ou aceite o mais recente de cada um.

Após a primeira inicialização, nada atualiza por conta própria. O F5 Distributed Cloud anuncia um build mais recente e aguarda. É aí que vale “o nó permanece onde pousou” — após a criação, não durante ela.

Ambas as fases são visíveis no objeto do site. Observado em 2026-07-28, esta frota:

volterra_software_status.available_version crt-20260201-0179
operating_system_status.available_version 9.2026.14

enquanto os nós executam crt-20250613-3382 e OS 9.2024.6. Um build mais recente está disponível e não foi aceito — o estado estável, não uma atualização travada.

O Terraform não pode alterar uma versão. A API pode

Seção intitulada “O Terraform não pode alterar uma versão. A API pode”

Esses são dois fatos separados, e confundi-los produz o plano errado.

O Terraform não pode. ce_os_version e ce_sw_version são efetivamente apenas para o momento da criação. Altere qualquer um e aplique, e a API rejeita a atualização com [BAD_REQUEST] Invalid request parameters. Observado em 2026-07-29 em sites descartáveis, em todas as três direções — fixando para frente para um build mais recente, fixando para trás para um mais antigo, e desfixando ao limpar ambos os campos. Para frente não é um caso especial.

A API pode. O F5 Distributed Cloud expõe uma ação de atualização dedicada por site, que inicia a mudança no local — sem reconstrução e sem envolvimento do Terraform:

Terminal window
# build de software
curl -X POST -H "Authorization: APIToken $TOKEN" -H 'Content-Type: application/json' \
--data '{"version": "<software-version>"}' \
"$API_URL/api/config/namespaces/system/sites/<site-name>/upgrade_sw"
# sistema operacional
curl -X POST -H "Authorization: APIToken $TOKEN" -H 'Content-Type: application/json' \
--data '{"version": "<os-version>"}' \
"$API_URL/api/config/namespaces/system/sites/<site-name>/upgrade_os"

Observado em 2026-07-29: a chamada de software retornou 200, o site passou para UPGRADING com deployment_state.phase UPGRADE_IN_PROGRESS, e a versão solicitada no objeto do site mudou para a que foi enviada. Omitir o campo retorna 400 com version empty in the request, que é como o nome do campo foi confirmado.

Reserve horas, não minutos, e não entre em pânico com uma falha. Em um nó com disco padrão, a atualização para crt-20260201-0179 durou aproximadamente uma hora, reportou UPGRADE_FAILED com result Failed no meio do processo, e então completou com sucesso no novo build. A plataforma tenta novamente.

Isso tem uma consequência direta para quem está monitorando uma atualização ou criando um script: um resultado Failed é um estado pelo qual se deve aguardar, não um veredicto. Tratar o primeiro como definitivo reporta uma falha para uma atualização que vai ter sucesso.

Observe o grupo nesse caminho: estes ficam sob config, não operate. Os mesmos caminhos sob operate retornam 404 API Group could not be determined, que é uma mensagem de roteamento e não uma afirmação de que nenhuma atualização existe — uma distinção que custou a este projeto uma conclusão errada.

Se você reconstruir em vez de atualizar, todas as consequências de substituir um CE se aplicam.

Um build fixado pode falhar na instalação, e o site fica travado

Seção intitulada “Um build fixado pode falhar na instalação, e o site fica travado”

Aceitar a fixação não é o mesmo que instalá-la. Em um Customer Edge de nó único recém-criado no Azure Secure Mesh v2 fixado em crt-20260201-0179, o objeto do site reportou a versão fixada imediatamente — e a instalação então falhou:

site_state PROVISIONING
phase UPGRADE_FAILED
result Failed
last_installed (empty)
message stage: 10, app: voucher obj: voucher objKind: DaemonSet failed ...
required replicas: 1, current replicas: 0

Observado em 2026-07-28, e reproduzido duas vezes em 2026-07-29. A fixação do sistema operacional instalou normalmente na mesma execução (9.2024.6 para 9.2026.14, UPGRADE_COMPLETED); apenas a instalação do software falhou. O site nunca atingiu ONLINE e last_installed_version permaneceu vazio, portanto nada reverteu para um build funcional — não havia uma instalação anterior bem-sucedida para reverter.

Uma falha na criação não é como uma falha durante uma atualização. As duas se comportam de forma diferente e a diferença importa quando você está decidindo se deve intervir:

na criaçãodurante uma atualização via API
tenta novamente até o sucesso?não — manteve Failed por mais de 20 minutos, duas vezessim — recuperou e completou
onde o nó termina?PROVISIONING, nada instaladoONLINE em um build funcional
é seguro aguardar?não, está travadosim, recupera ou mantém o build antigo

Portanto, uma falha no momento da criação precisa de uma reconstrução com um disco maior, enquanto uma atualização reportando Failed deve ser aguardada por um tempo antes de se chegar a qualquer conclusão.

A causa é o disco, não a versão. Uma matriz de software × OS × tamanho de disco, um site descartável de nó único do Azure Secure Mesh v2 por combinação e todos da mesma imagem do marketplace, isola o problema. Observado em 2026-07-29:

softwareOS 9.2024.6 (o que a imagem fornece)OS 9.2026.14
crt-20250613-3382instalainstala
crt-20260201-0179instalafalha, somente no disco padrão

Nenhuma versão falha sozinha. Somente o par falha, e somente no disco padrão da imagem — o mesmo par instala em 33 GB e em todos os tamanhos maiores testados. Portanto, o build mais recente não tem falta de suporte aqui, e o sistema operacional mais recente também não; juntos eles precisam de um pouco mais de disco do que um nó padrão tem.

terraform/modules/ce-node não define disk_size_gb, portanto cada Customer Edge recebe o padrão da imagem — o único tamanho em que este par falha. Para executá-lo, aumente o disco.

A margem é a parte surpreendente, e é por isso que isso pareceu um problema de versão por tanto tempo. O padrão é 31 GiB (o comando health reporta size_gb: 31, e /var tem 29 G com 3,5 G livres em um nó no estado de falha). 33 GB instala corretamente. Portanto, o padrão está curto em cerca de dois gigabytes, não por uma margem ampla.

Teste uma mudança de versão em um site descartável antes de aplicá-la a uma frota independentemente: uma frota que falha dessa forma fica presa em PROVISIONING com a recriação como única saída.

A referência de comandos neste site descreve crt-20250613-3382, o build que esta frota executa. Comandos que existem apenas em builds mais recentes estão registrados em sitecli/command-classification.json sob not_on_this_build e documentados separadamente, como comandos em builds mais recentes, portanto nada lá é apresentado como executável aqui. Veja também comandos no dispositivo.