Uma gramática que se aprende em um minuto

config firewall policy
    edit 10
        set name "allow-web"
        set action accept
    next
end

config abre uma tabela ou um objeto. edit entra numa entrada dentro de uma tabela. set atribui. next fecha a entrada e permanece na tabela. end fecha a tabela e aplica.

Esse é o formato inteiro, e é genuinamente fácil. A dificuldade é que três dessas palavras fazem algo um pouco diferente do que parecem.

set substitui a lista inteira

Esta é a cara.

set srcaddr "internal-net"

Numa policy cujos endereços de origem eram internal-net, branch-net, vpn-users e dmz, esse comando deixa um. Três objetos de endereço saíram da policy. O comando teve sucesso, o commit teve sucesso, e nada na saída menciona isso.

O comando que acrescenta é o append:

append srcaddr "branch-net"

A distinção é invisível ao ler um bloco de configuração de forma casual — que é exatamente quando blocos de configuração são lidos, normalmente a partir de um chamado, normalmente sob pressão de tempo. Se um bloco que você vai colar contém set num campo de múltiplos valores, a pergunta não é se ele é válido. É o que havia naquele campo antes.

edit cria o que não encontra

edit 10 não falha quando a policy 10 não existe. Ele a cria.

Isso é conveniente e significa que um erro de digitação não produz um erro, produz um objeto. Uma policy, endereço ou entrada de interface perdida normalmente remonta a uma tecla e não a uma decisão, e a única evidência é que ela existe.

end é a única linha que aplica

next fecha uma entrada e permanece na tabela, pronta para o próximo edit. end fecha a tabela e aplica. abort fecha e descarta.

Não são intercambiáveis, e o modo de falha é específico: um bloco usando end onde se queria next sai da tabela cedo demais, e cada edit restante cai em outro lugar — normalmente no nível de topo, onde ou falha ou configura algo sem relação.

Um bloco sem nenhum end não aplicou nada. Se uma mudança parece não ter feito efeito, conte os end antes de suspeitar do equipamento.

E uma coisa sobre ler configurações

show exibe apenas o que difere dos padrões. show full-configuration exibe tudo.

Então um campo ausente de um bloco de configuração não está necessariamente desconfigurado — pode simplesmente estar no seu padrão. Raciocinar sobre o que um equipamento está fazendo a partir de uma saída de show é raciocinar sobre as diferenças, não sobre o quadro completo, e essa distinção vale ser explicitada antes de tirar uma conclusão de uma ausência.