NMState: uma ferramenta de configuração de rede declarativa
O ecossistema Linux oferece inúmeras maneiras de configurar a rede, incluindo o popular daemon Network Manager e ferramentas de linha de comando, como o utilitário GUI nmcli e nmtui. Este guia apresenta outra ferramenta de configuração de rede conhecida como NMState
NMState é um gerenciador de rede declarativo para configurar redes em hosts Linux. É uma biblioteca que fornece uma ferramenta de linha de comando que gerencia as configurações da rede host. Ele gerencia a rede de host por meio de uma API declarativa norte. No momento em que este guia foi escrito, o daemon NetworkManager era o único provedor suportado pelo NMState.
Neste guia, veremos alguns exemplos de uso da ferramenta NMState. Neste guia, demonstraremos isso usando o Fedora Linux.
Abordagens imperativas versus declarativas
O gerenciamento de rede pode adotar duas abordagens – Imperativa e declarativa. Na abordagem imperativa, você define explicitamente o estado de rede de uma interface executando comandos no terminal. O foco está no ‘como’.
Por exemplo, para derrubar uma rede usando a abordagem imperativa, execute o comando:
sudo ifconfig enp0s3 down
Por outro lado, a abordagem declarativa usa um arquivo YAML para aplicar as alterações a uma configuração. A maioria das ferramentas de orquestração DevOps, como o Kubernetes, usa essa abordagem para implantar aplicativos pods usando um arquivo YAML.
Essa abordagem fornece o que é comumente chamado de Infraestrutura como Código (IaC) nos círculos de DevOps. Isso aprimora a automação da configuração de rede no host e fornece uma maneira mais rápida e confiável de fazer diversas alterações em uma interface de rede com o mínimo de erros.
Agora, vamos mudar de assunto e ver como você pode usar a ferramenta de configuração NMState para configurar suas interfaces de rede no Linux.
Etapa 1: instalar a ferramenta de configuração de rede NMState
Daremos o pontapé inicial instalando o Nmstate. Primeiro, verifique a disponibilidade do pacote nos repositórios do Fedora da seguinte forma:
sudo dnf search nmstate
Pela saída, podemos ver que o gerenciador de rede está disponível nos repositórios oficiais.
Em seguida, instale o NMstate da seguinte maneira. Isso funciona no Fedora 31 e versões posteriores.
sudo dnf install nmstate
O comando instala a API do gerenciador de rede NMState juntamente com outras dependências do Python.
Assim que a instalação for concluída, verifique se o pacote nmstate está instalado da seguinte maneira.
rpm -qi nmstate
Para Linux baseado em RHEL, habilite primeiro o repositório copr.
sudo dnf copr enable nmstate/nmstate-stable
Em seguida, instale o NMstate da seguinte maneira.
sudo dnf install nmstate
Confira instruções adicionais sobre como instalar o NMState da fonte.
Depois de instalado, você pode verificar a versão do NMstate instalada da seguinte maneira.
nmstatectl version
1.0.2
Usando a ferramenta de configuração NMState no Linux
Com o NMstate instalado, vamos aos detalhes de como você pode aproveitar ao máximo a API do gerenciador de rede.
Para visualizar a configuração de rede atual da sua interface de rede, execute o seguinte comando. Aqui está a configuração da sua interface enp0s3.
nmstatectl show enp0s3
A saída é dividida em 4 seções distintas:
- dns-resolver: Esta seção contém a configuração do servidor de nomes para a interface específica.
- regras de rota: estipula as regras de roteamento.
- rotas: inclui rotas dinâmicas e estáticas.
- Interfaces: Esta seção especifica as configurações de ipv4 e ipv6.
Alterando a configuração de rede no Linux
Você pode usar a ferramenta de configuração NMState para configurar seus hosts para o estado desejado usando modos interativos ou baseados em arquivo.
- Interativo: edita uma interface de rede usando o comando nmstatectl edit. Este comando abre um editor de texto que é definido pela variável de ambiente EDITOR. Depois que as alterações forem salvas, o NMState aplicará a nova configuração imediatamente, a menos que sejam detectados erros de sintaxe.
- Baseado em arquivo: no modo baseado em arquivo, a configuração da interface é aplicada usando um arquivo YAML ou JSON usando o comando nmstatectl apply.
Vamos agora colocar a mão na massa e ver como você pode modificar a configuração da rede usando NMState.
Nosso sistema Fedora possui duas interfaces de rede ativas com a seguinte configuração:
ip -br -4 a
Saída de amostra
lo UNKNOWN 127.0.0.1/8
enp0s3 UP 192.168.2.104/24
enp0s8 UP 192.168.2.103/24
Exemplo de modo de configuração interativo
Usaremos o modo interativo para alterar o MTU (Unidade Máxima de Transmissão) da interface de rede enp0s3. Por padrão, isso é definido como 1500 conforme mostrado.
ifconfig
Vamos mudar isso para 4000. Faremos isso usando o comando nmstatectl edit da seguinte forma.
sudo nmstatectl edit enp0s3
Isso abre a configuração em um editor de texto. Para o nosso caso, ele abre no editor vim. Em seguida, role até o fim e localize o parâmetro mtu. Alteraremos o valor para 4000, assim como editaríamos um arquivo no vim. Então salvaremos as alterações.
Ao salvar e sair do arquivo, você verá alguma saída embaralhada no terminal enquanto NMstate salva as alterações. Nenhuma intervenção é necessária, então apenas fique quieto.
Vamos agora confirmar se a alteração foi feita.
ifconfig
Na saída do terminal, podemos ver que alteramos com sucesso o MTU para 4000 do valor padrão 1500.
Exemplo de modo de configuração baseado em arquivo
Vamos agora modificar a configuração usando o modo baseado em arquivo. Neste exemplo, desabilitaremos o IPv6 para a interface de rede enp0s8. A primeira etapa é criar um arquivo YAML que especificará o estado desejado da interface de rede enp0s8.
sudo nmstatectl show enp0s8 > enp0s8.yml
A seguir, editaremos o arquivo YAML da seguinte maneira.
sudo vim enp0s8.yml
Role para baixo até a seção ipv6. Para desabilitar o IPv6, defina o parâmetro enabled como false e exclua as linhas que foram riscadas.
Salve a configuração e aplique o novo estado usando o arquivo YAML da seguinte maneira.
sudo nmstatectl apply enp0s8.yml
Agora execute o comando mostrado para verificar se o IPv6 foi desabilitado. A saída exibida mostra que o IPv6 da interface de rede enp0s8 está em branco, o que significa que desabilitamos o IPv6 na interface com sucesso.
ip -br a
Aplicando alterações de rede temporariamente
Outra funcionalidade realmente útil que o NMstate oferece é a capacidade de configurar temporariamente um estado de rede desejado. Quando estiver satisfeito com a configuração, você poderá prosseguir e tornar as alterações permanentes. Caso contrário, as alterações feitas voltarão às configurações iniciais assim que o tempo limite expirar. O tempo limite padrão é 60 segundos.
Para demonstrar isso, definiremos temporariamente um IP estático na interface enp0s3 e desabilitaremos o DHCP. Mais uma vez, acesse o arquivo usando um editor de texto.
sudo vim enp0s3.yml
Vá até a seção ipv4. Especifique o IP estático – no nosso caso 192.168.2.150 e exclua as linhas que foram riscadas. Além disso, certifique-se de definir o parâmetro dhcp como false.
Salve o arquivo e confirme temporariamente as alterações da seguinte maneira.
sudo nmstatectl apply --no-commit --timeout 20 enp0s3.yml
A opção --no-commit
aplica temporariamente as alterações por um período definido pela opção --timeout
que, neste exemplo, é de 20 segundos.
Para verificar a aplicação temporal das alterações, verificaremos a configuração do IP em um intervalo de tempo de 20 segundos.
ip -br a
Na saída, você pode ver que a configuração IP da interface foi revertida para DHCP após o intervalo de tempo de 20 segundos. O endereço IP voltou para 192.168.2.104 do IP configurado estaticamente anteriormente, que era 192.168.2.150.
É certo que a ferramenta NMState é uma ferramenta conveniente para configurar suas interfaces de rede. É uma ferramenta declarativa que aplica o estado de configuração desejado da interface de um host usando a API NetworkManager.
O estado é facilmente definido usando a abordagem interativa ou usando o método baseado em arquivo que usa um YAML pré-configurado. forte> arquivo. Isso aprimora a automação das tarefas de configuração e a redução de erros durante a configuração.