Lesson 1 of 7

Ansible Fundamentals for Networking

Objective

Learn the fundamentals of Ansible for network automation with a focus on architecture, inventory layout, modules (with FQCN usage), playbooks, roles, and variables. We will assemble a minimal control-node configuration and an Ansible role scaffold that can push VLAN-to-VNI configuration to a Nexus/NX-OS style fabric. This matters in production because consistent, repeatable device configuration at scale eliminates human error and accelerates change windows—common in data center VXLAN EVPN deployments where many leaf/spine devices require identical underlay/overlay configuration.

Real-world scenario: a data center operator at NHPREP must deploy VLAN-to-VNI mappings across three leaf switches and two spines. Using Ansible and the cisco.nxos collection, you can centralize that work in an idempotent playbook and role, preventing drift and simplifying audits.


Topology & Device Table

ASCII topology (management-plane connectivity for automation). Each device is reachable by its management IP shown on the mgmt0 interface.

                    +----------------------+             +----------------------+
                    |        Spine 1       |             |        Spine 2       |
                    |        S1            |             |        S2            |
                    |  mgmt0: 10.15.1.11   |             |  mgmt0: 10.15.1.12   |
                    +----------+-----------+             +-----------+----------+
                               |                                   |
                               |                                   |
                      +--------+-----------------------------------+--------+
                      |                Management Network (OOB)              |
                      |                     10.15.1.0/24                      |
                      +--------+----------------+---------------+--------+-----+
                               |                |               |        |
                      +--------+---+    +-------+-----+   +-----+-------+ +--+--------+
                      |   Leaf 1   |    |   Leaf 2    |   |   Leaf 3   | | Ansible   |
                      |    L1      |    |    L2       |   |    L3      | | Control   |
                      | mgmt0:     |    | mgmt0:      |   | mgmt0:     | | Node      |
                      | 10.15.1.13 |    | 10.15.1.14  |   | 10.15.1.15 | | lab.nhprep.com |
                      +------------+    +-------------+   +------------+ +-------------+

Device Table

DeviceInterfaceIP AddressSubnet MaskRole
S1mgmt010.15.1.11255.255.255.0Spine
S2mgmt010.15.1.12255.255.255.0Spine
L1mgmt010.15.1.13255.255.255.0Leaf
L2mgmt010.15.1.14255.255.255.0Leaf
L3mgmt010.15.1.15255.255.255.0Leaf
Ansibleeth0(control node)network-managedControl Node (lab.nhprep.com)

Tip: In production, the control node (lab.nhprep.com) typically lives in a secured management network and authenticates to devices via SSH with least-privilege accounts.


Key Concepts

  • Ansible Control Node vs Managed Nodes
    The control node (lab.nhprep.com) runs playbooks and modules. Managed network devices (10.15.1.11–15) are contacted over SSH (network_cli) or HTTP/HTTPS (httpapi). For NX-OS automation, network_cli is commonly used and requires persistent SSH connections for efficiency.

  • Inventory and Groups
    Inventory defines hosts and groups (spines, leafs). Grouping lets you target only the appropriate devices (e.g., run overlay role only against leafs). Ansible variables can be applied globally (all:vars), per group (group_vars), or per host (host_vars).

  • Collections and FQCN (Fully Qualified Collection Name)
    Modules are delivered in collections (e.g., cisco.nxos). Always invoke modules with their FQCN (cisco.nxos.nxos_vlans) to avoid ambiguity and to ensure the correct vendor implementation is used.

  • Idempotency and Desired State
    Modules accept parameters describing the desired configuration (e.g., list of VLANs with mapped VNI). Ansible computes changes and applies only the differences—this prevents duplicate or destructive changes.

  • Roles, Tasks, and File Layout
    Roles encapsulate configuration intent (common, underlay, overlay). Use ansible-galaxy to create role scaffolding and place tasks/templates/vars accordingly. This modularity supports reuse and testing in CI/CD pipelines.


Step-by-step configuration

Step 1: Install Ansible on the Control Node

What we are doing: Install Ansible core (control plane software) on the control host so it can execute playbooks and use collections. This is the foundation for all subsequent automation.

% pip install ansible-core
% pip install ansible

What just happened:

  • The first command installs Ansible core runtime (required for playbook execution).
  • The second command installs the higher-level Ansible package including plugins and CLI utilities. Together they enable running playbooks and interacting with network devices over network_cli/httpapi.

Real-world note: Use virtual environments on production control nodes and pin versions to avoid unexpected behavior during automated runs.

Verify:

