Chapter 22. Introduction to Nmstate
Nmstate is a declarative network manager API. When you use Nmstate, you describe the expected networking state by using YAML or JSON-formatted instructions.
Nmstate has many benefits. For example, it:
- Provides a stable and extensible interface to manage RHEL network capabilities
- Supports atomic and transactional operations at the host and cluster level
- Supports partial editing of most properties and preserves existing settings that are not specified in the instructions
Nmstate consists of the following packages:
Packages | Contents |
---|---|
|
The |
|
The |
| The Nmstate C library |
| The Nmstate C library headers |
22.1. Using the libnmstate library in a Python application
The libnmstate
Python library enables developers to use Nmstate in their own application
To use the library, import it in your source code:
import libnmstate
Note that you must install the nmstate
and python3-libnmstate
packages to use this library.
Example 22.1. Querying the network state by using the libnmstate library
The following Python code imports the libnmstate
library and displays the available network interfaces and their state:
import libnmstate from libnmstate.schema import Interface net_state = libnmstate.show() for iface_state in net_state[Interface.KEY]: print(iface_state[Interface.NAME] + ": " + iface_state[Interface.STATE])
22.2. Updating the current network configuration by using nmstatectl
You can use the nmstatectl
utility to store the current network configuration of one or all interfaces in a file. You can then use this file to:
- Modify the configuration and apply it to the same system.
- Copy the file to a different host and configure the host with the same or modified settings.
For example, you can export the settings of the enp1s0
interface to a file, modify the configuration, and apply the settings to the host.
Prerequisites
-
The
nmstate
package is installed.
Procedure
Export the settings of the
enp1s0
interface to the~/network-config.yml
file:# nmstatectl show enp1s0 > ~/network-config.yml
This command stores the configuration of
enp1s0
in YAML format. To store the output in JSON format, pass the--json
option to the command.If you do not specify an interface name,
nmstatectl
exports the configuration of all interfaces.-
Modify the
~/network-config.yml
file using a text editor to update the configuration. Apply the settings from the
~/network-config.yml
file:# nmstatectl apply ~/network-config.yml
If you exported the settings in JSON format, pass the
--json
option to the command.
22.3. The nmstate systemd service
You can automatically apply new network settings when the Red Hat Enterprise Linux system boots by configuring the nmstate
systemd
service.
With the nmstate
package installed, you can store *.yml
files with Nmstate instructions in the /etc/nmstate/
directory. The nmstate
service then automatically applies the files on the next reboot or when you manually restart the service. After Nmstate successfully applies a file, it renames the file’s .yml
suffix to .applied
to prevent the service from processing the same file again.
The nmstate
service is a oneshot
systemd
service. Consequently, systemd
executes it only when the system boots and when you manually restart the service.
By default, the nmstate
service is disabled. Use the systemctl enable nmstate
command to enable it. Afterwards, systemd
executes this service each time when the system starts.
22.4. Network states for the network
RHEL system role
The network
RHEL system role supports state configurations in playbooks to configure the devices. For this, use the network_state
variable followed by the state configurations.
Benefits of using the network_state
variable in a playbook:
- Using the declarative method with the state configurations, you can configure interfaces, and the NetworkManager creates a profile for these interfaces in the background.
-
With the
network_state
variable, you can specify the options that you require to change, and all the other options will remain the same as they are. However, with thenetwork_connections
variable, you must specify all settings to change the network connection profile.
You can set only Nmstate YAML instructions in network_state
. These instructions differ from the variables you can set in network_connections
.
For example, to create an Ethernet connection with dynamic IP address settings, use the following vars
block in your playbook:
Playbook with state configurations | Regular playbook |
vars: network_state: interfaces: - name: enp7s0 type: ethernet state: up ipv4: enabled: true auto-dns: true auto-gateway: true auto-routes: true dhcp: true ipv6: enabled: true auto-dns: true auto-gateway: true auto-routes: true autoconf: true dhcp: true |
vars: network_connections: - name: enp7s0 interface_name: enp7s0 type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes state: up |
For example, to only change the connection status of dynamic IP address settings that you created as above, use the following vars
block in your playbook:
Playbook with state configurations | Regular playbook |
vars: network_state: interfaces: - name: enp7s0 type: ethernet state: down |
vars: network_connections: - name: enp7s0 interface_name: enp7s0 type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes state: down |
Additional resources
-
/usr/share/ansible/roles/rhel-system-roles.network/README.md
file -
/usr/share/doc/rhel-system-roles/network/
directory