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 地址老化时间,以秒为单位。 默认值:  | |
| 这仅与 bond 一起使用 - ARP 间隔。 | |
| 这仅与 bond 一起使用 - ARP IP 目标。 | |
| 连接是否应在启动时启动。 连接配置文件是否可以自动激活 选项 
 | |
| 用于调用连接的名称。模式为 <type>[-<ifname>][-<num>]。 | |
| 如果修改了连接,是否应重新加载连接。 选项 
 | |
| 发送到 DHCP 服务器的 DHCP 客户端标识符。 | |
| 最多 3 个 DNS 服务器的列表。 条目必须是 IPv4 地址,例如  | |
| 忽略自动配置的 IPv4 域名服务器。 选项 
 | |
| DNS 选项列表。 | |
| DNS 搜索域列表。 | |
| 最多 3 个 DNS 服务器的列表。 条目必须是 IPv6 地址,例如  | |
| 忽略自动配置的 IPv6 域名服务器。 选项 
 | |
| DNS 选项列表。 | |
| DNS 搜索域列表。 | |
| 这仅与 bond 一起使用 - downdelay。 | |
| 这仅与 VLAN 一起使用 - VLAN 出口优先级映射。 | |
| 这仅与 VLAN 一起使用 - flags。 | |
| 这仅与桥接一起使用 - [forward-delay <2-30>] STP 转发延迟,以秒为单位。 默认值:  | |
| GSM 连接的配置。 请注意,子选项属性列表可能因主机上安装的 NetworkManager/nmcli 版本而异。 支持属性的最新列表可在此处找到:https://networkmanager.dev/docs/api/latest/settings-gsm.html。 例如,要使用 apn、pin、用户名和密码: | |
| GPRS 接入点名称,指定与基于 GSM 的网络建立数据会话时使用的 APN。 APN 通常决定用户如何为其网络使用付费,以及用户是否可以访问互联网或只是提供商特定的封闭网络,因此使用用户移动宽带计划的正确 APN 非常重要。 根据 GSM 03.60 第 14.9 节,APN 只能由字符 a-z、0-9、. 和 - 组成。 | |
| 当  选项 
 | |
