@@ -59,7 +59,7 @@ Jumpstart your automation journey with sample input files that demonstrate prope
5959### 🎨 Jinja-Based Templates
6060Enhance scalability and flexibility with Jinja-based templates support. These templates empower you to dynamically generate input configurations, adapting to various deployments with ease.
6161
62- ### � Infrastructure as Code
62+ ### 🏗️ Infrastructure as Code
6363Embrace infrastructure as code and manage your entire Catalyst Center configuration through Git. This provides:
6464- ** Complete version control** : Track every change and easily revert to previous states
6565- ** Increased collaboration** : Simplify teamwork with a centralized platform
@@ -68,7 +68,7 @@ Embrace infrastructure as code and manage your entire Catalyst Center configurat
6868
6969---
7070
71- ## � 📦 Installation
71+ ## 📦 Installation
7272
7373### Install Collection (Includes CVPs)
7474
@@ -98,6 +98,45 @@ ls ~/.ansible/collections/ansible_collections/cisco/catalystcenter/cvp/ | wc -l
9898
9999---
100100
101+ ## 🧾 Prerequisite: Inventory File
102+
103+ Every CVP playbook declares ` hosts: catalyst_center_hosts ` , so an inventory
104+ that defines this group is ** required** . Running ` ansible-playbook ` without
105+ ` -i <inventory> ` will result in ` skipping: no hosts matched ` and no tasks
106+ will execute. Passing ` -e catalystcenter_host=... ` alone is ** not** enough,
107+ because it only sets SDK connection variables, not the Ansible host pattern.
108+
109+ Minimal inventory (` inventory/hosts.yml ` ):
110+
111+ ``` yaml
112+ ---
113+ catalyst_center_hosts :
114+ hosts :
115+ catalyst_center220 :
116+ ansible_connection : local
117+ catalystcenter_host : " {{ lookup('env', 'HOSTIP') }}"
118+ catalystcenter_username : " {{ lookup('env', 'CATALYST_CENTER_USERNAME') }}"
119+ catalystcenter_password : " {{ lookup('env', 'CATALYST_CENTER_PASSWORD') }}"
120+ catalystcenter_port : 443
121+ catalystcenter_version : 3.1.5
122+ catalystcenter_verify : false
123+ catalystcenter_debug : false
124+ ` ` `
125+
126+ Export the matching environment variables:
127+
128+ ` ` ` bash
129+ export HOSTIP=<catalyst-center-ip-or-fqdn>
130+ export CATALYST_CENTER_USERNAME=<username>
131+ export CATALYST_CENTER_PASSWORD='<password>'
132+ ```
133+
134+ > All ` ansible-playbook ` examples below assume this inventory exists at
135+ > ` inventory/hosts.yml ` . Per-CVP README files (e.g.
136+ > [ cvp/swim/README.md] ( cvp/swim/README.md ) ) use the same pattern.
137+
138+ ---
139+
101140## 🚀 Quick Start
102141
103142### 5-Minute CVP Example
@@ -121,11 +160,11 @@ cat README.md
121160# 6. Edit variables
122161vi vars/site_hierarchy_design_vars.yml
123162
124- # 7. Run playbook
125- ansible-playbook playbook/site_hierarchy_playbook.yml \
126- -e catalystcenter_host=10.1.1.1 \
127- -e catalystcenter_username=admin \
128- -e catalystcenter_password=secret \
163+ # 7. Run playbook (requires an inventory with the catalyst_center_hosts group;
164+ # see "Prerequisite: Inventory File" above)
165+ ansible-playbook \
166+ -i inventory/hosts.yml \
167+ playbook/site_hierarchy_playbook.yml \
129168 -vvv
130169```
131170
@@ -189,51 +228,58 @@ git init
189228git add .
190229git commit -m " Initial CVP setup"
191230
192- # Run playbooks
193- ansible-playbook site_hierarchy/playbook/site_hierarchy_playbook.yml
194- ansible-playbook device_discovery/playbook/device_discovery_playbook.yml
231+ # Run playbooks (inventory must define the catalyst_center_hosts group)
232+ ansible-playbook -i inventory/hosts.yml \
233+ site_hierarchy/playbook/site_hierarchy_playbook.yml
234+ ansible-playbook -i inventory/hosts.yml \
235+ device_discovery/playbook/device_discovery_playbook.yml
195236```
196237
197238### Pattern 2: Direct Reference (Quick Testing)
198239
199240** Best for** : Testing, one-off runs, CI/CD
200241
201242``` bash
202- # Run CVP directly from collection
243+ # Run CVP directly from collection (still requires an inventory file)
203244ansible-playbook \
245+ -i inventory/hosts.yml \
204246 ~ /.ansible/collections/ansible_collections/cisco/catalystcenter/cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml \
205- -e @my-custom-vars.yml \
206- -e catalystcenter_host=10.1.1.1 \
207- -e catalystcenter_username=admin \
208- -e catalystcenter_password=secret
247+ -e VARS_FILE_PATH=$( pwd) /my-custom-vars.yml
209248```
210249
211250### Pattern 3: Hybrid Approach
212251
213252** Best for** : Combining multiple CVPs
214253
215- ``` bash
216- # Create master playbook
217- cat > deploy-all.yml << EOF
254+ ` import_playbook ` is a top-level directive, not a task. Each entry below is a
255+ separate play that inherits the imported playbook's ` hosts: ` (here:
256+ ` catalyst_center_hosts ` ), so the inventory must define that group. Per-CVP
257+ inputs are passed via the ` vars: ` block as ` VARS_FILE_PATH ` , resolved
258+ ** relative to the imported playbook's directory** (see VARS_FILE_PATH note
259+ in any per-CVP README, e.g. [ cvp/swim/README.md] ( cvp/swim/README.md ) ).
260+
261+ ``` yaml
262+ # deploy-all.yml
218263---
219- - name: Complete Catalyst Center Deployment
220- hosts: localhost
221- gather_facts: false
222-
223- tasks:
224- # Import CVP playbooks
225- - name: Deploy Site Hierarchy
226- ansible.builtin.import_playbook: ~/.ansible/collections/ansible_collections/cisco/catalystcenter/cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml
227-
228- - name: Configure Network Settings
229- ansible.builtin.import_playbook: ~/.ansible/collections/ansible_collections/cisco/catalystcenter/cvp/network_settings/playbook/network_settings_playbook.yml
230-
231- - name: Discover Devices
232- ansible.builtin.import_playbook: ~/.ansible/collections/ansible_collections/cisco/catalystcenter/cvp/device_discovery/playbook/device_discovery_playbook .yml
233- EOF
264+ - name : Deploy Site Hierarchy
265+ ansible.builtin.import_playbook : cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml
266+ vars :
267+ VARS_FILE_PATH : ../vars/site_hierarchy_design_vars.yml
268+
269+ - name : Configure Network Settings
270+ ansible.builtin.import_playbook : cvp/network_settings/playbook/network_settings_playbook.yml
271+ vars :
272+ VARS_FILE_PATH : ../vars/network_settings_vars.yml
273+
274+ - name : Discover Devices
275+ ansible.builtin.import_playbook : cvp/device_discovery/playbook/device_discovery_playbook.yml
276+ vars :
277+ VARS_FILE_PATH : ../vars/device_discovery_vars .yml
278+ ` ` `
234279
235- # Run master playbook
236- ansible-playbook deploy-all.yml
280+ ` ` ` bash
281+ # Run master playbook (inventory must define the catalyst_center_hosts group)
282+ ansible-playbook -i inventory/hosts.yml deploy-all.yml
237283```
238284
239285---
@@ -277,27 +323,25 @@ jobs:
277323
278324 - name : Deploy Site Hierarchy
279325 env :
280- CATALYSTCENTER_HOST : ${{ secrets.CATALYSTCENTER_HOST }}
281- CATALYSTCENTER_USERNAME : ${{ secrets.CATALYSTCENTER_USERNAME }}
282- CATALYSTCENTER_PASSWORD : ${{ secrets.CATALYSTCENTER_PASSWORD }}
326+ HOSTIP : ${{ secrets.CATALYSTCENTER_HOST }}
327+ CATALYST_CENTER_USERNAME : ${{ secrets.CATALYSTCENTER_USERNAME }}
328+ CATALYST_CENTER_PASSWORD : ${{ secrets.CATALYSTCENTER_PASSWORD }}
283329 run : |
284- ansible-playbook cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml \
285- -e catalystcenter_host=$CATALYSTCENTER_HOST \
286- -e catalystcenter_username=$CATALYSTCENTER_USERNAME \
287- -e catalystcenter_password=$CATALYSTCENTER_PASSWORD \
288- -e @vars/production-sites.yml
330+ ansible-playbook \
331+ -i inventory/hosts.yml \
332+ cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml \
333+ -e VARS_FILE_PATH=$(pwd)/vars/production-sites.yml
289334
290335 - name : Deploy Network Settings
291336 env :
292- CATALYSTCENTER_HOST : ${{ secrets.CATALYSTCENTER_HOST }}
293- CATALYSTCENTER_USERNAME : ${{ secrets.CATALYSTCENTER_USERNAME }}
294- CATALYSTCENTER_PASSWORD : ${{ secrets.CATALYSTCENTER_PASSWORD }}
337+ HOSTIP : ${{ secrets.CATALYSTCENTER_HOST }}
338+ CATALYST_CENTER_USERNAME : ${{ secrets.CATALYSTCENTER_USERNAME }}
339+ CATALYST_CENTER_PASSWORD : ${{ secrets.CATALYSTCENTER_PASSWORD }}
295340 run : |
296- ansible-playbook cvp/network_settings/playbook/network_settings_playbook.yml \
297- -e catalystcenter_host=$CATALYSTCENTER_HOST \
298- -e catalystcenter_username=$CATALYSTCENTER_USERNAME \
299- -e catalystcenter_password=$CATALYSTCENTER_PASSWORD \
300- -e @vars/production-network-settings.yml
341+ ansible-playbook \
342+ -i inventory/hosts.yml \
343+ cvp/network_settings/playbook/network_settings_playbook.yml \
344+ -e VARS_FILE_PATH=$(pwd)/vars/production-network-settings.yml
301345` ` `
302346
303347### GitLab CI
@@ -336,7 +380,7 @@ validate:
336380 - prepare
337381 script :
338382 - *install_ansible
339- - ansible-playbook cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml --syntax-check
383+ - ansible-playbook -i inventory/hosts.yml cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml --syntax-check
340384 - ansible-lint cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml || true
341385
342386deploy :
@@ -346,11 +390,13 @@ deploy:
346390 - prepare
347391 script :
348392 - *install_ansible
349- - ansible-playbook cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml
350- -e catalystcenter_host=$CATALYSTCENTER_HOST
351- -e catalystcenter_username=$CATALYSTCENTER_USERNAME
352- -e catalystcenter_password=$CATALYSTCENTER_PASSWORD
353- -e @vars/production.yml
393+ - export HOSTIP=$CATALYSTCENTER_HOST
394+ - export CATALYST_CENTER_USERNAME=$CATALYSTCENTER_USERNAME
395+ - export CATALYST_CENTER_PASSWORD=$CATALYSTCENTER_PASSWORD
396+ - ansible-playbook
397+ -i inventory/hosts.yml
398+ cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml
399+ -e VARS_FILE_PATH=$CI_PROJECT_DIR/vars/production.yml
354400 only :
355401 - main
356402 when : manual
@@ -401,7 +447,8 @@ pipeline {
401447 steps {
402448 sh '''
403449 . venv/bin/activate
404- ansible-playbook ${CVP_PATH}/${CVP_NAME}/playbook/*_playbook.yml --syntax-check
450+ ansible-playbook -i inventory/hosts.yml \
451+ ${CVP_PATH}/${CVP_NAME}/playbook/*_playbook.yml --syntax-check
405452 ' ''
406453 }
407454 }
@@ -414,11 +461,13 @@ pipeline {
414461 input message : ' Deploy to production?' , ok: 'Deploy'
415462 sh '''
416463 . venv/bin/activate
417- ansible-playbook ${CVP_PATH}/${CVP_NAME}/playbook/*_playbook.yml \
418- -e catalystcenter_host=$CATALYSTCENTER_HOST \
419- -e catalystcenter_username=$CATALYSTCENTER_USERNAME \
420- -e catalystcenter_password=$CATALYSTCENTER_PASSWORD \
421- -e @vars/${ENVIRONMENT}.yml \
464+ export HOSTIP=$CATALYSTCENTER_HOST
465+ export CATALYST_CENTER_USERNAME=$CATALYSTCENTER_USERNAME
466+ export CATALYST_CENTER_PASSWORD=$CATALYSTCENTER_PASSWORD
467+ ansible-playbook \
468+ -i inventory/hosts.yml \
469+ ${CVP_PATH}/${CVP_NAME}/playbook/*_playbook.yml \
470+ -e VARS_FILE_PATH=${WORKSPACE}/vars/${ENVIRONMENT}.yml \
422471 -vv
423472 ' ''
424473 }
@@ -447,6 +496,7 @@ Establish foundational access control and integrate with external systems.
447496|-----|-------------|--------|
448497| **users_and_roles** | Role Based Access Control and Users Management | [📖 Guide](cvp/users_and_roles/README.md) |
449498| **ise_radius_integration** | ISE and AAA Servers Integration | [📖 Guide](cvp/ise_radius_integration/README.md) |
499+ | **ansible_vault_update** | Update Ansible Vault encrypted credentials | [📖 Guide](cvp/ansible_vault_update/README.md) |
450500
451501---
452502
@@ -468,6 +518,7 @@ Design your network hierarchy, configure settings, and discover devices.
468518| **provision** | Device Provisioning and Re-Provisioning Management | [📖 Guide](cvp/provision/README.md) |
469519| **device_templates** | Design and Deploy Device Templates | [📖 Guide](cvp/device_templates/README.md) |
470520| **tags_manager** | Tags Management | [📖 Guide](cvp/tags_manager/README.md) |
521+ | **access_point_location** | Access Point location management on floor maps | [📖 Guide](cvp/access_point_location/README.md) |
471522
472523---
473524
@@ -483,6 +534,7 @@ Configure underlay automation and SD-Access fabric.
483534| **sda_virtual_networks_l2l3_gateways** | Virtual Networks and L3 Anycast Gateways and L2 VLANs Management | [📖 Guide](cvp/sda_virtual_networks_l2l3_gateways/README.md) |
484535| **sda_fabric_device_roles** | SDA Fabric Device assignment to fabric sites and zones | [📖 Guide](cvp/sda_fabric_device_roles/README.md) |
485536| **sda_hostonboarding** | SDA Fabric Devices and Host Onboarding | [📖 Guide](cvp/sda_hostonboarding/README.md) |
537+ | **sda_fabric_discover_and_onboard_fabric_devices** | Discover and onboard devices into the SDA fabric | [📖 Guide](cvp/sda_fabric_discover_and_onboard_fabric_devices/README.md) |
486538| **sda_fabric_extranet_policy** | SDA Extranet Policies Management | [📖 Guide](cvp/sda_fabric_extranet_policy/README.md) |
487539| **sda_fabric_multicast** | SDA Fabric Multicast Management | [📖 Guide](cvp/sda_fabric_multicast/README.md) |
488540| **application_policy** | Application Policy Management | [📖 Guide](cvp/application_policy/README.md) |
@@ -580,18 +632,30 @@ git commit -m "Add customized CVPs"
580632
581633### 2. Use Ansible Vault for Secrets
582634
635+ The inventory at [Prerequisite: Inventory File](#-prerequisite-inventory-file)
636+ reads credentials from environment variables. For long-term storage, keep the
637+ same variable names (`catalystcenter_host`, `catalystcenter_username`,
638+ `catalystcenter_password`) but source them from an Ansible Vault file in
639+ `group_vars/`, so they are picked up automatically by the
640+ `catalyst_center_hosts` group without `-e` overrides.
641+
583642```bash
584- # Create vault file
585- ansible-vault create group_vars/all/vault.yml
643+ # 1. Create vault file for the catalyst_center_hosts group
644+ mkdir -p group_vars/catalyst_center_hosts
645+ ansible-vault create group_vars/catalyst_center_hosts/vault.yml
646+ ```
586647
587- # Add credentials
588- vault_catalystcenter_host: "10.1.1.1"
589- vault_catalystcenter_username: "admin"
590- vault_catalystcenter_password: "secret"
648+ ```yaml
649+ # group_vars/catalyst_center_hosts/vault.yml (encrypted)
650+ catalystcenter_host: "10.1.1.1"
651+ catalystcenter_username: "admin"
652+ catalystcenter_password: "secret"
653+ ```
591654
592- # Reference in playbook
593- ansible-playbook cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml \
594- -e catalystcenter_host="{{ vault_catalystcenter_host }}" \
655+ ```bash
656+ # 2. Run the playbook — vault vars override the env-based defaults
657+ ansible-playbook -i inventory/hosts.yml \
658+ cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml \
595659 --ask-vault-pass
596660```
597661
@@ -610,13 +674,16 @@ yamale -s cvp/site_hierarchy/schema/sites_schema.yml \
610674
611675```bash
612676# Use check mode
613- ansible-playbook cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml --check
677+ ansible-playbook -i inventory/hosts.yml \
678+ cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml --check
614679
615680# Use diff mode
616- ansible-playbook cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml --diff
681+ ansible-playbook -i inventory/hosts.yml \
682+ cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml --diff
617683
618684# Limit to specific hosts
619- ansible-playbook cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml --limit dev-catalyst-center
685+ ansible-playbook -i inventory/hosts.yml \
686+ cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml --limit dev-catalyst-center
620687```
621688
622689### 5. Keep CVPs Updated
@@ -661,15 +728,24 @@ chmod -R u+rw ~/.ansible/collections/ansible_collections/cisco/catalystcenter/cv
661728
662729```bash
663730# Run with verbose output
664- ansible-playbook cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml -vvv
731+ ansible-playbook -i inventory/hosts.yml \
732+ cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml -vvv
665733
666734# Check syntax
667- ansible-playbook cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml --syntax-check
735+ ansible-playbook -i inventory/hosts.yml \
736+ cvp/site_hierarchy/playbook/site_hierarchy_playbook.yml --syntax-check
668737
669738# Validate variables
670739cat cvp/site_hierarchy/vars/site_hierarchy_design_vars.yml
671740```
672741
742+ ### `skipping: no hosts matched`
743+
744+ This error means the inventory does not define the `catalyst_center_hosts`
745+ group that every CVP playbook targets. Create the inventory shown in
746+ [Prerequisite: Inventory File](#-prerequisite-inventory-file) and pass it
747+ with `-i`. Setting `-e catalystcenter_host=...` alone will not fix this.
748+
673749---
674750
675751## 📞 Support
0 commit comments