From 3e37e94710b474643e2101401e3d9d19a098bcdb Mon Sep 17 00:00:00 2001 From: "Shivram Salem Arunachalam (ssalemar)" Date: Mon, 17 Aug 2026 17:56:28 -0700 Subject: [PATCH 1/5] Refresh supported SD-WAN automation stack --- .github/workflows/galaxy-importer.yml | 8 +- .github/workflows/linters.yml | 12 +-- .github/workflows/release-from-tag.yml | 8 +- .github/workflows/requirements.yml | 11 +- .pre-commit-config.yaml | 6 +- README.md | 42 ++++---- galaxy.yml | 19 ++-- meta/requirements.yml | 4 +- requirements.txt | 134 ++----------------------- requirements.yml | 4 +- 10 files changed, 72 insertions(+), 176 deletions(-) diff --git a/.github/workflows/galaxy-importer.yml b/.github/workflows/galaxy-importer.yml index 47ba7b4..9052a70 100644 --- a/.github/workflows/galaxy-importer.yml +++ b/.github/workflows/galaxy-importer.yml @@ -21,12 +21,12 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Python - uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: - python-version: '3.10' + python-version: '3.13' - name: Get collection namespace and name from galaxy.yml id: collection-name @@ -47,7 +47,7 @@ jobs: - name: Install Ansible and importer run: | - pip install ansible==9.4.0 + pip install ansible==14.3.1 pip install ansible-importer pip install galaxy-importer diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml index 2a8a211..9b35137 100644 --- a/.github/workflows/linters.yml +++ b/.github/workflows/linters.yml @@ -14,19 +14,19 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.10'] + python-version: ['3.13'] defaults: run: shell: sh steps: - name: Check out the repository - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Python - uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: - python-version: '3.10' + python-version: '3.13' - uses: isort/isort-action@f14e57e1d457956c45a19c05a89cccdf087846e5 # v1.1.0 with: @@ -36,10 +36,10 @@ jobs: uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1 - name: Run ansible-lint - uses: ansible/ansible-lint@95382d398ea1744bf6bfa47b030f14c38b3f6957 # v24.7.0 + uses: ansible/ansible-lint@665d9e07a1943254d2910faffc106adaf7ea7294 # v26.8.0 - name: Install detect-secrets - run: pip install detect-secrets==1.4.0 + run: pip install detect-secrets==1.5.0 - name: Run detect-secrets run: detect-secrets scan diff --git a/.github/workflows/release-from-tag.yml b/.github/workflows/release-from-tag.yml index 7155864..6ec4aca 100644 --- a/.github/workflows/release-from-tag.yml +++ b/.github/workflows/release-from-tag.yml @@ -14,12 +14,12 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Python - uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: - python-version: '3.10' + python-version: '3.13' - name: Get collection version from galaxy.yml id: collection-version @@ -57,7 +57,7 @@ jobs: - name: Install Ansible run: | - pip install ansible==9.4.0 + pip install ansible==14.3.1 - name: Build collection run: | diff --git a/.github/workflows/requirements.yml b/.github/workflows/requirements.yml index 82c319f..dcb9a76 100644 --- a/.github/workflows/requirements.yml +++ b/.github/workflows/requirements.yml @@ -1,5 +1,5 @@ # .github/workflows/requirements.yml -name: requirements.txt combatibility +name: requirements.txt compatibility on: pull_request: @@ -16,18 +16,19 @@ jobs: strategy: matrix: - python-version: ['3.10', '3.11', '3.12', '3.13'] + python-version: ['3.12', '3.13', '3.14'] steps: - name: Checkout repository - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip - pip install -r requirements.txt --no-deps + pip install -r requirements.txt + ansible-galaxy collection install -r requirements.yml --force diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 26c5838..3bf33fc 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,18 +1,18 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v6.0.0 hooks: - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/ansible-community/ansible-lint.git - rev: v24.2.1 # latest release tag from https://github.com/ansible-community/ansible-lint/releases/ + rev: v26.8.0 hooks: - id: ansible-lint files: \.(yaml|yml)$ - repo: https://github.com/Yelp/detect-secrets - rev: v1.4.0 + rev: v1.5.0 hooks: - id: detect-secrets diff --git a/README.md b/README.md index 420b839..5422f7e 100644 --- a/README.md +++ b/README.md @@ -71,9 +71,11 @@ This project is cross-platform and can be set up on the following operating syst ### Python requirement -Supported version: Python >=3.10+ +Current tested versions: Python 3.12-3.14 -- Due to [ansible-core==2.16](https://docs.ansible.com/ansible/latest/reference_appendices/release_and_maintenance.html#ansible-core-support-matrix) requirement, this collection requires Python 3.10 or greater. +- The latest tested stack is Ansible 14.3.1 with ansible-core 2.21.3. +- Older automation environments remain governed by `meta/runtime.yml`; use the + current `requirements.txt` and `requirements.yml` for the maintained stack. ### Cloud authentication requirement @@ -99,7 +101,7 @@ Current version of the full workflow for bringup SD-WAN assumes that users are f ## Installing this collection -### Install by cloning this repostiory - recommended way +### Install by cloning this repository - recommended way You can install collection by first cloning this repository: @@ -108,12 +110,12 @@ git clone git@github.com:cisco-en-programmability/ansible-collection-sdwan.git ``` Then setting your python environment. -Recommended way: use supported version of Python (>=3.10) and set up your environment with: +Recommended way: use a tested version of Python (3.12-3.14) and set up your environment with: ```bash python3 -m venv source /bin/activate -pip install -r requirements.txt --no-deps +python -m pip install -r requirements.txt ``` And then install ansible requirements: @@ -124,7 +126,7 @@ ansible-galaxy install -r requirements.yml ### Install with Ansible Galaxy -***Note*** that when installing this collection with `ansible-galaxy` command, it will be placed inside your system collections path. That migth introduce additional complexity for using configuration files etc. +***Note*** that when installing this collection with `ansible-galaxy`, it will be placed inside your configured collections path. That might introduce additional complexity for using configuration files. You can install this collection with the Ansible Galaxy CLI (requires `ansible` package installed) @@ -133,7 +135,7 @@ ansible-galaxy collection install cisco.sdwan ``` The python module dependencies are not installed by ansible-galaxy. They can be manually installed using pip. -Recommended way: use supported version of Python (>=3.10) and set up your environment with: +Recommended way: use a tested version of Python (3.12-3.14) and set up your environment with: ```bash python3 -m venv @@ -143,14 +145,22 @@ source /bin/activate And then install python requirements: ```bash -pip install -r requirements.txt --no-deps +python -m pip install -r requirements.txt ```

