community.general.nmcli 模块 – 管理网络
注意
此模块是 community.general 集合 (版本 10.1.0) 的一部分。
如果您正在使用 ansible 包,您可能已经安装了此集合。它不包含在 ansible-core 中。要检查是否已安装,请运行 ansible-galaxy collection list。
要安装它,请使用:ansible-galaxy collection install community.general。您需要进一步的要求才能使用此模块,请参阅 要求 了解详细信息。
要在 playbook 中使用它,请指定:community.general.nmcli。
概要
- 管理网络设备。创建、修改和管理各种连接和设备类型,例如以太网、团队、绑定、VLAN 等。 
- 在 CentOS 8 和 Fedora >=29 等类系统上,可以通过安装以下软件包来满足要求:NetworkManager。 
- 在 CentOS 7 和 Fedora <=28 等类系统上,可以通过安装以下软件包来满足要求:NetworkManager-tui。 
- 在 Ubuntu 和 Debian 等类系统上,可以通过安装以下软件包来满足要求:network-manager 
- 在 openSUSE 上,可以通过安装以下软件包来满足要求:NetworkManager。 
要求
执行此模块的主机需要满足以下要求。
- nmcli 
参数
| 参数 | 注释 | 
|---|---|
| 配置用于使用 IPv6 无状态地址自动配置创建地址的方法。 
 选择 
 | |
| 这仅用于网桥 - [ageing-time <0-1000000>] 以太网 MAC 地址老化时间,以秒为单位。 默认值:  | |
| 这仅用于绑定 - ARP 间隔。 | |
| 这仅用于绑定 - ARP IP 目标。 | |
| 是否应在启动时启动连接。 连接配置文件是否可以自动激活 选择 
 | |
| 用于调用连接的名称。模式为 <type>[-<ifname>][-<num>]。 | |
| 如果连接被修改,是否应重新加载连接。 选择 
 | |
| 发送到 DHCP 服务器的 DHCP 客户端标识符。 | |
| 最多 3 个 DNS 服务器的列表。 条目必须是 IPv4 地址,例如  | |
| 忽略自动配置的 IPv4 名称服务器。 选择 
 | |
| DNS 选项的列表。 | |
| DNS 搜索域的列表。 | |
| 最多 3 个 DNS 服务器的列表。 条目必须是 IPv6 地址,例如  | |
| 忽略自动配置的 IPv6 名称服务器。 选择 
 | |
| DNS 选项的列表。 | |
| DNS 搜索域的列表。 | |
| 这仅用于绑定 - downdelay。 | |
| 这仅用于 VLAN - VLAN 出口优先级映射。 | |
| 这仅用于 VLAN - 标志。 | |
| 这仅用于网桥 - [forward-delay <2-30>] STP 转发延迟,以秒为单位。 默认值:  | |
| GSM 连接的配置。 请注意,子选项属性列表可能因主机上安装的 NetworkManager/nmcli 版本而异。 可以在此处找到支持的属性的最新列表:https://networkmanager.dev/docs/api/latest/settings-gsm.html。 例如,要使用 apn、pin、username 和 password: | |
| GPRS 接入点名称,指定与基于 GSM 的网络建立数据会话时使用的 APN。 APN 通常决定用户如何为其网络使用付费,以及用户是否有权访问 Internet 或仅访问特定于提供商的围墙花园,因此为用户的移动宽带计划使用正确的 APN 非常重要。 根据 GSM 03.60 第 14.9 节,APN 只能由字符 a-z、0-9、. 和 - 组成。 | |
| 当  选择 
 | |