| 此连接适用的设备唯一标识符(由  如果给出,连接将仅适用于指定的设备。 | |
| 当  不会建立到漫游网络的连接。 选项 
 | |
| 如果非零,则只传输指定大小或更小的数据包,将较大的数据包拆分成多个以太网帧。 默认值:  | |
| 网络 ID(GSM LAI 格式,即 MCC-MNC),用于强制特定网络注册。 如果指定了网络 ID,NetworkManager 将尝试强制设备仅在指定的网络上注册。 这可以用于确保设备在无法以其他方式直接控制设备漫游时不会漫游。 | |
| 用于帮助为基于 GSM 的调制解调器建立 PPP 数据会话的旧设置。 | |
| 如果需要,用于对网络进行身份验证的密码。 许多提供商不需要密码,或接受任何密码。 但是,如果需要密码,则在此处指定。 | |
| NMSettingSecretFlags 指示如何处理  允许以下选择: 选项 
 | |
| 如果 SIM 卡已使用 PIN 锁定,则必须先解锁才能请求任何其他操作。 在此处指定 PIN 以允许操作设备。 | |
| NMSettingSecretFlags 指示如何处理  请参阅  选项 
 | |
| 此连接适用的 SIM 卡唯一标识符(由  如果给出,连接将应用于任何也允许由  | |
| 类似于  如果给出,连接将应用于任何也允许由  | |
| 如果需要,用于对网络进行身份验证的用户名。 许多提供商不需要用户名,或接受任何用户名。 但是,如果需要用户名,则在此处指定。 | |
| 此接口的 IPv4 网关。 使用格式  此参数与 never_default4 参数互斥。 | |
| 忽略自动配置的 IPv4 路由。 选项 
 | |
| 此接口的 IPv6 网关。 使用格式  | |
| 忽略自动配置的 IPv6 路由。 选项 
 | |
| 这仅用于“bridge-slave” - 从属的“hairpin 模式”,允许将帧通过接收帧的从属设备发送回。 在 community.general 7.0.0 中,默认值更改为  选项 
 | |
| 这仅用于 bridge - [hello-time <1-10>] STP hello 时间(秒)。 默认值:  | |
| 要将连接绑定到的接口。 连接将仅适用于此接口名称。 特殊值  除 bond、team、bridge、vlan 和 vpn 之外的所有连接类型都需要 ifname 参数。 对于除 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 主连接配置文件的主 如果定义了  | |
| 仅在 bridge 中使用 - [max-age <6-42>] STP 最大消息年龄(秒)。 默认值: | |
| 用于 IPv4 的配置方法。 如果设置了  选项 
 | |
| 用于 IPv6 的配置方法 如果设置了  
 选项 
 | |
| 仅在 bond 中使用 - miimon。 未设置时,此参数默认为  | |
| 这是您希望为绑定或桥接创建的设备或网络连接的类型。 选项 
 | |
| 连接 MTU,例如 9000。创建接口时无法应用此参数,而是在创建接口后进行。 可在修改团队、VLAN、以太网时使用(未来计划实施 wifi、gsm、pppoe、infiniband) 未设置时,此参数默认为  | |
| 设置为默认路由。 此参数与 gw4 参数互斥。 选项 
 | |
| 仅在“bridge-slave”中使用 - [<1-65535>] - 通过此从属设备到达目的地的 STP 端口成本。 默认值: | |
| 仅在 bond 中使用,并且是主接口名称(对于“active-backup”模式),这通常是“ifname”。 | |
| 仅在“bridge”中使用 - 设置 STP 优先级。 默认值: | |
| 设置在接口上配置的 ipv4 路由的度量级别。 | |
| 设置在接口上配置的 IPv6 路由的度量级别。 | |
| IPv4 路由列表。 | |
| 拥塞窗口的限制。 | |
| 路由的 IP 或前缀。 使用格式  | |
| 路由度量。 | |
| 如果非零,则仅传输指定大小或更小的数据包。 | |
| 使用格式  | |
| 假装下一跳直接连接到此链路,即使它与任何接口前缀都不匹配。 选项 
 | |
| 要将此路由添加到其中的表。 默认值取决于  | |
| 服务类型。 | |
| 带参数的 IPv6 路由列表。 | |
| 拥塞窗口的限制。 | |
| 路由的 IP 或前缀。 使用格式  | |
| 路由度量。 | |
| 如果非零,则仅传输指定大小或更小的数据包。 | |
| 使用格式  | |
| 假装下一跳直接连接到此链路,即使它与任何接口前缀都不匹配。 选项 
 | |
| 要将此路由添加到其中的表。 默认值取决于  | |
| 与  | |
| 这是您希望为团队创建的设备或网络连接的类型。 选项 
 | |
| 这定义了团队设备和端口设备的硬件地址在团队生命周期中如何设置的策略。 选项 
 | |
| 此从属主连接的设备类型(例如  类型  选项 
 | |
| 仅在“bridge-slave”中使用 - [<0-63>] - 此从属设备的 STP 优先级。 默认值: | |
| 允许配置 SR-IOV 设置。 支持属性的最新列表可在此处找到:https://networkmanager.pages.freedesktop.org/NetworkManager/NetworkManager/settings-sriov.html。 | |
| 是否通过兼容驱动程序自动探测虚拟函数。 | |
| 选择 eswitch 封装支持。 | |
| 选择设备的 eswitch 内联模式。 | |
| 选择设备的 eswitch 模式。 | |
| 要创建的虚拟函数数量。请参阅您的网卡文档以了解支持的 VF 最大数量。 | |
| 虚拟函数描述符,格式为: 可以使用逗号作为分隔符指定多个 VF,例如 | |
| 无线路由器或接入点的名称。 | |
| 设备是否应该存在,如果状态与声明的状态不同,则采取措施。 使用 使用 选项 
 | |
| 这仅用于桥接,并控制是否为此桥接启用生成树协议 (STP)。 选项 
 | |
| 此选项设置 Infiniband IPoIB 设备的连接类型。 选项 
 | |
| 这是您希望创建或修改的设备或网络连接的类型。 在 community.general 3.5.0 中添加了  在 community.general 3.7.0 中添加了  在 community.general 2.0.0 中添加了  在 community.general 8.1.0 中添加了  在 community.general 6.6.0 中添加了  在 community.general 8.6.0 中添加了  在 community.general 8.6.0 中添加了  类型  在 community.general 4.3.0 中添加了  在 community.general 5.1.0 中添加了  使用 如果您想控制连接到 选项 
 | |
| 这仅用于 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 地址。 | |
| WiFi 连接的配置。 请注意,子选项属性列表可能因主机上安装的 NetworkManager/nmcli 版本而异。 支持属性的最新列表可以在此处找到:https://networkmanager.dev/docs/api/latest/settings-802-11-wireless.html。 例如,要创建一个隐藏的 AP 模式 WiFi 连接: | |
| 配置 AP 隔离,这可以防止连接到此 AP 的无线设备之间进行通信。 只有当接口在 AP 模式下配置时,才能将此属性设置为与 如果设置为 如果设置为 如果设置为 选项 
 | |
| 克隆 MAC 地址的新字段。 它可以是 ASCII 表示形式的硬件地址,也可以是特殊值 此字段替换了已弃用的 D-Bus 上的 请注意,此属性仅存在于 D-Bus API 中。libnm 和 nmcli 继续将此属性称为 | |
| 网络的 802.11 频率频段。 5GHz 802.11a 的 这会将与 Wi-Fi 网络的关联锁定到特定频段,例如,如果指定了 此设置取决于具体的驱动程序功能,可能并非所有驱动程序都支持。 选项 
 | |
| 如果指定,则指示设备仅与给定的接入点关联。 此功能高度依赖于驱动程序,并非所有设备都支持。 请注意,此属性不控制创建Ad-Hoc网络时使用的BSSID,将来也不太可能控制。 | |
| 此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地址都应使用标准的十六进制数字和冒号表示法(例如, | |
| 0(除非用户设置了全局默认值以进行随机化且supplicant支持随机化,否则不进行随机化),1(从不随机化MAC地址)或2(始终随机化MAC地址)。 此属性已弃用,推荐使用 选项 
 | |
| Wi-Fi网络模式。如果为空,则假定为 选项 
 | |
| 如果非零,则只传输指定大小或更小的数据包,将较大的数据包拆分成多个以太网帧。 默认值:  | |
| 2(禁用Wi-Fi省电功能),3(启用Wi-Fi省电功能),1(不更改当前配置设置)或0(使用全局配置的值)。 所有其他值均保留。 选项 
 | |
| 如果非零,则指示设备仅使用指定的比特率与接入点通信。 单位为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)。 0(使用全局默认值),1(禁用FILS),2(如果supplicant和接入点支持,则启用FILS)或3(启用FILS,如果不受支持则失败)。 当设置为 选项 
 | |
| 组/广播加密算法列表,可阻止连接到未使用列表中算法之一的Wi-Fi网络。 为了最大限度地兼容,请将此属性留空。 选项 
 | |
| 连接使用的密钥管理。 可以选择以下其中一种: 对于任何使用安全性的 Wi-Fi 连接,都必须设置此属性。 选项 
 | |
| 用于传统 LEAP 连接的登录密码(即,如果  | |
| 指示如何处理  | |
| 用于传统 LEAP 连接的登录用户名(即,如果  | |
| 成对加密算法列表,用于阻止连接到未使用列表中算法的 Wi-Fi 网络。 为了最大限度地兼容,请将此属性留空。 选项 
 | |
| 指示连接是否必须启用受保护的管理帧 (802.11w)。 可以选择以下其中一种: 设置为  选项 
 | |
| 指定允许使用的 WPA 协议版本的字符串列表。 每个元素可以是  如果未指定,则允许 WPA 和 RSN 连接。 选项 
 | |
| WPA 网络的预共享密钥。 对于 WPA-PSK,它可以是 8 到 63 个字符的 ASCII 密码(根据 802.11i 标准)进行哈希处理以导出实际密钥,也可以是 64 个十六进制字符的密钥。 WPA3-个人网络使用任何长度的密码进行 SAE 身份验证。 | |
| 指示如何处理  | |
| 指示如何处理  | |
| 控制 WEP 密钥的解释方式。 允许的值为  选项 
 | |
| 索引 0 WEP 密钥。这是大多数网络中使用的 WEP 密钥。 有关如何解释此密钥的说明,请参阅  | |
| 索引 1 WEP 密钥。大多数网络不使用此 WEP 索引。 有关如何解释此密钥的说明,请参阅  | |
| 索引 2 WEP 密钥。大多数网络不使用此 WEP 索引。 有关如何解释此密钥的说明,请参阅  | |
| 索引 3 WEP 密钥。大多数网络不使用此 WEP 索引。 有关如何解释此密钥的说明,请参阅  | |
| 当使用静态 WEP(即,如果  有效值为  请注意,一些消费级接入点(例如 Linksys WRT54G)将密钥编号为  选项 
 | |
| 指示要使用的 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 为  选项 
 | |
| 256 位私钥,采用 Base64 编码。 | |
| 此属性仅在 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
