This document describes the Programmable Installer, a spec-driven automation platform for deploying Cisco software stacks like NSO and CNC.
| Field | Value |
|---|---|
| Product | Programmable Installer |
| Document type | Technical white paper — architecture, implementation, and outcomes |
| Primary audience | Solution architects, Platform engineers, DevOps / SRE, Delivery leads |
| Secondary audience | Engineering management, Security reviewers, Program managers |
The Programmable Installer is a spec-driven automation platform for deploying and operating Cisco software stacks—including Network Services Orchestrator (NSO), Crosswork Network Controller (CNC), Crosswork Data Gateway (CDG), and Business Process Automation (BPA)—on enterprise Linux (RHEL family) and associated infrastructure where applicable (VMware vCenter, OpenShift, KVM, air-gapped Kubernetes). The system separates declarative intent (YAML specifications and optional guided intent generation) from execution (Ansible roles and playbooks), with a Python control plane that packages artifacts, verifies bundles before long-running installs, prepares encrypted secrets, and orchestrates validation gates.
This white paper explains the architectural layers, primary data flows, implementation patterns (including a hybrid data-driven artifact verification model), deployment modes (native, containerized, online, air-gapped), and the validation and logging frameworks. For delivery and platform organizations, the platform aims to reduce manual toil, surface misconfiguration and missing binaries early, and standardize automation across products and topologies while preserving environment-specific parameterization.
Keywords: infrastructure automation, declarative deployment, Ansible, YAML specification, air-gap packaging, artifact verification, Crosswork, NSO, CNC, CDG, BPA, validation policy, DevOps.
| Role | Suggested focus |
|---|---|
| Decision-makers / leads | Abstract; §1 Value proposition; §8 Benefits and risk posture; §10 Conclusion |
| Solution architects | §3–§6 (architecture, specification model, implementation, deployment patterns) |
| DevOps / SRE / delivery engineers | §5–§7; Appendix B; companion internal white paper annexes |
| Security reviewers | §7 Security and compliance posture; trust boundaries in §3.2 |
Enterprise installation of multi-tier network automation and orchestration products is traditionally high-touch: long runbooks, many manual steps, version skew between sites, and failures that surface hours into a process (missing NEDs, wrong OVA paths, incomplete air-gap image sets). That pattern increases cost, elongates change windows, and makes audits harder.
The Programmable Installer treats an installation as a program parameterized by a specification: topology, versions, platform choice (vCenter vs OpenShift vs vanilla VMs), file paths, and entitlements. Automation is idempotent where possible, repeatable across customers, and front-loaded with checks so that “not ready” is a fast, explicit outcome before cluster or product install.
| Actor / system | Role |
|---|---|
| Delivery engineer | Authors or generates specs, runs packaging, vault preparation, validation, orchestrator, and Ansible |
| Installer host | Linux control node (native or container) with Python, Ansible configuration, disk for artifacts |
| Target infrastructure | vCenter, OpenShift/KubeVirt, or vanilla VMs per specification |
| Artifact sources | Internal mirrors, entitlement layouts, software distribution—environment-specific |
| Downstream systems | Monitoring, change management, optional JIRA workflows |
| Layer | Responsibility |
|---|---|
| Specification | Topology, versions, platforms, paths, entitlements |
| Control plane | Packaging, bundle verification, vault helpers, validation driver, orchestrator CLI |
| Automation plane | Host prep, Kubernetes lifecycle, product install and day-one configuration |
| Artifacts | Binaries, images, charts, OVAs, tarballs |
| Product / bundle |
|---|
| NSO |
| CNC |
| CDG |
| BPA |
| CNC + NSO |
Specifications are YAML documents describing platforms (for example vCenter, OCP, VM, KVM ), hosts, applications with versions, topology (for example NSO CFS/RFS layouts), entitlements (NEDs and add-on packages), and file paths for OVAs, qcow2 images, and application-tier tarballs.
A specific application user_spec supplies defaults and path fallbacks for CNC/CDG. The orchestrator’s parser treats the user spec as source of truth and uses common spec entries when user keys are absent.
The intent generator supports guided collection of requirements via set of questionnaire, a rule engine (date driven logic), and schema-backed mapping to intent.yaml.
The orchestrator is the single entry for scripted or interactive generate-intent, verify-bundle, and install coordination. Its design is explicitly hybrid:
Readiness:AReportaggregates discovered artifacts; is_readyis true when no required files are missing after spec parsing. The module supports PyInstaller-frozen binaries via sys.frozen path resolution.
This component provides interactive menus and CLI modes for artifact packaging and host prerequisite installation: online, air-gap, or auto-detect; multi-application packaging including combinedCNC_NSO. It populates the artifact tree expected by Ansible and by verify-bundle logic.
The framework provides hierarchical policy control (global → app → stage → individual check), auto-discovery of checks, enhanced reporting to structured logs, and optional JIRA integration. Operators run pre- or post-deployment phases against the same spec used for install, aligning automation with quality gates suitable for enterprise change discipline.
Indicative scale on a typical branch: on the order of thirty checks across BPA and NSO (counts to be confirmed withmake list-validation-checkson your checkout).
Derives required vault variables from specs, prompts or accepts passwords under policy, and emits encrypted group_vars/all_secrets.yaml plus a vault password file for Ansible—reducing ad-hoc secret embedding in playbooks.
| Pattern | Summary |
|---|---|
| Native (AlmaLinux / RHEL) | Set PYTHONPATH and ANSIBLE_CONFIG; run packaging, vault, validation, orchestrator, and playbooks per product guide |
| Docker-based installer | scripts/setup_installer.sh and scripts/start_installer.sh with host mounts for large artifacts; |
| Air-gap | Package on a connected machine; transfer bundle; extract on target; install with--airgap |
| macOS bundle creation | Usepython3 ./setup_cxinstaller_prereqs.py on Mac to prepare bundles; target deployment remains Linux-oriented per project docs |
Example pre-deployment invocation:
cd /opt/cx-installer
python3 validation_checks/run_validation_checks.py -t pre -s specification/your_spec.yaml
With optional flags:
This is a model for inner sourcing where for more CISCO application installation same principle can be followed by forking the repository.
| Theme | Outcome |
|---|---|
| Time and toil | Fewer manual steps; failures detected at verify-bundle and validation phases rather than late in Ansible or product installers |
| Consistency | Shared schemas, roles, and artifact layout across engagements reduce “snowflake” differences |
| Disconnected operations | Documented bundle transfer supports regulated networks without runtime downloads |
| Governance | Structured validation reports and optional JIRA hooks support change records and follow-up |
| Extensibility | Clear extension points: ARTIFACT_DEFS, handlers, new roles/playbooks, intent schemas |
Quantitative metrics (install duration, defect rates) areorganization-specific; teams must baseline against legacy runbooks on comparable topologies.
Prefer new tasks inside cohesive roles; introduce new roles when boundaries are clear. Wire playbooks viaimport_playbookor documented entry playbooks. Keep safe defaults in group_vars / vars.
Update YAML schemas underintent-generator/schema/ and chatbot inputs; ensure generated files match filenames expected byAPP_CONFIG.
The CX Programmable Installer combines declarative specifications, a Python control plane for packaging and verification, and an Ansible automation plane for scalable, repeatable deployments of Crosswork-related products across diverse infrastructure and connectivity models. Its architecture intentionally separates intent from execution, applies data-driven artifact expectations where practical, and embeds validation and vault workflows suitable for enterprise delivery. For full operational annexes—playbook tables, troubleshooting matrices, connectivity matrices, and extended command references—see the companion internal white paper.
| Document | Path |
|---|---|
| Operator guide | README.md |
| Release playbook | RELEASE_GUIDE.md |
| Internal architecture annexes | docs/CX_INSTALLER_TECHNICAL_WHITE_PAPER_INTERNAL.md |
| Docker (online / air-gap / usage) | SETUP_ONLINE_DOCKER.md, SETUP_AIRGAPPED_DOCKER.md, USAGE_DOCKER.md |
| Validation framework | docs/validation_checks/README.md |
| Vault manager | docs/scripts/VAULT_SECRETS_MANAGER.md |
| Product guides | docs/nso.md, docs/bpa.md, docs/CNC_VCENTER_DEPLOYMENT_GUIDE.md, docs/CNC_OCP_DEPLOYMENT_GUIDE.md, docs/CNC_NSO_DEPLOYMENT_GUIDE.md |
| Intent generator | intent-generator/README.md |
| Chatbot / rule flow overview | docs/HowItWorks.md |
cx-installer/
├── ansible_playbooks/ # ansible.cfg, files/, group_vars/, playbooks/, roles/, vars/
├── apps/ # App-specific supporting content
├── deploy/ # Python deploy helpers, logging utilities
├── docs/ # Technical documentation
├── intent-generator/ # Chatbot, rule engine, schemas, output/
├── scripts/ # Docker setup/start, vault_secrets_manager.py, ...
├── specification/ # User specs, samples, common fragments
├── validation_checks/ # Policies, runners, reports
├── cx_deploy_orchestrator.py
├── setup_cxinstaller_prereqs*
├── requirements.txt
└── README.md
Post-setup artifact focal points (typical):ansible_playbooks/files/artifacts/, files/bin/, files/charts/, files/images/.
Script:cx_deploy_orchestrator.py
| Argument | Description |
|---|---|
| --app / -a | nso | crossworksuite | bpa |
| --spec / -s | Path to YAML specification |
| --step | generate-intent | verify-bundle | install |
| --verify-only | Verify bundle; exit non-zero if not ready |
| --dry-run | Dry run where supported |
| --list-specs | List known specs |
Environment (typical session):
export PYTHONPATH=$(pwd)
export ANSIBLE_CONFIG=$(pwd)/ansible_playbooks/ansible.cfg
| Term | Definition |
|---|---|
| Spec | YAML user specification: platforms, apps, topology, paths, entitlements |
| Intent | Normalized YAML from the intent generator or hand-authored equivalent |
| Bundle | Packaged installer tree (often tarball) for air-gap transfer |
| Orchestrator | cx_deploy_orchestrator.py — verify / intent / install coordination |
| Artifact verification | Filesystem checks that required binaries/images exist per spec |
| Vault | Ansible Vault–encrypted variable file for secrets |
| NED | Network Element Driver package (NSO) |
| CFS / RFS | NSO cluster forwarder / redundant forwarder topology concepts |
| Air-gap | Environment without installer-time access to package download endpoints |
| Version | Date | Notes |
|---|---|---|
| 1.0 | 2026-03-27 | Initial publication-ready technical white paper (Programmable Installer framing) |
| Revision | Publish Date | Comments |
|---|---|---|
2.0 |
28-Apr-2026
|
Initial Release, formatting |
1.0 |
28-Apr-2026
|
Initial Release |