| 此连接应用到的设备唯一标识符(由  如果给定,则连接将仅应用于指定的设备。 | |
| 当  不会建立到漫游网络的连接。 选择 
 | |
| 如果非零,则仅传输指定大小或更小的数据包,将较大的数据包分解为多个以太网帧。 默认值:  | |
| 强制特定网络注册的网络 ID(GSM LAI 格式,即 MCC-MNC)。 如果指定了网络 ID,NetworkManager 将尝试强制设备仅在指定的网络上注册。 这可用于确保在无法以其他方式直接控制设备的漫游时,设备不会漫游。 | |
| 用于帮助为基于 GSM 的调制解调器建立 PPP 数据会话的旧版设置。 | |
| 如果需要,用于向网络进行身份验证的密码。 许多提供商不需要密码,或者接受任何密码。 但是,如果需要密码,则在此处指定。 | |
| 指示如何处理  允许以下选择: 选择 
 | |
| 如果 SIM 卡已使用 PIN 码锁定,则必须先解锁,然后才能请求任何其他操作。 在此处指定 PIN 码以允许设备运行。 | |
| 指示如何处理  有关 NMSettingSecretFlags 选择,请参阅  选择 
 | |
| 此连接应用到的 SIM 卡唯一标识符(由  如果给定,则连接将应用于也由  | |
| 类似于  如果给定,则连接将应用于也由  | |
| 如果需要,用于向网络进行身份验证的用户名。 许多提供商不需要用户名,或者接受任何用户名。 但是,如果需要用户名,则在此处指定。 | |
| 此接口的 IPv4 网关。 使用格式  此参数与 never_default4 参数互斥。 | |
| 忽略自动配置的 IPv4 路由。 选择 
 | |
| 此接口的 IPv6 网关。 使用格式  | |
| 忽略自动配置的 IPv6 路由。 选择 
 | |
| 这仅与“bridge-slave”一起使用 - 从属的“hairpin 模式”,它允许帧通过接收帧的从属发送回。 community.general 7.0.0 中的默认更改为  选择 
 | |
| 这仅与桥接一起使用 - [hello-time <1-10>] STP hello 时间,以秒为单位。 默认值:  | |
| 要将连接绑定到的接口。 该连接仅适用于此接口名称。 对于与接口无关的连接,可以使用特殊值  ifname 参数对于除 bond、team、bridge、vlan 和 vpn 之外的所有连接类型都是必需的。 当所有连接类型(除了删除它的 vpn)都未设置时,此参数默认为  | |
| 这仅与 VLAN 一起使用 - VLAN 入口优先级映射。 | |
| 如果启用,它会使内核除了公共 IPv6 地址之外,还生成一个临时的 IPv6 地址。 选择 
 | |
| 用于 GRE/IPIP/SIT - 此 GRE/IPIP/SIT 隧道的父设备,可以使用 ifname。 | |
| 用于隧道输入数据包的密钥。 仅在  | |
| 用于 GRE/IPIP/SIT - GRE/IPIP/SIT 本地 IP 地址。 | |
| 用于隧道输出数据包的密钥。 仅在  | |
| 用于 GRE/IPIP/SIT - GRE/IPIP/SIT 目标 IP 地址。 | |
| 连接的 MAC 地址。 注意,这需要最近的内核特性,最初在 3.15 上游内核中引入。 | |
| MAC VLAN 连接的配置。 请注意,子选项属性列表可能因主机上安装的 NetworkManager/nmcli 版本而异。 可以在这里找到支持的属性的最新列表:https://networkmanager.dev/docs/api/latest/settings-macvlan.html。 | |
| macvlan 模式,它指定同一底层设备上多个 macvlan 之间的通信机制。 允许以下选择: 选择 
 | |
| 如果给定,指定应从中创建此 MAC-VLAN 接口的父接口名称或父连接 UUID。 如果未指定此属性,则连接必须包含带有 “mac-address” 属性的 “802-3-ethernet” 设置。 | |
| 是否应将接口置于混杂模式。 选择 
 | |
| 接口是否应为 MACVTAP。 选择 
 | |
| 桥接、团队、绑定、ovs-port 主连接配置文件的 Master <master(ifname,或连接 UUID 或 conn_name)。 如果定义了  | |
| 这仅用于桥接 - [max-age <6-42>] STP 最大消息生存时间,以秒为单位。 默认值:  | |
| 用于 IPv4 的配置方法。 如果设置了  选择 
 | |
| 用于 IPv6 的配置方法 如果设置了  
 选择 
 | |
| 这仅用于绑定 - miimon。 当未设置此参数时,此参数默认为  | |
| 这是您希望为绑定或桥接创建的设备或网络连接的类型。 选择 
 | |
| 连接的 MTU,例如 9000。 这不能在创建接口时应用,而是在创建接口后完成。 可在修改 Team、VLAN、以太网时使用(未来计划实现 wifi、gsm、pppoe、infiniband) 当未设置此参数时,此参数默认为  | |
| 设置为默认路由。 此参数与 gw4 参数互斥。 选择 
 | |
| 这仅用于 “bridge-slave” - [<1-65535>] - 通过此从属的 STP 端口目标成本。 默认值:  | |
| 这仅用于绑定,是主接口名称(对于 “active-backup” 模式),这通常是 “ifname”。 | |
| 这仅用于 “bridge” - 设置 STP 优先级。 默认值:  | |
| 设置接口上配置的 IPv4 路由的指标级别。 | |
| 设置接口上配置的 IPv6 路由的指标级别。 | |
| IPv4 路由列表。 | |
| 拥塞窗口的钳制。 | |
| 路由的 IP 或前缀。 使用格式  | |
| 路由指标。 | |
| 如果为非零值,则仅传输指定大小或更小的数据包。 | |
| 使用格式  | |
| 即使下一跳不匹配任何接口前缀,也假装下一跳直接连接到此链路。 选择 
 | |
| 将此路由添加到的表。 默认值取决于  | |
| 服务类型。 | |
| 带有参数的 IPv6 路由列表。 | |
| 拥塞窗口的钳制。 | |
| 路由的 IP 或前缀。 使用格式  | |
| 路由指标。 | |
| 如果为非零值,则仅传输指定大小或更小的数据包。 | |
| 使用格式  | |
| 即使下一跳不匹配任何接口前缀,也假装下一跳直接连接到此链路。 选择 
 | |
| 将此路由添加到的表。 默认值取决于  | |
| 与  | |
| 这是您希望为团队创建的设备或网络连接的类型。 选择 
 | |
| 选项指定请求我们的链路合作伙伴传输 LACPDU 数据包的速率。 如果此值为  仅允许用于  选择 
 | |
| 这定义了在团队生命周期内应如何设置团队设备和端口设备的硬件地址的策略。 选择 
 | |
| 此从属主连接的设备类型(例如  类型  选择 
 | |
| 这仅用于 “bridge-slave” - [<0-63>] - 此从属的 STP 优先级。 默认值:  | |
| 允许配置 SR-IOV 设置。 可以在这里找到支持的属性的最新列表:https://networkmanager.pages.freedesktop.org/NetworkManager/NetworkManager/settings-sriov.html。 | |
| 是否通过兼容的驱动程序自动探测虚拟功能。 | |
| 选择 eswitch 封装支持。 | |
| 选择设备的 eswitch 内联模式。 | |
| 选择设备的 eswitch 模式。 | |
| 要创建的虚拟功能数。 请查阅您的 NIC 文档以获取支持的最大 VF 数。 | |
| 形式为: 可以使用逗号作为分隔符指定多个 VF,例如  | |
| 无线路由器或接入点的名称。 | |
| 设备是否应该存在,如果状态与所声明的不同,则采取行动。 使用  使用  选择 
 | |
| 这仅用于桥接,并控制是否为此桥启用生成树协议 (STP)。 选择 
 | |
| 此选项设置 Infiniband IPoIB 设备的连接类型。 选择 
 | |
| 这是您希望创建或修改的设备或网络连接的类型。 类型  类型  类型  类型  类型  类型  类型  类型  类型  类型  使用  如果您想控制附加到  选择 
 | |
| 此选项仅与 bond - updelay 一起使用。 | |
| 此选项仅与 VLAN 一起使用 - 此 VLAN 所在的父设备,可以使用 ifname。 | |
| 此选项仅与 VLAN 一起使用 - VLAN ID,范围为 <0-4095>。 | |
| VPN 连接的配置 (PPTP 和 L2TP)。 为了使用 L2TP,您需要确保主机上安装了  | |
| 连接的网关。它可以是 IP 地址 (例如  | |
| 启用或禁用到 L2TP 主机的 IPSec 隧道。 当  选择 
 | |
| base64 编码的预共享密钥。 您可以使用以下 Ansible jinja2 表达式进行编码:  仅当  | |
| NMSettingSecretFlags 指示如何处理  允许以下选项:  选择 
 | |
| 将有权使用连接的用户。 | |
| 定义连接的服务类型。 | |
| VPN 管理员提供的用户名。 | |
| 此选项仅与 VXLAN 一起使用 - VXLAN ID。 | |
| 此选项仅与 VXLAN 一起使用 - VXLAN 本地 IP 地址。 | |
| 此选项仅与 VXLAN 一起使用 - VXLAN 目标 IP 地址。 | |
| 无线连接的配置。 请注意,子选项属性列表可能因主机上安装的 NetworkManager/nmcli 版本而异。 可以在这里找到受支持属性的最新列表: https://networkmanager.dev/docs/api/latest/settings-802-11-wireless.html。 例如,要创建隐藏的 AP 模式无线连接:  | |
| 配置 AP 隔离,这可以防止连接到此 AP 的无线设备之间进行通信。 仅当接口配置为 AP 模式时,此属性才能设置为与  如果设置为  如果设置为  如果设置为  选择 
 | |
| 克隆 MAC 地址的新字段。 它可以是 ASCII 表示形式的硬件地址,也可以是特殊值  此字段替换 D-Bus 上已弃用的  请注意,此属性仅存在于 D-Bus API 中。 libnm 和 nmcli 继续将此属性称为  | |
| 网络的 802.11 频段。 可以是  这会将 Wi-Fi 网络的关联锁定到特定频段,因此,例如,如果指定了  此设置取决于特定的驱动程序功能,可能不适用于所有驱动程序。 选择 
 | |
| 如果指定,则指示设备仅与给定的接入点关联。 此功能高度依赖于驱动程序,并非所有设备都支持。 请注意,此属性不控制创建 Ad-Hoc 网络时使用的 BSSID,并且将来不太可能这样做。 | |
| 用于 Wi-Fi 连接的无线信道。 该设备将仅在指定的信道上加入(或为 Ad-Hoc 网络创建)Wi-Fi 网络。 由于信道号在频段之间重叠,因此此属性还需要设置  默认值:  | |
| 此 D-Bus 字段已被弃用,转而使用  对于 libnm 和 nmcli,此字段称为  | |
| 使用  请注意,第一个 MAC 地址的最低有效位将始终取消设置,以创建单播 MAC 地址。 如果属性为  如果该值仍然是  如果该值包含一个 MAC 地址,则此地址将用作掩码。掩码的设置位将填充设备的当前 MAC 地址,而未设置的位则会进行随机化。 设置  如果该值在掩码后包含一个额外的 MAC 地址,则将使用此地址而不是当前的 MAC 地址来填充不应随机化的位。 例如,值  值  如果该值包含多个额外的 MAC 地址,则会随机选择其中一个。例如, | |
| 如果为  在基础设施模式下,会使用各种变通方法来更可靠地发现隐藏网络,例如探测扫描 SSID。然而,这些变通方法暴露了隐藏 SSID 网络固有的不安全性,因此应谨慎使用隐藏 SSID 网络。 在 AP 模式下,创建的网络不会广播其 SSID。 请注意,将网络标记为隐藏可能会对您(在基础设施模式下)或客户端工作站(在 AP 模式下)造成隐私问题,因为显式的探测扫描在空中是可明显识别的。 选择 
 | |
| 如果指定,则此连接将仅应用于其永久 MAC 地址匹配的 Wi-Fi 设备。 此属性不会更改设备的 MAC 地址(例如用于 MAC 欺骗)。 | |
| Wi-Fi 设备的永久 MAC 地址列表,此连接永远不应应用于这些设备。 每个 MAC 地址应以标准的十六进制数字和冒号表示法给出(例如, | |
| 以下之一: 此属性已弃用,请使用  选择 
 | |
| Wi-Fi 网络模式。如果为空,则假定为  选择 
 | |
| 如果非零,则仅传输指定大小或更小的数据包,将较大的数据包分解为多个以太网帧。 默认值:  | |
| 以下之一: 所有其他值均保留。 选择 
 | |
| 如果非零,则指示设备仅使用指定的比特率与接入点进行通信。 单位为 Kb/s,因此例如  此属性高度依赖于驱动程序,并非所有设备都支持设置静态比特率。 默认值:  | |
| 如果非零,则指示设备使用指定的发射功率。 单位为 dBm。 此属性高度依赖于驱动程序,并非所有设备都支持设置静态发射功率。 默认值:  | |
| 要启用的 NMSettingWirelessWakeOnWLan 选项。并非所有设备都支持所有选项。 可以是  请注意,必须指定选项值的总和才能组合多个选项。 默认值:  | |
| WiFi 连接的安全配置。 请注意,子选项属性列表可能因主机上安装的 NetworkManager/nmcli 版本而异。 可以在此处找到支持的属性的最新列表:https://networkmanager.dev/docs/api/latest/settings-802-11-wireless-security.html。 例如,要使用带密码的通用 WPA-PSK 身份验证: | |
| 当使用 WEP 时(即,如果  以下之一: 当使用 Cisco LEAP 时(即,如果  选择 
 | |
| 指示是否必须为连接启用快速初始链接设置 (802.11ai)。 以下之一: 当设置为  选择 
 | |
| 组/广播加密算法列表,可防止连接到未使用列表中一种算法的 Wi-Fi 网络。 为获得最大兼容性,请将此属性留空。 选择 
 | |
| 用于连接的密钥管理。 以下之一: 对于使用安全性的任何 Wi-Fi 连接,都必须设置此属性。 选择 
 | |
| 旧版 LEAP 连接的登录密码(即,如果  | |
| 指示如何处理  | |
| 旧版 LEAP 连接的登录用户名(即,如果  | |
| 成对加密算法列表,可防止连接到未使用列表中一种算法的 Wi-Fi 网络。 为获得最大兼容性,请将此属性留空。 选择 
 | |
| 指示是否必须为连接启用受保护的管理帧 (802.11w)。 可以是  当设置为  选择 
 | |
| 指定允许使用的 WPA 协议版本的字符串列表。 每个元素可以是  如果未指定,则允许 WPA 和 RSN 连接。 选择 
 | |
| WPA 网络的预共享密钥。 对于 WPA-PSK,它要么是 8 到 63 个字符的 ASCII 密码(按照 802.11i 标准的规定,散列后得出实际密钥),要么是 64 个十六进制字符形式的密钥。 WPA3-Personal 网络对 SAE 身份验证使用任意长度的密码。 | |
| 指示如何处理  | |
| 指示如何处理  | |
| 控制 WEP 密钥的解释方式。 允许的值为  选择 
 | |
| 索引 0 的 WEP 密钥。这是大多数网络中使用的 WEP 密钥。 有关如何解释此密钥的描述,请参阅  | |
| 索引 1 的 WEP 密钥。大多数网络不使用此 WEP 索引。 有关如何解释此密钥的描述,请参阅  | |
| 索引 2 的 WEP 密钥。大多数网络不使用此 WEP 索引。 有关如何解释此密钥的描述,请参阅  | |
| 索引 3 的 WEP 密钥。大多数网络不使用此 WEP 索引。 有关如何解释此密钥的描述,请参阅  | |
| 当使用静态 WEP 时(即,如果  有效值为  请注意,某些消费级接入点(如 Linksys WRT54G)将密钥编号为  选择 
 | |
| 指示如果使用 WPS,则使用哪种 WPS 模式的标志。 更改默认设置意义不大,因为 NetworkManager 会自动确定是否可以从接入点功能启动 WPS 注册。 可以通过将此属性设置为值  默认值:  | |
| Wireguard 连接的配置。 请注意,子选项属性列表可能因主机上安装的 NetworkManager/nmcli 版本而异。 可以在此处找到受支持属性的最新列表:https://networkmanager.dev/docs/api/latest/settings-wireguard.html。 例如,要配置侦听端口: | |
| 传出数据包的 32 位 fwmark。 fwmark 的使用是可选的,默认情况下处于关闭状态。将其设置为 0 将禁用它。 请注意,启用  | |
| 是否启用 IPv4 默认路由的特殊处理。 如果启用,来自  fwmark 数字也用作默认路由的路由表,如果 fwmark 为零,则会自动选择未使用的 fwmark/表。这对应于 wg-quick 使用 Table=auto 的操作,以及 WireGuard 所谓的“改进的基于规则的路由”。 选择 
 | |
| WireGuard 连接侦听端口。如果未指定,则端口将在接口启动时随机选择。 | |
| 如果非零,则仅传输指定大小或更小的数据包,将较大的数据包拆分为多个片段。 如果为零,则使用默认 MTU。请注意,与 wg-quick 的 MTU 设置相反,这不考虑激活时的当前路由。 | |
| 是否自动为对等点的 AllowedIPs 范围添加路由。 如果为  如果为  请注意,如果对等点的 AllowedIPs 为  选择 
 | |
| Base64 编码的 256 位私钥。 | |
| 这仅用于 bond - xmit_hash_policy 类型。 | |
| 连接的信任级别。 当在当前激活的连接上更新此属性时,更改会立即生效。 | 
属性
| 属性 | 支持 | 描述 | 
|---|---|---|
| 支持: 完全 | 可以在  | |
| 支持: 完全 | 在 diff 模式下,将返回有关已更改的内容(或可能需要在  | 
示例
# These examples are using the following inventory:
#
# ## Directory layout:
#
# |_/inventory/cloud-hosts
# |           /group_vars/openstack-stage.yml
# |           /host_vars/controller-01.openstack.host.com
# |           /host_vars/controller-02.openstack.host.com
# |_/playbook/library/nmcli.py
# |          /playbook-add.yml
# |          /playbook-del.yml
# ```
#
# ## inventory examples
# ### groups_vars
# ```yml
# ---
# #devops_os_define_network
# storage_gw: "192.0.2.254"
# external_gw: "198.51.100.254"
# tenant_gw: "203.0.113.254"
#
# #Team vars
# nmcli_team:
#   - conn_name: tenant
#     ip4: '{{ tenant_ip }}'
#     gw4: '{{ tenant_gw }}'
#   - conn_name: external
#     ip4: '{{ external_ip }}'
#     gw4: '{{ external_gw }}'
#   - conn_name: storage
#     ip4: '{{ storage_ip }}'
#     gw4: '{{ storage_gw }}'
# nmcli_team_slave:
#   - conn_name: em1
#     ifname: em1
#     master: tenant
#   - conn_name: em2
#     ifname: em2
#     master: tenant
#   - conn_name: p2p1
#     ifname: p2p1
#     master: storage
#   - conn_name: p2p2
#     ifname: p2p2
#     master: external
#
# #bond vars
# nmcli_bond:
#   - conn_name: tenant
#     ip4: '{{ tenant_ip }}'
#     gw4: ''
#     mode: balance-rr
#   - conn_name: external
#     ip4: '{{ external_ip }}'
#     gw4: ''
#     mode: balance-rr
#   - conn_name: storage
#     ip4: '{{ storage_ip }}'
#     gw4: '{{ storage_gw }}'
#     mode: balance-rr
# nmcli_bond_slave:
#   - conn_name: em1
#     ifname: em1
#     master: tenant
#   - conn_name: em2
#     ifname: em2
#     master: tenant
#   - conn_name: p2p1
#     ifname: p2p1
#     master: storage
#   - conn_name: p2p2
#     ifname: p2p2
#     master: external
#
# #ethernet vars
# nmcli_ethernet:
#   - conn_name: em1
#     ifname: em1
#     ip4:
#       - '{{ tenant_ip }}'
#       - '{{ second_tenant_ip }}'
#     gw4: '{{ tenant_gw }}'
#   - conn_name: em2
#     ifname: em2
#     ip4: '{{ tenant_ip1 }}'
#     gw4: '{{ tenant_gw }}'
#   - conn_name: p2p1
#     ifname: p2p1
#     ip4: '{{ storage_ip }}'
#     gw4: '{{ storage_gw }}'
#   - conn_name: p2p2
#     ifname: p2p2
#     ip4: '{{ external_ip }}'
#     gw4: '{{ external_gw }}'
# ```
#
# ### host_vars
# ```yml
# ---
# storage_ip: "192.0.2.91/23"
# external_ip: "198.51.100.23/21"
# tenant_ip: "203.0.113.77/23"
# second_tenant_ip: "204.0.113.77/23"
# ```
## playbook-add.yml example
---
- hosts: openstack-stage
  remote_user: root
  tasks:
  - name: Install needed network manager libs
    ansible.builtin.package:
      name:
        - NetworkManager-libnm
        - nm-connection-editor
        - libsemanage-python
        - policycoreutils-python
      state: present
##### Working with all cloud nodes - Teaming
  - name: Try nmcli add team - conn_name only & ip4 gw4
    community.general.nmcli:
      type: team
      conn_name: '{{ item.conn_name }}'
      ip4: '{{ item.ip4 }}'
      gw4: '{{ item.gw4 }}'
      state: present
    with_items:
      - '{{ nmcli_team }}'
  - name: Try nmcli add teams-slave
    community.general.nmcli:
      type: team-slave
      conn_name: '{{ item.conn_name }}'
      ifname: '{{ item.ifname }}'
      master: '{{ item.master }}'
      state: present
    with_items:
      - '{{ nmcli_team_slave }}'
###### Working with all cloud nodes - Bonding
  - name: Try nmcli add bond - conn_name only & ip4 gw4 mode
    community.general.nmcli:
      type: bond
      conn_name: '{{ item.conn_name }}'
      ip4: '{{ item.ip4 }}'
      gw4: '{{ item.gw4 }}'
      mode: '{{ item.mode }}'
      state: present
    with_items:
      - '{{ nmcli_bond }}'
  - name: Try nmcli add bond-slave
    community.general.nmcli:
      type: bond-slave
      conn_name: '{{ item.conn_name }}'
      ifname: '{{ item.ifname }}'
      master: '{{ item.master }}'
      state: present
    with_items:
      - '{{ nmcli_bond_slave }}'
##### Working with all cloud nodes - Ethernet
  - name: Try nmcli add Ethernet - conn_name only & ip4 gw4
    community.general.nmcli:
      type: ethernet
      conn_name: '{{ item.conn_name }}'
      ip4: '{{ item.ip4 }}'
      gw4: '{{ item.gw4 }}'
      state: present
    with_items:
      - '{{ nmcli_ethernet }}'
## playbook-del.yml example
- hosts: openstack-stage
  remote_user: root
  tasks:
  - name: Try nmcli del team - multiple
    community.general.nmcli:
      conn_name: '{{ item.conn_name }}'
      state: absent
    with_items:
      - conn_name: em1
      - conn_name: em2
      - conn_name: p1p1
      - conn_name: p1p2
      - conn_name: p2p1
      - conn_name: p2p2
      - conn_name: tenant
      - conn_name: storage
      - conn_name: external
      - conn_name: team-em1
      - conn_name: team-em2
      - conn_name: team-p1p1
      - conn_name: team-p1p2
      - conn_name: team-p2p1
      - conn_name: team-p2p2
  - name: Add an Ethernet connection with static IP configuration
    community.general.nmcli:
      conn_name: my-eth1
      ifname: eth1
      type: ethernet
      ip4: 192.0.2.100/24
      gw4: 192.0.2.1
      state: present
  - name: Add an Team connection with static IP configuration
    community.general.nmcli:
      conn_name: my-team1
      ifname: my-team1
      type: team
      ip4: 192.0.2.100/24
      gw4: 192.0.2.1
      state: present
      autoconnect: true
  - name: Optionally, at the same time specify IPv6 addresses for the device
    community.general.nmcli:
      conn_name: my-eth1
      ifname: eth1
      type: ethernet
      ip4: 192.0.2.100/24
      gw4: 192.0.2.1
      ip6: 2001:db8::cafe
      gw6: 2001:db8::1
      state: present
  - name: Add two IPv4 DNS server addresses
    community.general.nmcli:
      conn_name: my-eth1
      type: ethernet
      dns4:
      - 192.0.2.53
      - 198.51.100.53
      state: present
  - name: Make a profile usable for all compatible Ethernet interfaces
    community.general.nmcli:
      ctype: ethernet
      name: my-eth1
      ifname: '*'
      state: present
  - name: Change the property of a setting e.g. MTU
    community.general.nmcli:
      conn_name: my-eth1
      mtu: 9000
      type: ethernet
      state: present
  - name: Change the property of a setting e.g. MTU and reload connection
    community.general.nmcli:
      conn_name: my-eth1
      mtu: 1500
      type: ethernet
      state: present
      conn_reload: true
  - name: Disable connection
    community.general.nmcli:
      conn_name: my-eth1
      state: down
  - name: Reload and enable connection
    community.general.nmcli:
      conn_name: my-eth1
      state: up
      reload: true
  - name: Add second ip4 address
    community.general.nmcli:
      conn_name: my-eth1
      ifname: eth1
      type: ethernet
      ip4:
        - 192.0.2.100/24
        - 192.0.3.100/24
      state: present
  - name: Add second ip6 address
    community.general.nmcli:
      conn_name: my-eth1
      ifname: eth1
      type: ethernet
      ip6:
        - 2001:db8::cafe
        - 2002:db8::cafe
      state: present
  - name: Add VxLan
    community.general.nmcli:
      type: vxlan
      conn_name: vxlan_test1
      vxlan_id: 16
      vxlan_local: 192.168.1.2
      vxlan_remote: 192.168.1.5
  - name: Add gre
    community.general.nmcli:
      type: gre
      conn_name: gre_test1
      ip_tunnel_dev: eth0
      ip_tunnel_local: 192.168.1.2
      ip_tunnel_remote: 192.168.1.5
  - name: Add ipip
    community.general.nmcli:
      type: ipip
      conn_name: ipip_test1
      ip_tunnel_dev: eth0
      ip_tunnel_local: 192.168.1.2
      ip_tunnel_remote: 192.168.1.5
  - name: Add sit
    community.general.nmcli:
      type: sit
      conn_name: sit_test1
      ip_tunnel_dev: eth0
      ip_tunnel_local: 192.168.1.2
      ip_tunnel_remote: 192.168.1.5
  - name: Add zone
    community.general.nmcli:
      type: ethernet
      conn_name: my-eth1
      zone: external
      state: present
# nmcli exits with status 0 if it succeeds and exits with a status greater
# than zero when there is a failure. The following list of status codes may be
# returned:
#
#     - 0 Success - indicates the operation succeeded
#     - 1 Unknown or unspecified error
#     - 2 Invalid user input, wrong nmcli invocation
#     - 3 Timeout expired (see --wait option)
#     - 4 Connection activation failed
#     - 5 Connection deactivation failed
#     - 6 Disconnecting device failed
#     - 7 Connection deletion failed
#     - 8 NetworkManager is not running
#     - 9 nmcli and NetworkManager versions mismatch
#     - 10 Connection, device, or access point does not exist.
- name: Create the wifi connection
  community.general.nmcli:
    type: wifi
    conn_name: Brittany
    ifname: wlp4s0
    ssid: Brittany
    wifi_sec:
      key-mgmt: wpa-psk
      psk: my_password
    autoconnect: true
    state: present
- name: Create a hidden AP mode wifi connection
  community.general.nmcli:
    type: wifi
    conn_name: ChocoMaster
    ifname: wlo1
    ssid: ChocoMaster
    wifi:
      hidden: true
      mode: ap
    autoconnect: true
    state: present
- name: Create a gsm connection
  community.general.nmcli:
    type: gsm
    conn_name: my-gsm-provider
    ifname: cdc-wdm0
    gsm:
        apn: my.provider.apn
        username: my-provider-username
        password: my-provider-password
        pin: my-sim-pin
    autoconnect: true
    state: present
- name: Create a macvlan connection
  community.general.nmcli:
    type: macvlan
    conn_name: my-macvlan-connection
    ifname: mymacvlan0
    macvlan:
        mode: 2
        parent: eth1
    autoconnect: true
    state: present
- name: Create a wireguard connection
  community.general.nmcli:
    type: wireguard
    conn_name: my-wg-provider
    ifname: mywg0
    wireguard:
        listen-port: 51820
        private-key: my-private-key
    autoconnect: true
    state: present
- name: >-
    Create a VPN L2TP connection for ansible_user to connect on vpn.example.com
    authenticating with user 'brittany' and pre-shared key as 'Brittany123'
  community.general.nmcli:
    type: vpn
    conn_name: my-vpn-connection
    vpn:
        permissions: "{{ ansible_user }}"
        service-type: org.freedesktop.NetworkManager.l2tp
        gateway: vpn.example.com
        password-flags: 2
        user: brittany
        ipsec-enabled: true
        ipsec-psk: "0s{{ 'Brittany123' | ansible.builtin.b64encode }}"
    autoconnect: false
    state: present
## Creating bond attached to bridge example
- name: Create bond attached to bridge
  community.general.nmcli:
    type: bond
    conn_name: bond0
    slave_type: bridge
    master: br0
    state: present
- name: Create master bridge
  community.general.nmcli:
    type: bridge
    conn_name: br0
    method4: disabled
    method6: disabled
    state: present
## Creating vlan connection attached to bridge
- name: Create master bridge
  community.general.nmcli:
    type: bridge
    conn_name: br0
    state: present
- name: Create VLAN 5
  community.general.nmcli:
    type: vlan
    conn_name: eth0.5
    slave_type: bridge
    master: br0
    vlandev: eth0
    vlanid: 5
    state: present
## Defining ip rules while setting a static IP
## table 'production' is set with id 200 in this example.
- name: Set Static ips for interface with ip rules and routes
  community.general.nmcli:
    type: ethernet
    conn_name: 'eth0'
    ip4: '192.168.1.50'
    gw4: '192.168.1.1'
    state: present
    routes4_extended:
      - ip: "0.0.0.0/0"
        next_hop: "192.168.1.1"
        table: "production"
    routing_rules4:
      - "priority 0 from 192.168.1.50 table 200"
## Creating an OVS bridge and attaching a port
- name: Create OVS Bridge
  community.general.nmcli:
    conn_name: ovs-br-conn
    ifname: ovs-br
    type: ovs-bridge
    state: present
- name: Create OVS Port for OVS Bridge Interface
  community.general.nmcli:
    conn_name: ovs-br-interface-port-conn
    ifname: ovs-br-interface-port
    master: ovs-br
    type: ovs-port
    state: present
## Adding an ethernet interface to an OVS bridge port
- name: Add Ethernet Interface to OVS Port
  community.general.nmcli:
    conn_name: eno1
    ifname: eno1
    master: ovs-br-interface-port
    slave_type: ovs-port
    type: ethernet
    state: present
