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
| Device | Interface | IP Address | Subnet Mask | Role |
|---|---|---|---|---|
| S1 | mgmt0 | 10.15.1.11 | 255.255.255.0 | Spine |
| S2 | mgmt0 | 10.15.1.12 | 255.255.255.0 | Spine |
| L1 | mgmt0 | 10.15.1.13 | 255.255.255.0 | Leaf |
| L2 | mgmt0 | 10.15.1.14 | 255.255.255.0 | Leaf |
| L3 | mgmt0 | 10.15.1.15 | 255.255.255.0 | Leaf |
| Ansible | eth0 | (control node) | network-managed | Control 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 --listand confirm spines and leafs groups include the exact IPs (10.15.1.11–15). - Check 2: Role scaffolding exists —
tree overlayshows tasks/main.yml and vars/, templates/ directories. - Check 3: VLANs applied on leaf devices — run
show vlan briefon a leaf (e.g., 10.15.1.13) and confirm VLANs 101/102/103 exist and are active.
Common Mistakes
| Symptom | Cause | Fix |
|---|---|---|
| Ansible fails to connect to devices | Wrong ansible_connection or ansible_network_os in inventory.yml | Set ansible_connection: ansible.netcommon.network_cli and ansible_network_os: cisco.nxos.nxos in all:vars |
| Playbook reports changed=0 but device lacks VLANs | Task 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 SSH | Using lab plaintext credentials without correct account | Verify ansible_user/ansible_password values; use Vault or SSH keys in real deployments |
| Role files not discovered | Role not created under roles/ or playbook not referencing role correctly | Run 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.