% ansible --version
ansible [core 2.14.0]
  configured module search path = ['/home/user/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.8/site-packages/ansible
  ansible collection location = /home/user/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible
  python version = 3.8.10 (default, Jun  4 2024, 12:00:00) [GCC 9.3.0]


<div class="topology-diagram">
<img src="data:image/svg+xml;base64,PD9wbGFudHVtbCAxLjIwMjYuMT8+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBjb250ZW50U3R5bGVUeXBlPSJ0ZXh0L2NzcyIgZGF0YS1kaWFncmFtLXR5cGU9Ik5XRElBRyIgaGVpZ2h0PSIyMTZweCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSIgc3R5bGU9IndpZHRoOjgzM3B4O2hlaWdodDoyMTZweDtiYWNrZ3JvdW5kOiNGRkZGRkY7IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA4MzMgMjE2IiB3aWR0aD0iODMzcHgiIHpvb21BbmRQYW49Im1hZ25pZnkiPjxkZWZzLz48Zz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI4Mi41NTI3IiB4PSIyOC42NjYiIHk9IjE2LjEzODciPkNvbnRyb2xfUGxhbmU8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iNzYuNTY0NSIgeD0iMzQuNjU0MyIgeT0iMzAuMTA3NCI+MTAuMTUuMS4wLzI0PC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjEyIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9Ijk2Ljg0OTYiIHg9IjE0LjM2OTEiIHk9IjE1OC41MjE1Ij5VbmRlcmxheV9GYWJyaWM8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMTA2LjIxODgiIHg9IjUiIHk9IjE3Mi40OTAyIj5MMi9MM19mYWJyaWNfbGlua3M8L3RleHQ+PHJlY3QgZmlsbD0iI0UyRTJGMCIgaGVpZ2h0PSI1IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjE7IiB3aWR0aD0iNzA5LjEyOTQiIHg9IjExNi4yMTg4IiB5PSIxNi40Njg4Ii8+PHJlY3QgZmlsbD0iI0UyRTJGMCIgaGVpZ2h0PSI1IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjE7IiB3aWR0aD0iNTY1Ljc1NDQiIHg9IjI1OS41OTM4IiB5PSIxNTguODUxNiIvPjxwYXRoIGQ9Ik0xODkuOTA2MywyMS40Njg4IEwxODkuOTA2Myw3MC42NzU4IiBmaWxsPSJub25lIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjE7Ii8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iNjYuNDc4IiB4PSIxNDMuMzMwOCIgeT0iNDAuOTc4Ij4xMC4xNS4xLjEwMDwvdGV4dD48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMSIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI5My4xNTA5IiB4PSIxNDMuMzMwOCIgeT0iNTMuNzgyNyI+U1NIKG5ldHdvcmtfY2xpKTwvdGV4dD48cGF0aCBkPSJNMzE4LjE2OTIsMjEuNDY4OCBMMzE4LjE2OTIsNzAuNjc1OCIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjI3MS41OTM4IiB5PSI0MC45NzgiPjEwLjE1LjEuMTE8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iOTMuMTUwOSIgeD0iMjcxLjU5MzgiIHk9IjUzLjc4MjciPlNTSChuZXR3b3JrX2NsaSk8L3RleHQ+PHBhdGggZD0iTTMxOC4xNjkyLDEwNC42NDQ1IEwzMTguMTY5MiwxNTguODUxNiIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjI4OC40Mjk0IiB5PSIxMzUuNTU2MiI+MTAuMTUuMS4xMTwvdGV4dD48cGF0aCBkPSJNNDMxLjMyMDEsMjEuNDY4OCBMNDMxLjMyMDEsNzAuNjc1OCIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjM4NC43NDQ2IiB5PSI0MC45NzgiPjEwLjE1LjEuMTI8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iOTMuMTUwOSIgeD0iMzg0Ljc0NDYiIHk9IjUzLjc4MjciPlNTSChuZXR3b3JrX2NsaSk8L3RleHQ+PHBhdGggZD0iTTQzMS4zMjAxLDEwNC42NDQ1IEw0MzEuMzIwMSwxNTguODUxNiIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjQwMS41ODAzIiB5PSIxMzUuNTU2MiI+MTAuMTUuMS4xMjwvdGV4dD48cGF0aCBkPSJNNTQ0LjQ3MDksMjEuNDY4OCBMNTQ0LjQ3MDksNzAuNjc1OCIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjQ5Ny44OTU1IiB5PSI0MC45NzgiPjEwLjE1LjEuMTM8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iOTMuMTUwOSIgeD0iNDk3Ljg5NTUiIHk9IjUzLjc4MjciPlNTSChuZXR3b3JrX2NsaSk8L3RleHQ+PHBhdGggZD0iTTU0NC40NzA5LDEwNC42NDQ1IEw1NDQuNDcwOSwxNTguODUxNiIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjUxNC43MzEyIiB5PSIxMzUuNTU2MiI+MTAuMTUuMS4xMzwvdGV4dD48cGF0aCBkPSJNNjU3LjYyMTgsMjEuNDY4OCBMNjU3LjYyMTgsNzAuNjc1OCIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjYxMS4wNDY0IiB5PSI0MC45NzgiPjEwLjE1LjEuMTQ8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iOTMuMTUwOSIgeD0iNjExLjA0NjQiIHk9IjUzLjc4MjciPlNTSChuZXR3b3JrX2NsaSk8L3RleHQ+PHBhdGggZD0iTTY1Ny42MjE4LDEwNC42NDQ1IEw2NTcuNjIxOCwxNTguODUxNiIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjYyNy44ODIxIiB5PSIxMzUuNTU2MiI+MTAuMTUuMS4xNDwvdGV4dD48cGF0aCBkPSJNNzcwLjc3MjcsMjEuNDY4OCBMNzcwLjc3MjcsNzAuNjc1OCIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjcyNC4xOTczIiB5PSI0MC45NzgiPjEwLjE1LjEuMTU8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iOTMuMTUwOSIgeD0iNzI0LjE5NzMiIHk9IjUzLjc4MjciPlNTSChuZXR3b3JrX2NsaSk8L3RleHQ+PHBhdGggZD0iTTc3MC43NzI3LDEwNC42NDQ1IEw3NzAuNzcyNywxNTguODUxNiIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9Ijc0MS4wMzMiIHk9IjEzNS41NTYyIj4xMC4xNS4xLjE1PC90ZXh0PjxyZWN0IGZpbGw9IiNGMUYxRjEiIGhlaWdodD0iMzMuOTY4OCIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDowLjU7IiB3aWR0aD0iMTEzLjM3NSIgeD0iMTMxLjIxODgiIHk9IjcwLjY3NTgiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI5My4zNzUiIHg9IjE0MS4yMTg4IiB5PSI5MS44MTQ1Ij5BbnNpYmxlX0NvbnRyb2w8L3RleHQ+PHJlY3QgZmlsbD0iI0YxRjFGMSIgaGVpZ2h0PSIzMy45Njg4IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjAuNTsiIHdpZHRoPSI2Ny4xOTE0IiB4PSIyODIuNTczNSIgeT0iNzAuNjc1OCIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjEyIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjQ3LjE5MTQiIHg9IjI5Mi41NzM1IiB5PSI5MS44MTQ1Ij5TcGluZV8xPC90ZXh0PjxyZWN0IGZpbGw9IiNGMUYxRjEiIGhlaWdodD0iMzMuOTY4OCIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDowLjU7IiB3aWR0aD0iNjcuMTkxNCIgeD0iMzk1LjcyNDQiIHk9IjcwLjY3NTgiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI0Ny4xOTE0IiB4PSI0MDUuNzI0NCIgeT0iOTEuODE0NSI+U3BpbmVfMjwvdGV4dD48cmVjdCBmaWxsPSIjRjFGMUYxIiBoZWlnaHQ9IjMzLjk2ODgiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIgd2lkdGg9IjU5LjI4MTMiIHg9IjUxMi44MzAzIiB5PSI3MC42NzU4Ii8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMzkuMjgxMyIgeD0iNTIyLjgzMDMiIHk9IjkxLjgxNDUiPkxlYWZfMTwvdGV4dD48cmVjdCBmaWxsPSIjRjFGMUYxIiBoZWlnaHQ9IjMzLjk2ODgiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIgd2lkdGg9IjU5LjI4MTMiIHg9IjYyNS45ODEyIiB5PSI3MC42NzU4Ii8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMzkuMjgxMyIgeD0iNjM1Ljk4MTIiIHk9IjkxLjgxNDUiPkxlYWZfMjwvdGV4dD48cmVjdCBmaWxsPSIjRjFGMUYxIiBoZWlnaHQ9IjMzLjk2ODgiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIgd2lkdGg9IjU5LjI4MTMiIHg9IjczOS4xMzIxIiB5PSI3MC42NzU4Ii8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMzkuMjgxMyIgeD0iNzQ5LjEzMjEiIHk9IjkxLjgxNDUiPkxlYWZfMzwvdGV4dD48P3BsYW50dW1sLXNyYyBaUDR6Mnk4bTQ4UHRWeU1ISVBTc3dTU2EzWUE4R21VWEVBYzRqNGFiRDVtYkJISUhfZFNYTDExaVFVUnRkZGt2dngyTk1acFdsRzkwclZNRGhVN0dPNlNSbXl6NmU3ODlXOTNJZ2hRNTdIMTYwdk82QkExWGIxME54aDdMWEw1eTFFNHdDU3FlbE02VWR6UFoyby1EdGYzeHJZdDhkbmVMUHpDV00tQVlRSXdRdnA4YmdoY3dVMDZSUUtpTWk3V1FJLVVtT1ZOcGFHakFQT3J1eVFDZWgyeF9Wdjk1T0hScG9nTlNRQW5SdVk3TUp3RU5EMno1TmFBLXZteVY/PjwvZz48L3N2Zz4=" alt="Network Topology Diagram" style="max-width:100%;height:auto;background:#fff;padding:16px;border:1px solid #e5e7eb;border-radius:8px;" />
</div>

cisco
% ansible-galaxy collection install cisco.nxos cisco.dcnm
% ansible-galaxy init overlay

What just happened:

  • The first command downloads the cisco.nxos and cisco.dcnm collections into your local Ansible collection path, making FQCN modules available.
  • The second command creates the directory structure for a role named "overlay" (tasks, templates, vars, etc), which organizes overlay-related tasks (VLANs, SVIs, NVE).

Real-world note: Collections are versioned independently from Ansible core—pin collection versions in production to ensure consistent behavior.

Verify:

% tree overlay
overlay
├── README.md
├── tasks
│   └── main.yml
├── templates
└── vars
    └── main.yml

Step 3: Create the main inventory file

What we are doing: Build the Ansible inventory that defines connection parameters and host groups (spines and leafs). This file tells Ansible where devices are and how to connect (network_cli).

# save as inventory.yml
all:
  vars:
    ansible_connection: ansible.netcommon.network_cli
    ansible_user: "nxos_username"
    ansible_password: "nxos_password"
    ansible_network_os: cisco.nxos.nxos
  children:
    spines:
      hosts:
        10.15.1.11:
        10.15.1.12:
    leafs:
      hosts:
        10.15.1.13:
        10.15.1.14:
        10.15.1.15:

What just happened:

  • The file declares global variables that apply to all hosts: connection type (network_cli), credentials (username/password), and the network OS collection name (cisco.nxos.nxos).
  • Hosts are grouped into spines and leafs so playbooks can target them selectively. The control node will use SSH to connect to the mgmt0 addresses listed.

Real-world note: Never keep plaintext passwords in production; use Vault or an authentication broker. This example uses straightforward variables for lab clarity.

Verify:

% ansible-inventory -i inventory.yml --list
{
    "_meta": {
        "hostvars": {
            "10.15.1.11": {
                "ansible_connection": "ansible.netcommon.network_cli",
                "ansible_user": "nxos_username",
                "ansible_password": "nxos_password",
                "ansible_network_os": "cisco.nxos.nxos"
            },
            "10.15.1.12": { ... },
            "10.15.1.13": { ... },
            "10.15.1.14": { ... },
            "10.15.1.15": { ... }
        }
    },
    "all": {
        "children": [
            "spines",
            "leafs"
        ]
    },
    "spines": {
        "hosts": [
            "10.15.1.11",
            "10.15.1.12"
        ]
    },
    "leafs": {
        "hosts": [
            "10.15.1.13",
            "10.15.1.14",
            "10.15.1.15"
        ]
    }
}


<div class="topology-diagram">
<img src="data:image/svg+xml;base64,PD9wbGFudHVtbCAxLjIwMjYuMT8+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBjb250ZW50U3R5bGVUeXBlPSJ0ZXh0L2NzcyIgZGF0YS1kaWFncmFtLXR5cGU9Ik5XRElBRyIgaGVpZ2h0PSIyMTZweCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSIgc3R5bGU9IndpZHRoOjgzM3B4O2hlaWdodDoyMTZweDtiYWNrZ3JvdW5kOiNGRkZGRkY7IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA4MzMgMjE2IiB3aWR0aD0iODMzcHgiIHpvb21BbmRQYW49Im1hZ25pZnkiPjxkZWZzLz48Zz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI4Mi41NTI3IiB4PSIyOC42NjYiIHk9IjE2LjEzODciPkNvbnRyb2xfUGxhbmU8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iNzYuNTY0NSIgeD0iMzQuNjU0MyIgeT0iMzAuMTA3NCI+MTAuMTUuMS4wLzI0PC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjEyIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9Ijk2Ljg0OTYiIHg9IjE0LjM2OTEiIHk9IjE1OC41MjE1Ij5VbmRlcmxheV9GYWJyaWM8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMTA2LjIxODgiIHg9IjUiIHk9IjE3Mi40OTAyIj5MMi9MM19mYWJyaWNfbGlua3M8L3RleHQ+PHJlY3QgZmlsbD0iI0UyRTJGMCIgaGVpZ2h0PSI1IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjE7IiB3aWR0aD0iNzA5LjEyOTQiIHg9IjExNi4yMTg4IiB5PSIxNi40Njg4Ii8+PHJlY3QgZmlsbD0iI0UyRTJGMCIgaGVpZ2h0PSI1IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjE7IiB3aWR0aD0iNTY1Ljc1NDQiIHg9IjI1OS41OTM4IiB5PSIxNTguODUxNiIvPjxwYXRoIGQ9Ik0xODkuOTA2MywyMS40Njg4IEwxODkuOTA2Myw3MC42NzU4IiBmaWxsPSJub25lIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjE7Ii8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iNjYuNDc4IiB4PSIxNDMuMzMwOCIgeT0iNDAuOTc4Ij4xMC4xNS4xLjEwMDwvdGV4dD48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMSIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI5My4xNTA5IiB4PSIxNDMuMzMwOCIgeT0iNTMuNzgyNyI+U1NIKG5ldHdvcmtfY2xpKTwvdGV4dD48cGF0aCBkPSJNMzE4LjE2OTIsMjEuNDY4OCBMMzE4LjE2OTIsNzAuNjc1OCIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjI3MS41OTM4IiB5PSI0MC45NzgiPjEwLjE1LjEuMTE8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iOTMuMTUwOSIgeD0iMjcxLjU5MzgiIHk9IjUzLjc4MjciPlNTSChuZXR3b3JrX2NsaSk8L3RleHQ+PHBhdGggZD0iTTMxOC4xNjkyLDEwNC42NDQ1IEwzMTguMTY5MiwxNTguODUxNiIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjI4OC40Mjk0IiB5PSIxMzUuNTU2MiI+MTAuMTUuMS4xMTwvdGV4dD48cGF0aCBkPSJNNDMxLjMyMDEsMjEuNDY4OCBMNDMxLjMyMDEsNzAuNjc1OCIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjM4NC43NDQ2IiB5PSI0MC45NzgiPjEwLjE1LjEuMTI8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iOTMuMTUwOSIgeD0iMzg0Ljc0NDYiIHk9IjUzLjc4MjciPlNTSChuZXR3b3JrX2NsaSk8L3RleHQ+PHBhdGggZD0iTTQzMS4zMjAxLDEwNC42NDQ1IEw0MzEuMzIwMSwxNTguODUxNiIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjQwMS41ODAzIiB5PSIxMzUuNTU2MiI+MTAuMTUuMS4xMjwvdGV4dD48cGF0aCBkPSJNNTQ0LjQ3MDksMjEuNDY4OCBMNTQ0LjQ3MDksNzAuNjc1OCIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjQ5Ny44OTU1IiB5PSI0MC45NzgiPjEwLjE1LjEuMTM8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iOTMuMTUwOSIgeD0iNDk3Ljg5NTUiIHk9IjUzLjc4MjciPlNTSChuZXR3b3JrX2NsaSk8L3RleHQ+PHBhdGggZD0iTTU0NC40NzA5LDEwNC42NDQ1IEw1NDQuNDcwOSwxNTguODUxNiIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjUxNC43MzEyIiB5PSIxMzUuNTU2MiI+MTAuMTUuMS4xMzwvdGV4dD48cGF0aCBkPSJNNjU3LjYyMTgsMjEuNDY4OCBMNjU3LjYyMTgsNzAuNjc1OCIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjYxMS4wNDY0IiB5PSI0MC45NzgiPjEwLjE1LjEuMTQ8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iOTMuMTUwOSIgeD0iNjExLjA0NjQiIHk9IjUzLjc4MjciPlNTSChuZXR3b3JrX2NsaSk8L3RleHQ+PHBhdGggZD0iTTY1Ny42MjE4LDEwNC42NDQ1IEw2NTcuNjIxOCwxNTguODUxNiIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjYyNy44ODIxIiB5PSIxMzUuNTU2MiI+MTAuMTUuMS4xNDwvdGV4dD48cGF0aCBkPSJNNzcwLjc3MjcsMjEuNDY4OCBMNzcwLjc3MjcsNzAuNjc1OCIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjcyNC4xOTczIiB5PSI0MC45NzgiPjEwLjE1LjEuMTU8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iOTMuMTUwOSIgeD0iNzI0LjE5NzMiIHk9IjUzLjc4MjciPlNTSChuZXR3b3JrX2NsaSk8L3RleHQ+PHBhdGggZD0iTTc3MC43NzI3LDEwNC42NDQ1IEw3NzAuNzcyNywxNTguODUxNiIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9Ijc0MS4wMzMiIHk9IjEzNS41NTYyIj4xMC4xNS4xLjE1PC90ZXh0PjxyZWN0IGZpbGw9IiNGMUYxRjEiIGhlaWdodD0iMzMuOTY4OCIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDowLjU7IiB3aWR0aD0iMTEzLjM3NSIgeD0iMTMxLjIxODgiIHk9IjcwLjY3NTgiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI5My4zNzUiIHg9IjE0MS4yMTg4IiB5PSI5MS44MTQ1Ij5BbnNpYmxlX0NvbnRyb2w8L3RleHQ+PHJlY3QgZmlsbD0iI0YxRjFGMSIgaGVpZ2h0PSIzMy45Njg4IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjAuNTsiIHdpZHRoPSI2Ny4xOTE0IiB4PSIyODIuNTczNSIgeT0iNzAuNjc1OCIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjEyIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjQ3LjE5MTQiIHg9IjI5Mi41NzM1IiB5PSI5MS44MTQ1Ij5TcGluZV8xPC90ZXh0PjxyZWN0IGZpbGw9IiNGMUYxRjEiIGhlaWdodD0iMzMuOTY4OCIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDowLjU7IiB3aWR0aD0iNjcuMTkxNCIgeD0iMzk1LjcyNDQiIHk9IjcwLjY3NTgiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI0Ny4xOTE0IiB4PSI0MDUuNzI0NCIgeT0iOTEuODE0NSI+U3BpbmVfMjwvdGV4dD48cmVjdCBmaWxsPSIjRjFGMUYxIiBoZWlnaHQ9IjMzLjk2ODgiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIgd2lkdGg9IjU5LjI4MTMiIHg9IjUxMi44MzAzIiB5PSI3MC42NzU4Ii8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMzkuMjgxMyIgeD0iNTIyLjgzMDMiIHk9IjkxLjgxNDUiPkxlYWZfMTwvdGV4dD48cmVjdCBmaWxsPSIjRjFGMUYxIiBoZWlnaHQ9IjMzLjk2ODgiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIgd2lkdGg9IjU5LjI4MTMiIHg9IjYyNS45ODEyIiB5PSI3MC42NzU4Ii8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMzkuMjgxMyIgeD0iNjM1Ljk4MTIiIHk9IjkxLjgxNDUiPkxlYWZfMjwvdGV4dD48cmVjdCBmaWxsPSIjRjFGMUYxIiBoZWlnaHQ9IjMzLjk2ODgiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIgd2lkdGg9IjU5LjI4MTMiIHg9IjczOS4xMzIxIiB5PSI3MC42NzU4Ii8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMzkuMjgxMyIgeD0iNzQ5LjEzMjEiIHk9IjkxLjgxNDUiPkxlYWZfMzwvdGV4dD48P3BsYW50dW1sLXNyYyBaUDR6Mnk4bTQ4UHRWeU1ISVBTc3dTU2EzWUE4R21VWEVBYzRqNGFiRDVtYkJISUhfZFNYTDExaVFVUnRkZGt2dngyTk1acFdsRzkwclZNRGhVN0dPNlNSbXl6NmU3ODlXOTNJZ2hRNTdIMTYwdk82QkExWGIxME54aDdMWEw1eTFFNHdDU3FlbE02VWR6UFoyby1EdGYzeHJZdDhkbmVMUHpDV00tQVlRSXdRdnA4YmdoY3dVMDZSUUtpTWk3V1FJLVVtT1ZOcGFHakFQT3J1eVFDZWgyeF9Wdjk1T0hScG9nTlNRQW5SdVk3TUp3RU5EMno1TmFBLXZteVY/PjwvZz48L3N2Zz4=" alt="Network Topology Diagram" style="max-width:100%;height:auto;background:#fff;padding:16px;border:1px solid #e5e7eb;border-radius:8px;" />
</div>

cisco
# save as roles/overlay/tasks/main.yml
- name: Configure VLAN-to-VNI Mappings
  cisco.nxos.nxos_vlans:
    config:
      - name: Web Servers
        vlan_id: 101
        mapped_vni: 10101
      - name: DB Servers
        vlan_id: 102
        mapped_vni: 10102
      - name: vMotion
        vlan_id: 103
        mapped_vni: 10103
    state: merged

What just happened:

  • The task calls the NX-OS VLAN module with a config list containing dictionaries for each VLAN.
  • state: merged signals Ansible to merge these VLAN entries into the device configuration (adding/updating without removing unspecified VLANs). The module will compare current device state and apply only necessary changes.

Real-world note: Using a list of dictionaries allows you to define many VLANs cleanly; put these variables into group_vars or host_vars for larger deployments.

Verify:

# run a check-mode dry run (preview changes)
% ansible-playbook -i inventory.yml -l leafs --check -vv overlay_playbook.yml

PLAY [leafs] *******************************************************************
TASK [Configure VLAN-to-VNI Mappings] *****************************************
task path: /home/user/overlay/tasks/main.yml
ok: [10.15.1.13] => (item=None)
ok: [10.15.1.14] => (item=None)
ok: [10.15.1.15] => (item=None)

PLAY RECAP *********************************************************************
10.15.1.13                 : ok=1    changed=0    unreachable=0    failed=0
10.15.1.14                 : ok=1    changed=0    unreachable=0    failed=0
10.15.1.15                 : ok=1    changed=0    unreachable=0    failed=0


<div class="topology-diagram">
<img src="data:image/svg+xml;base64,PD9wbGFudHVtbCAxLjIwMjYuMT8+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBjb250ZW50U3R5bGVUeXBlPSJ0ZXh0L2NzcyIgZGF0YS1kaWFncmFtLXR5cGU9Ik5XRElBRyIgaGVpZ2h0PSIyMTZweCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSIgc3R5bGU9IndpZHRoOjgzM3B4O2hlaWdodDoyMTZweDtiYWNrZ3JvdW5kOiNGRkZGRkY7IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA4MzMgMjE2IiB3aWR0aD0iODMzcHgiIHpvb21BbmRQYW49Im1hZ25pZnkiPjxkZWZzLz48Zz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI4Mi41NTI3IiB4PSIyOC42NjYiIHk9IjE2LjEzODciPkNvbnRyb2xfUGxhbmU8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iNzYuNTY0NSIgeD0iMzQuNjU0MyIgeT0iMzAuMTA3NCI+MTAuMTUuMS4wLzI0PC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjEyIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9Ijk2Ljg0OTYiIHg9IjE0LjM2OTEiIHk9IjE1OC41MjE1Ij5VbmRlcmxheV9GYWJyaWM8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMTA2LjIxODgiIHg9IjUiIHk9IjE3Mi40OTAyIj5MMi9MM19mYWJyaWNfbGlua3M8L3RleHQ+PHJlY3QgZmlsbD0iI0UyRTJGMCIgaGVpZ2h0PSI1IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjE7IiB3aWR0aD0iNzA5LjEyOTQiIHg9IjExNi4yMTg4IiB5PSIxNi40Njg4Ii8+PHJlY3QgZmlsbD0iI0UyRTJGMCIgaGVpZ2h0PSI1IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjE7IiB3aWR0aD0iNTY1Ljc1NDQiIHg9IjI1OS41OTM4IiB5PSIxNTguODUxNiIvPjxwYXRoIGQ9Ik0xODkuOTA2MywyMS40Njg4IEwxODkuOTA2Myw3MC42NzU4IiBmaWxsPSJub25lIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjE7Ii8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iNjYuNDc4IiB4PSIxNDMuMzMwOCIgeT0iNDAuOTc4Ij4xMC4xNS4xLjEwMDwvdGV4dD48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMSIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI5My4xNTA5IiB4PSIxNDMuMzMwOCIgeT0iNTMuNzgyNyI+U1NIKG5ldHdvcmtfY2xpKTwvdGV4dD48cGF0aCBkPSJNMzE4LjE2OTIsMjEuNDY4OCBMMzE4LjE2OTIsNzAuNjc1OCIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjI3MS41OTM4IiB5PSI0MC45NzgiPjEwLjE1LjEuMTE8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iOTMuMTUwOSIgeD0iMjcxLjU5MzgiIHk9IjUzLjc4MjciPlNTSChuZXR3b3JrX2NsaSk8L3RleHQ+PHBhdGggZD0iTTMxOC4xNjkyLDEwNC42NDQ1IEwzMTguMTY5MiwxNTguODUxNiIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjI4OC40Mjk0IiB5PSIxMzUuNTU2MiI+MTAuMTUuMS4xMTwvdGV4dD48cGF0aCBkPSJNNDMxLjMyMDEsMjEuNDY4OCBMNDMxLjMyMDEsNzAuNjc1OCIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjM4NC43NDQ2IiB5PSI0MC45NzgiPjEwLjE1LjEuMTI8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iOTMuMTUwOSIgeD0iMzg0Ljc0NDYiIHk9IjUzLjc4MjciPlNTSChuZXR3b3JrX2NsaSk8L3RleHQ+PHBhdGggZD0iTTQzMS4zMjAxLDEwNC42NDQ1IEw0MzEuMzIwMSwxNTguODUxNiIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjQwMS41ODAzIiB5PSIxMzUuNTU2MiI+MTAuMTUuMS4xMjwvdGV4dD48cGF0aCBkPSJNNTQ0LjQ3MDksMjEuNDY4OCBMNTQ0LjQ3MDksNzAuNjc1OCIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjQ5Ny44OTU1IiB5PSI0MC45NzgiPjEwLjE1LjEuMTM8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iOTMuMTUwOSIgeD0iNDk3Ljg5NTUiIHk9IjUzLjc4MjciPlNTSChuZXR3b3JrX2NsaSk8L3RleHQ+PHBhdGggZD0iTTU0NC40NzA5LDEwNC42NDQ1IEw1NDQuNDcwOSwxNTguODUxNiIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjUxNC43MzEyIiB5PSIxMzUuNTU2MiI+MTAuMTUuMS4xMzwvdGV4dD48cGF0aCBkPSJNNjU3LjYyMTgsMjEuNDY4OCBMNjU3LjYyMTgsNzAuNjc1OCIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjYxMS4wNDY0IiB5PSI0MC45NzgiPjEwLjE1LjEuMTQ8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iOTMuMTUwOSIgeD0iNjExLjA0NjQiIHk9IjUzLjc4MjciPlNTSChuZXR3b3JrX2NsaSk8L3RleHQ+PHBhdGggZD0iTTY1Ny42MjE4LDEwNC42NDQ1IEw2NTcuNjIxOCwxNTguODUxNiIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjYyNy44ODIxIiB5PSIxMzUuNTU2MiI+MTAuMTUuMS4xNDwvdGV4dD48cGF0aCBkPSJNNzcwLjc3MjcsMjEuNDY4OCBMNzcwLjc3MjcsNzAuNjc1OCIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9IjcyNC4xOTczIiB5PSI0MC45NzgiPjEwLjE1LjEuMTU8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iOTMuMTUwOSIgeD0iNzI0LjE5NzMiIHk9IjUzLjc4MjciPlNTSChuZXR3b3JrX2NsaSk8L3RleHQ+PHBhdGggZD0iTTc3MC43NzI3LDEwNC42NDQ1IEw3NzAuNzcyNywxNTguODUxNiIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxOyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjU5LjQ3OTUiIHg9Ijc0MS4wMzMiIHk9IjEzNS41NTYyIj4xMC4xNS4xLjE1PC90ZXh0PjxyZWN0IGZpbGw9IiNGMUYxRjEiIGhlaWdodD0iMzMuOTY4OCIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDowLjU7IiB3aWR0aD0iMTEzLjM3NSIgeD0iMTMxLjIxODgiIHk9IjcwLjY3NTgiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI5My4zNzUiIHg9IjE0MS4yMTg4IiB5PSI5MS44MTQ1Ij5BbnNpYmxlX0NvbnRyb2w8L3RleHQ+PHJlY3QgZmlsbD0iI0YxRjFGMSIgaGVpZ2h0PSIzMy45Njg4IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjAuNTsiIHdpZHRoPSI2Ny4xOTE0IiB4PSIyODIuNTczNSIgeT0iNzAuNjc1OCIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjEyIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjQ3LjE5MTQiIHg9IjI5Mi41NzM1IiB5PSI5MS44MTQ1Ij5TcGluZV8xPC90ZXh0PjxyZWN0IGZpbGw9IiNGMUYxRjEiIGhlaWdodD0iMzMuOTY4OCIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDowLjU7IiB3aWR0aD0iNjcuMTkxNCIgeD0iMzk1LjcyNDQiIHk9IjcwLjY3NTgiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI0Ny4xOTE0IiB4PSI0MDUuNzI0NCIgeT0iOTEuODE0NSI+U3BpbmVfMjwvdGV4dD48cmVjdCBmaWxsPSIjRjFGMUYxIiBoZWlnaHQ9IjMzLjk2ODgiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIgd2lkdGg9IjU5LjI4MTMiIHg9IjUxMi44MzAzIiB5PSI3MC42NzU4Ii8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMzkuMjgxMyIgeD0iNTIyLjgzMDMiIHk9IjkxLjgxNDUiPkxlYWZfMTwvdGV4dD48cmVjdCBmaWxsPSIjRjFGMUYxIiBoZWlnaHQ9IjMzLjk2ODgiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIgd2lkdGg9IjU5LjI4MTMiIHg9IjYyNS45ODEyIiB5PSI3MC42NzU4Ii8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMzkuMjgxMyIgeD0iNjM1Ljk4MTIiIHk9IjkxLjgxNDUiPkxlYWZfMjwvdGV4dD48cmVjdCBmaWxsPSIjRjFGMUYxIiBoZWlnaHQ9IjMzLjk2ODgiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIgd2lkdGg9IjU5LjI4MTMiIHg9IjczOS4xMzIxIiB5PSI3MC42NzU4Ii8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMzkuMjgxMyIgeD0iNzQ5LjEzMjEiIHk9IjkxLjgxNDUiPkxlYWZfMzwvdGV4dD48P3BsYW50dW1sLXNyYyBaUDR6Mnk4bTQ4UHRWeU1ISVBTc3dTU2EzWUE4R21VWEVBYzRqNGFiRDVtYkJISUhfZFNYTDExaVFVUnRkZGt2dngyTk1acFdsRzkwclZNRGhVN0dPNlNSbXl6NmU3ODlXOTNJZ2hRNTdIMTYwdk82QkExWGIxME54aDdMWEw1eTFFNHdDU3FlbE02VWR6UFoyby1EdGYzeHJZdDhkbmVMUHpDV00tQVlRSXdRdnA4YmdoY3dVMDZSUUtpTWk3V1FJLVVtT1ZOcGFHakFQT3J1eVFDZWgyeF9Wdjk1T0hScG9nTlNRQW5SdVk3TUp3RU5EMno1TmFBLXZteVY/PjwvZz48L3N2Zz4=" alt="Network Topology Diagram" style="max-width:100%;height:auto;background:#fff;padding:16px;border:1px solid #e5e7eb;border-radius:8px;" />
</div>

cisco
# save as overlay_playbook.yml
- hosts: leafs
  gather_facts: false
  roles:
    - role: overlay
% ansible-playbook -i inventory.yml overlay_playbook.yml

What just happened:

  • The playbook targets the "leafs" group and runs the overlay role tasks. Ansible connects over network_cli to each leaf (10.15.1.13-15), executes the cisco.nxos.nxos_vlans module, and enforces the desired VLAN-to-VNI state. The module uses NX-OS APIs/CLI under the hood to apply changes and returns standardized results.

Real-world note: In production, schedule such plays during maintenance windows and monitor for config locks or rollback needs.

Verify:

# On a leaf switch (10.15.1.13), verify VLANs exist (example NX-OS CLI)
show vlan brief
VLAN Name                             Status    Ports
101  Web Servers                      active
102  DB Servers                       active
103  vMotion                          active
# Verify playbook run summary
PLAY RECAP *********************************************************************
10.15.1.13                 : ok=1    changed=1    unreachable=0    failed=0
10.15.1.14                 : ok=1    changed=1    unreachable=0    failed=0
10.15.1.15                 : ok=1    changed=1    unreachable=0    failed=0

Verification Checklist

  • Check 1: Inventory parsed correctly — run ansible-inventory -i inventory.yml --list and confirm spines and leafs groups include the exact IPs (10.15.1.11–15).
  • Check 2: Role scaffolding exists — tree overlay shows tasks/main.yml and vars/, templates/ directories.
  • Check 3: VLANs applied on leaf devices — run show vlan brief on a leaf (e.g., 10.15.1.13) and confirm VLANs 101/102/103 exist and are active.

Common Mistakes

SymptomCauseFix
Ansible fails to connect to devicesWrong ansible_connection or ansible_network_os in inventory.ymlSet ansible_connection: ansible.netcommon.network_cli and ansible_network_os: cisco.nxos.nxos in all:vars
Playbook reports changed=0 but device lacks VLANsTask written incorrectly or state mismatch (e.g., using wrong module args)Use FQCN cisco.nxos.nxos_vlans and the config list format shown; run with -vv for debug
Credentials rejected during SSHUsing lab plaintext credentials without correct accountVerify ansible_user/ansible_password values; use Vault or SSH keys in real deployments
Role files not discoveredRole not created under roles/ or playbook not referencing role correctlyRun ansible-galaxy init overlay and place tasks in roles/overlay/tasks/main.yml; reference role by name in playbook

Key Takeaways

  • Inventory grouping (spines vs leafs) and global vars (ansible_connection, ansible_network_os) are the backbone of network automation targeting specific device types and connection methods.
  • Always use the module’s Fully Qualified Collection Name (FQCN) — e.g., cisco.nxos.nxos_vlans — to ensure the intended vendor implementation is executed.
  • Roles provide structure for reusable, testable configuration units (common, underlay, overlay). Use ansible-galaxy init to scaffold.
  • Idempotency is central: describe the desired state (VLAN list and VNIs), and Ansible will apply only necessary changes, which is essential for safe, repeatable production changes.

Final tip: Move device-specific data into group_vars/host_vars for larger deployments, and encrypt sensitive values (passwords, keys) with Ansible Vault before production use.