***Note***: For python packages installation troubleshooting see [python-packages-installation](#5-python-packages-installation) -Verify that your ansible version is using python modules from vevn by using test playbook: +For Azure deployments, also install the Python dependencies shipped by the +installed `azure.azcollection` collection. The current provider dependency set +contains a pinned prerelease package, so allow prereleases explicitly: + +```bash +python -m pip install --pre -r ~/.ansible/collections/ansible_collections/azure/azcollection/requirements.txt +``` + +Verify that your Ansible version is using Python modules from the virtual environment by using the test playbook: For AWS: @@ -287,16 +297,10 @@ Ansible defaults to installing the collection in `~/.ansible/collections`. This ### 5. Python packages installation -Python packages requirements are formed to include all dependencies. -Therefore if you face issues with installation, note that there is known confict: - -```log - The user requested packaging - catalystwan 0.31.2 depends on packaging<24.0 and >=23.0 - azure-cli-core 2.34.0 depends on packaging<22.0 and >=20.9 -``` - -solved by using: `pip install -r requirements.txt --no-deps` command. +Install `requirements.txt` normally so that pip resolves and installs transitive +dependencies. The historical `packaging` conflict between catalystwan 0.31.2 +and azure-cli-core 2.34.0 no longer applies to the maintained dependency set. +Install the Azure collection's own requirements with `--pre` as shown above. --- diff --git a/galaxy.yml b/galaxy.yml index 5dadba1..a1b064b 100644 --- a/galaxy.yml +++ b/galaxy.yml @@ -1,6 +1,6 @@ namespace: cisco name: sdwan -version: 0.3.6 +version: 0.3.7 readme: README.md authors: - Arkadiusz Cichon @@ -21,9 +21,16 @@ tags: - networking dependencies: - "cisco.sdwan_deployment": ">=0.1.1" - "cisco.catalystwan": ">=0.1.1" - "amazon.aws": ">=6.5.0" - "azure.azcollection": ">=1.19.0" + "cisco.sdwan_deployment": ">=0.3.3" + "cisco.catalystwan": ">=0.3.2" + "amazon.aws": ">=11.4.0" + "azure.azcollection": ">=3.21.0" -build_ignore: [] +build_ignore: + - .git + - .github + - .pytest_cache + - .venv + - "**/__pycache__" + - "**/*.pyc" + - "*.tar.gz" diff --git a/meta/requirements.yml b/meta/requirements.yml index 5f6bb08..e0f2be1 100644 --- a/meta/requirements.yml +++ b/meta/requirements.yml @@ -2,9 +2,9 @@ collections: - name: amazon.aws - version: 6.5.0 + version: 11.4.0 - name: azure.azcollection - version: 1.19.0 + version: 3.21.0 - name: git@github.com:cisco-en-programmability/ansible-collection-catalystwan.git type: git version: main diff --git a/requirements.txt b/requirements.txt index 22f159d..1068854 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,125 +1,9 @@ -adal==1.2.7 -annotated-types==0.6.0 -ansible==9.5.1 -ansible-core==2.16.6 -applicationinsights==0.11.10 -argcomplete==3.3.0 -args==0.1.0 -attrs==21.4.0 -azure-cli-core==2.63.0 -azure-cli-nspkg==3.0.4 -azure-cli-telemetry==1.1.0 -azure-common==1.1.11 -azure-containerregistry==1.1.0 -azure-core==1.28.0 -azure-graphrbac==0.61.1 -azure-identity==1.16.1 -azure-keyvault==4.2.0 -azure-keyvault-certificates==4.7.0 -azure-keyvault-keys==4.8.0 -azure-keyvault-secrets==4.7.0 -azure-mgmt-apimanagement==3.0.0 -azure-mgmt-authorization==2.0.0 -azure-mgmt-automation==1.0.0 -azure-mgmt-batch==16.2.0 -azure-mgmt-cdn==11.0.0 -azure-mgmt-compute==26.1.0 -azure-mgmt-containerinstance==9.0.0 -azure-mgmt-containerregistry==9.1.0 -azure-mgmt-containerservice==20.0.0 -azure-mgmt-core==1.3.0 -azure-mgmt-cosmosdb==6.4.0 -azure-mgmt-datafactory==2.0.0 -azure-mgmt-datalake-store==1.0.0 -azure-mgmt-devtestlabs==9.0.0 -azure-mgmt-dns==8.0.0 -azure-mgmt-eventhub==10.1.0 -azure-mgmt-hdinsight==9.0.0 -azure-mgmt-iothub==2.2.0 -azure-mgmt-keyvault==10.0.0 -azure-mgmt-loganalytics==12.0.0 -azure-mgmt-managedservices==6.0.0 -azure-mgmt-managementgroups==1.0.0 -azure-mgmt-marketplaceordering==1.1.0 -azure-mgmt-monitor==3.0.0 -azure-mgmt-network==19.1.0 -azure-mgmt-notificationhubs==7.0.0 -azure-mgmt-nspkg==2.0.0 -azure-mgmt-privatedns==1.0.0 -azure-mgmt-rdbms==10.0.0 -azure-mgmt-recoveryservices==2.0.0 -azure-mgmt-recoveryservicesbackup==3.0.0 -azure-mgmt-redis==13.0.0 -azure-mgmt-resource==23.0.0 -azure-mgmt-search==8.0.0 -azure-mgmt-servicebus==7.1.0 -azure-mgmt-sql==3.0.1 -azure-mgmt-storage==19.0.0 -azure-mgmt-trafficmanager==1.0.0b1 -azure-mgmt-web==6.1.0 -azure-nspkg==2.0.0 -azure-storage-blob==12.13.0 -bcrypt==4.1.2 -boto3==1.34.78 -botocore==1.34.78 -catalystwan==v0.40.1dev9 -certifi==2024.7.4 -cffi==1.17.1 -charset-normalizer==3.3.2 -ciscoconfparse==1.9.41 -clint==0.5.1 -colorama==0.4.6 -cryptography==44.0.1 -Deprecated==1.2.14 -dnspython==2.6.1 -flake8==7.0.0 -flake8-quotes==3.4.0 -hier-config==2.2.3 -humanfriendly==10.0 -idna==3.7 -isodate==0.6.1 -Jinja2==3.1.6 -jmespath==1.0.1 -knack==0.11.0 -loguru==0.7.2 -MarkupSafe==2.1.5 -mccabe==0.7.0 -msal==1.30.0 -msal-extensions==1.2.0 -msrest==0.7.1 -msrestazure==0.6.4 -netaddr==1.2.1 -oauthlib==3.2.2 -packaging==21.3 -paramiko==3.4.0 -passlib==1.7.4 -pkginfo==1.10.0 -portalocker==1.7.1 -psutil==5.9.8 -pycodestyle==2.11.1 -pycparser==2.22 -pydantic==2.8.2 -pydantic_core==2.20.1 -pyflakes==3.2.0 -Pygments==2.17.2 -PyJWT==2.8.0 -PyNaCl==1.5.0 -pyOpenSSL==24.1.0 -pyparsing==3.1.2 -PySocks==1.7.1 -python-dateutil==2.9.0.post0 -PyYAML==6.0.1 -requests==2.32.2 -requests-oauthlib==2.0.0 -requests-toolbelt==1.0.0 -resolvelib==1.0.1 -s3transfer==0.10.1 -setuptools==78.1.1 -six==1.16.0 -tabulate==0.9.0 -tenacity==8.2.3 -toml==0.10.2 -typing_extensions==4.12.2 -urllib3==2.2.2 -wrapt==1.16.0 -xmltodict==0.13.0 +# Tested orchestration stack. Install the collections in requirements.yml +# before installing their provider-specific Python dependencies. +ansible==14.3.1 +catalystwan==0.41.5.dev2 + +# amazon.aws 11.4.0 runtime requirements +aiobotocore>=2.14.0 +boto3>=1.35.0 +botocore>=1.35.0 diff --git a/requirements.yml b/requirements.yml index 08b6a67..c1b7a33 100644 --- a/requirements.yml +++ b/requirements.yml @@ -1,8 +1,8 @@ collections: - name: amazon.aws - version: 6.5.0 + version: 11.4.0 - name: azure.azcollection - version: 1.19.0 + version: 3.21.0 - name: cisco.catalystwan version: 0.3.2 - name: cisco.sdwan_deployment From edad7ec708e9d3c9399409eec02c13a9b647de25 Mon Sep 17 00:00:00 2001 From: "Shivram Salem Arunachalam (ssalemar)" Date: Mon, 17 Aug 2026 22:31:30 -0700 Subject: [PATCH 2/5] Run lint workflow on Python 3.14 --- .github/workflows/linters.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml index 9b35137..2cac50c 100644 --- a/.github/workflows/linters.yml +++ b/.github/workflows/linters.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.13'] + python-version: ['3.14'] defaults: run: shell: sh @@ -26,7 +26,7 @@ jobs: - name: Set up Python uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: - python-version: '3.13' + python-version: '3.14' - uses: isort/isort-action@f14e57e1d457956c45a19c05a89cccdf087846e5 # v1.1.0 with: From 039c3e73e7cbbc780614f15af11c9f0822a9e13f Mon Sep 17 00:00:00 2001 From: "Shivram Salem Arunachalam (ssalemar)" Date: Tue, 18 Aug 2026 08:57:25 -0700 Subject: [PATCH 3/5] Normalize playbook line endings for ansible-test --- playbooks/aws/ux2_cedge_adoption.yml | 84 +++---- .../azure/cluster_deploy_and_configure.yml | 202 +++++++-------- playbooks/azure/ux2_cedge_adoption.yml | 86 +++---- .../azure/ux2_full_deploy_and_configure.yml | 234 +++++++++--------- 4 files changed, 303 insertions(+), 303 deletions(-) diff --git a/playbooks/aws/ux2_cedge_adoption.yml b/playbooks/aws/ux2_cedge_adoption.yml index 3f9547e..dfa3078 100644 --- a/playbooks/aws/ux2_cedge_adoption.yml +++ b/playbooks/aws/ux2_cedge_adoption.yml @@ -1,42 +1,42 @@ -# Copyright 2024 Cisco Systems, Inc. and its affiliates -# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt) - -- name: Read deployed cEdge parameters - hosts: localhost - gather_facts: false - vars: - aws_tag_creator: "{{ organization_name }}" - vars_files: - - aws_sdwan_config.yml - roles: - - cisco.sdwan_deployment.aws_device_params - - cisco.catalystwan.edge_params - -- name: Extract deployment facts - hosts: localhost - gather_facts: false - vars_files: - - aws_sdwan_config.yml - tasks: - - name: Generate deployment facts file for cEdges - ansible.builtin.include_role: - name: cisco.sdwan_deployment.common - tasks_from: generate_deployment_facts_edges.yml - -- name: Build feature profile data - hosts: localhost - gather_facts: false - vars_files: - - ./feature_profile_config.yml - roles: - - cisco.catalystwan.feature_profile_builder - -- name: Create Config Groups - hosts: localhost - gather_facts: false - vars_files: - - aws_sdwan_config.yml - - "{{ playbook_dir }}/results/generated_feature_profiles.yml" - - "{{ results_path_edges }}" - roles: - - cisco.catalystwan.config_groups +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt) + +- name: Read deployed cEdge parameters + hosts: localhost + gather_facts: false + vars: + aws_tag_creator: "{{ organization_name }}" + vars_files: + - aws_sdwan_config.yml + roles: + - cisco.sdwan_deployment.aws_device_params + - cisco.catalystwan.edge_params + +- name: Extract deployment facts + hosts: localhost + gather_facts: false + vars_files: + - aws_sdwan_config.yml + tasks: + - name: Generate deployment facts file for cEdges + ansible.builtin.include_role: + name: cisco.sdwan_deployment.common + tasks_from: generate_deployment_facts_edges.yml + +- name: Build feature profile data + hosts: localhost + gather_facts: false + vars_files: + - ./feature_profile_config.yml + roles: + - cisco.catalystwan.feature_profile_builder + +- name: Create Config Groups + hosts: localhost + gather_facts: false + vars_files: + - aws_sdwan_config.yml + - "{{ playbook_dir }}/results/generated_feature_profiles.yml" + - "{{ results_path_edges }}" + roles: + - cisco.catalystwan.config_groups diff --git a/playbooks/azure/cluster_deploy_and_configure.yml b/playbooks/azure/cluster_deploy_and_configure.yml index d4031da..505c2a7 100644 --- a/playbooks/azure/cluster_deploy_and_configure.yml +++ b/playbooks/azure/cluster_deploy_and_configure.yml @@ -1,101 +1,101 @@ -# Copyright 2024 Cisco Systems, Inc. and its affiliates -# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt) - - -# Deploy Cisco SD-WAN version 20.13 on Azure -- name: Deploy Cisco SD-WAN versions 20.13 on Azure - hosts: localhost - gather_facts: false - vars_files: - ./azure_sdwan_config.yml - tasks: - roles: - - cisco.sdwan_deployment.azure_network_infrastructure - - cisco.sdwan_deployment.azure_controllers - - -- name: Verify server connectivity, set initial configuration, onboard controllers - hosts: localhost - gather_facts: false - vars_files: - - ./azure_sdwan_config.yml - - ./pnp_credentials.yml - - "{{ results_path_controllers }}" - roles: - - cisco.catalystwan.api_ready - - cisco.catalystwan.administration_settings - - cisco.catalystwan.onboarding_controllers - - -- name: Cluster configuration - hosts: localhost - gather_facts: false - vars_files: - - ./azure_sdwan_config.yml - - ./pnp_credentials.yml - - "{{ results_path_controllers }}" - roles: - - cisco.catalystwan.cluster - - -- name: Generate bootstrap configuration for synced edges - hosts: localhost - gather_facts: false - vars_files: - - ./azure_sdwan_config.yml - - ./pnp_credentials.yml - - "{{ results_path_controllers }}" - roles: - - cisco.catalystwan.sync_pnp_edges - - -# Deploying edges requires vbond_mgmt_public_ip, otp and uuid! -- name: Deploy Edge devices based on generated boostrap configuration - hosts: localhost - gather_facts: false - vars_files: - - ./azure_sdwan_config.yml - - "{{ results_path_controllers }}" - - "{{ deployment_edges_config }}" - roles: - - cisco.sdwan_deployment.azure_edges - - -# Onboard edge devices and wait for their reachability -- name: Activate and validate edge devices - hosts: localhost - gather_facts: false - vars_files: - - ./azure_sdwan_config.yml - - "{{ results_path_controllers }}" - - "{{ results_path_edges }}" - roles: - - cisco.catalystwan.activate_edges - - -# Attach templates with running-config for all devices -- name: Set vmanage mode for all devices - hosts: localhost - gather_facts: false - vars_files: - - ./azure_sdwan_config.yml - - "{{ results_path_controllers }}" - - "{{ results_path_edges }}" - vars: - edge_instances: "{{ deployed_edge_instances }}" - roles: - - cisco.catalystwan.vmanage_mode - -# After assigning templates, we should add check there to verify that device is managed by templates -# add to vmanage_mode role. - -# Health checks -- name: Verify control connections and BFD, OMP - hosts: localhost - gather_facts: false - vars_files: - - ./azure_sdwan_config.yml - - "{{ results_path_controllers }}" - - "{{ results_path_edges }}" - roles: - - cisco.catalystwan.health_checks +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt) + + +# Deploy Cisco SD-WAN version 20.13 on Azure +- name: Deploy Cisco SD-WAN versions 20.13 on Azure + hosts: localhost + gather_facts: false + vars_files: + ./azure_sdwan_config.yml + tasks: + roles: + - cisco.sdwan_deployment.azure_network_infrastructure + - cisco.sdwan_deployment.azure_controllers + + +- name: Verify server connectivity, set initial configuration, onboard controllers + hosts: localhost + gather_facts: false + vars_files: + - ./azure_sdwan_config.yml + - ./pnp_credentials.yml + - "{{ results_path_controllers }}" + roles: + - cisco.catalystwan.api_ready + - cisco.catalystwan.administration_settings + - cisco.catalystwan.onboarding_controllers + + +- name: Cluster configuration + hosts: localhost + gather_facts: false + vars_files: + - ./azure_sdwan_config.yml + - ./pnp_credentials.yml + - "{{ results_path_controllers }}" + roles: + - cisco.catalystwan.cluster + + +- name: Generate bootstrap configuration for synced edges + hosts: localhost + gather_facts: false + vars_files: + - ./azure_sdwan_config.yml + - ./pnp_credentials.yml + - "{{ results_path_controllers }}" + roles: + - cisco.catalystwan.sync_pnp_edges + + +# Deploying edges requires vbond_mgmt_public_ip, otp and uuid! +- name: Deploy Edge devices based on generated boostrap configuration + hosts: localhost + gather_facts: false + vars_files: + - ./azure_sdwan_config.yml + - "{{ results_path_controllers }}" + - "{{ deployment_edges_config }}" + roles: + - cisco.sdwan_deployment.azure_edges + + +# Onboard edge devices and wait for their reachability +- name: Activate and validate edge devices + hosts: localhost + gather_facts: false + vars_files: + - ./azure_sdwan_config.yml + - "{{ results_path_controllers }}" + - "{{ results_path_edges }}" + roles: + - cisco.catalystwan.activate_edges + + +# Attach templates with running-config for all devices +- name: Set vmanage mode for all devices + hosts: localhost + gather_facts: false + vars_files: + - ./azure_sdwan_config.yml + - "{{ results_path_controllers }}" + - "{{ results_path_edges }}" + vars: + edge_instances: "{{ deployed_edge_instances }}" + roles: + - cisco.catalystwan.vmanage_mode + +# After assigning templates, we should add check there to verify that device is managed by templates +# add to vmanage_mode role. + +# Health checks +- name: Verify control connections and BFD, OMP + hosts: localhost + gather_facts: false + vars_files: + - ./azure_sdwan_config.yml + - "{{ results_path_controllers }}" + - "{{ results_path_edges }}" + roles: + - cisco.catalystwan.health_checks diff --git a/playbooks/azure/ux2_cedge_adoption.yml b/playbooks/azure/ux2_cedge_adoption.yml index bc5848a..f8cf4ad 100644 --- a/playbooks/azure/ux2_cedge_adoption.yml +++ b/playbooks/azure/ux2_cedge_adoption.yml @@ -1,43 +1,43 @@ -# Copyright 2024 Cisco Systems, Inc. and its affiliates -# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt) - -- name: Read deployed cEdge parameters - hosts: localhost - gather_facts: false - vars: - az_tag_creator: "{{ organization_name }}" - az_resource_group: "{{ az_resources_prefix }}-rg" - vars_files: - - azure_sdwan_config.yml - roles: - - cisco.sdwan_deployment.azure_device_params - - cisco.catalystwan.edge_params - -- name: Extract deployment facts - hosts: localhost - gather_facts: false - vars_files: - - azure_sdwan_config.yml - tasks: - - name: Generate deployment facts file for cEdges - ansible.builtin.include_role: - name: cisco.sdwan_deployment.common - tasks_from: generate_deployment_facts_edges.yml - -- name: Build feature profile data - hosts: localhost - gather_facts: false - vars_files: - - feature_profile_config.yml - roles: - - cisco.catalystwan.feature_profile_builder - -- name: Create Config Groups - hosts: localhost - gather_facts: false - vars_files: - - azure_sdwan_config.yml - - "{{ playbook_dir }}/results/generated_feature_profiles.yml" - - "{{ results_path_edges }}" - roles: - - cisco.catalystwan.config_groups +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt) + +- name: Read deployed cEdge parameters + hosts: localhost + gather_facts: false + vars: + az_tag_creator: "{{ organization_name }}" + az_resource_group: "{{ az_resources_prefix }}-rg" + vars_files: + - azure_sdwan_config.yml + roles: + - cisco.sdwan_deployment.azure_device_params + - cisco.catalystwan.edge_params + +- name: Extract deployment facts + hosts: localhost + gather_facts: false + vars_files: + - azure_sdwan_config.yml + tasks: + - name: Generate deployment facts file for cEdges + ansible.builtin.include_role: + name: cisco.sdwan_deployment.common + tasks_from: generate_deployment_facts_edges.yml + +- name: Build feature profile data + hosts: localhost + gather_facts: false + vars_files: + - feature_profile_config.yml + roles: + - cisco.catalystwan.feature_profile_builder + +- name: Create Config Groups + hosts: localhost + gather_facts: false + vars_files: + - azure_sdwan_config.yml + - "{{ playbook_dir }}/results/generated_feature_profiles.yml" + - "{{ results_path_edges }}" + roles: + - cisco.catalystwan.config_groups diff --git a/playbooks/azure/ux2_full_deploy_and_configure.yml b/playbooks/azure/ux2_full_deploy_and_configure.yml index d577d98..6b16e14 100644 --- a/playbooks/azure/ux2_full_deploy_and_configure.yml +++ b/playbooks/azure/ux2_full_deploy_and_configure.yml @@ -1,117 +1,117 @@ -# Copyright 2024 Cisco Systems, Inc. and its affiliates -# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt) - - -# Deploy Cisco SD-WAN version 20.13 on Azure -- name: Deploy Cisco SD-WAN versions 20.13 on Azure - hosts: localhost - gather_facts: false - vars_files: - azure_sdwan_config.yml - tasks: - roles: - - cisco.sdwan_deployment.azure_network_infrastructure - - cisco.sdwan_deployment.azure_controllers - - -- name: Verify server connectivity, set initial configuration, onboard controllers - hosts: localhost - gather_facts: false - vars_files: - - azure_sdwan_config.yml - - ./pnp_credentials.yml - - "{{ results_path_controllers }}" - roles: - - cisco.catalystwan.api_ready - - cisco.catalystwan.administration_settings - - cisco.catalystwan.onboarding_controllers - - -- name: Generate bootstrap configuration for synced edges - hosts: localhost - gather_facts: false - vars_files: - - azure_sdwan_config.yml - - ./pnp_credentials.yml - - "{{ results_path_controllers }}" - roles: - - cisco.catalystwan.sync_pnp_edges - - -# Deploying edges requires vbond_mgmt_public_ip, otp and uuid! -- name: Deploy Edge devices based on generated boostrap configuration - hosts: localhost - gather_facts: false - vars_files: - - azure_sdwan_config.yml - - "{{ results_path_controllers }}" - - "{{ deployment_edges_config }}" - roles: - - cisco.sdwan_deployment.azure_edges - - -# Onboard edge devices and wait for their reachability -- name: Activate and validate edge devices - hosts: localhost - gather_facts: false - vars_files: - - azure_sdwan_config.yml - - "{{ results_path_controllers }}" - - "{{ results_path_edges }}" - roles: - - cisco.catalystwan.activate_edges - - -# Attach templates with running-config for all devices -- name: Set vmanage mode for all devices - hosts: localhost - gather_facts: false - vars_files: - - azure_sdwan_config.yml - - "{{ results_path_controllers }}" - roles: - - cisco.catalystwan.vmanage_mode - -- name: Build feature profile data - hosts: localhost - gather_facts: false - vars_files: - - ./feature_profile_config.yml - roles: - - cisco.catalystwan.feature_profile_builder - -- name: Check if vManage version matches requirements - hosts: localhost - gather_facts: false - vars_files: - - ./azure_sdwan_config.yml - - "{{ results_path_controllers }}" - vars: - min_version_required: "20.13.1" - roles: - - cisco.catalystwan.vmanage_version - -- name: Create Config Groups - hosts: localhost - gather_facts: false - vars_files: - - azure_sdwan_config.yml - - "{{ playbook_dir }}/results/generated_feature_profiles.yml" - - "{{ results_path_controllers }}" - - "{{ results_path_edges }}" - roles: - - cisco.catalystwan.config_groups - -# After assigning templates, we should add check there to verify that device is managed by templates -# add to vmanage_mode role. - -# Health checks -- name: Verify control connections and BFD, OMP - hosts: localhost - gather_facts: false - vars_files: - - azure_sdwan_config.yml - - "{{ results_path_controllers }}" - - "{{ results_path_edges }}" - roles: - - cisco.catalystwan.health_checks +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt) + + +# Deploy Cisco SD-WAN version 20.13 on Azure +- name: Deploy Cisco SD-WAN versions 20.13 on Azure + hosts: localhost + gather_facts: false + vars_files: + azure_sdwan_config.yml + tasks: + roles: + - cisco.sdwan_deployment.azure_network_infrastructure + - cisco.sdwan_deployment.azure_controllers + + +- name: Verify server connectivity, set initial configuration, onboard controllers + hosts: localhost + gather_facts: false + vars_files: + - azure_sdwan_config.yml + - ./pnp_credentials.yml + - "{{ results_path_controllers }}" + roles: + - cisco.catalystwan.api_ready + - cisco.catalystwan.administration_settings + - cisco.catalystwan.onboarding_controllers + + +- name: Generate bootstrap configuration for synced edges + hosts: localhost + gather_facts: false + vars_files: + - azure_sdwan_config.yml + - ./pnp_credentials.yml + - "{{ results_path_controllers }}" + roles: + - cisco.catalystwan.sync_pnp_edges + + +# Deploying edges requires vbond_mgmt_public_ip, otp and uuid! +- name: Deploy Edge devices based on generated boostrap configuration + hosts: localhost + gather_facts: false + vars_files: + - azure_sdwan_config.yml + - "{{ results_path_controllers }}" + - "{{ deployment_edges_config }}" + roles: + - cisco.sdwan_deployment.azure_edges + + +# Onboard edge devices and wait for their reachability +- name: Activate and validate edge devices + hosts: localhost + gather_facts: false + vars_files: + - azure_sdwan_config.yml + - "{{ results_path_controllers }}" + - "{{ results_path_edges }}" + roles: + - cisco.catalystwan.activate_edges + + +# Attach templates with running-config for all devices +- name: Set vmanage mode for all devices + hosts: localhost + gather_facts: false + vars_files: + - azure_sdwan_config.yml + - "{{ results_path_controllers }}" + roles: + - cisco.catalystwan.vmanage_mode + +- name: Build feature profile data + hosts: localhost + gather_facts: false + vars_files: + - ./feature_profile_config.yml + roles: + - cisco.catalystwan.feature_profile_builder + +- name: Check if vManage version matches requirements + hosts: localhost + gather_facts: false + vars_files: + - ./azure_sdwan_config.yml + - "{{ results_path_controllers }}" + vars: + min_version_required: "20.13.1" + roles: + - cisco.catalystwan.vmanage_version + +- name: Create Config Groups + hosts: localhost + gather_facts: false + vars_files: + - azure_sdwan_config.yml + - "{{ playbook_dir }}/results/generated_feature_profiles.yml" + - "{{ results_path_controllers }}" + - "{{ results_path_edges }}" + roles: + - cisco.catalystwan.config_groups + +# After assigning templates, we should add check there to verify that device is managed by templates +# add to vmanage_mode role. + +# Health checks +- name: Verify control connections and BFD, OMP + hosts: localhost + gather_facts: false + vars_files: + - azure_sdwan_config.yml + - "{{ results_path_controllers }}" + - "{{ results_path_edges }}" + roles: + - cisco.catalystwan.health_checks From f3119711bc1ae166167dbfd44d2892193a071a42 Mon Sep 17 00:00:00 2001 From: "Shivram Salem Arunachalam (ssalemar)" Date: Tue, 18 Aug 2026 09:12:03 -0700 Subject: [PATCH 4/5] Add recurring ansible-test sanity coverage --- .gitattributes | 4 ++++ .github/workflows/sanity.yml | 38 ++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 .gitattributes create mode 100644 .github/workflows/sanity.yml diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..58910f1 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +* text=auto +*.py text eol=lf +*.yml text eol=lf +*.yaml text eol=lf diff --git a/.github/workflows/sanity.yml b/.github/workflows/sanity.yml new file mode 100644 index 0000000..962eb97 --- /dev/null +++ b/.github/workflows/sanity.yml @@ -0,0 +1,38 @@ +name: Ansible sanity + +on: + pull_request: + push: + branches: + - main + schedule: + - cron: "23 9 * * 1" + workflow_dispatch: + +permissions: read-all + +jobs: + sanity: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.12", "3.13", "3.14"] + + steps: + - name: Check out the collection + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + path: ansible_collections/cisco/sdwan + + - name: Set up Python + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + with: + python-version: "${{ matrix.python-version }}" + + - name: Install ansible-test + run: python -m pip install "ansible==14.3.1" + + - name: Run collection sanity tests + working-directory: ansible_collections/cisco/sdwan + run: ansible-test sanity --python "${{ matrix.python-version }}" --color yes From c881b75e31ad0d2f8f2c81c7cc5721033b3c5176 Mon Sep 17 00:00:00 2001 From: "Shivram Salem Arunachalam (ssalemar)" Date: Tue, 18 Aug 2026 11:00:24 -0700 Subject: [PATCH 5/5] Modernize Ansible callback configuration --- ansible.cfg | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ansible.cfg b/ansible.cfg index 52259be..2625d1c 100644 --- a/ansible.cfg +++ b/ansible.cfg @@ -1,6 +1,7 @@ [defaults] # vault_password_file = /path/to/vault/password/file -stdout_callback = yaml +stdout_callback = default +callback_result_format = yaml bin_ansible_callbacks = True callbacks_enabled = profile_tasks remote_tmp = /tmp/.ansible_remote/tmp