Skip to content

APPENDIX II

Schema reference (lab features only)

This is a ~15% slice of the full schema

The full IOS XE as Code data model schema covers ~249 top-level configuration keys. This appendix includes only the ~38 keys the lab actually uses (global, devices, device_groups, templates, banner, access_lists, ip_hosts, loopbacks, vlan, bgp, system, aliases). For the complete data model - including MACsec, DMVPN, QoS, HSRP/VRRP, MPLS, IS-IS, EIGRP, multicast, AAA/TACACS/RADIUS, STP, 802.1X, SNMP, EEM, segment routing, EVPN, and more - browse netascode.cisco.com/docs/data_models/iosxe/overview/.

How to read this schema (Yamale syntax reference)

The schema is written in Yamale, a YAML-based schema validation format. Quick reference for the syntax you'll see below:

Syntax Meaning
str() Any string.
int() Any integer.
int(min=1, max=4094) Integer with bounds (e.g. VLAN IDs).
bool() true or false.
enum('permit', 'deny') One of the listed values - nothing else.
regex('^[A-Z]+$') String matching the given regex.
ip() A valid IP address.
list(include('X')) A list of objects conforming to the X sub-schema.
include('X') A single object conforming to the X sub-schema.
map(key=str()) Key/value map with string keys.
required=False Field is optional (defaults to required otherwise).
any(...) Value can match any of several type constructors.

So a line like login: str(required=False) reads as "the login field is an optional string", and sequence: int(min=1, max=2147483647) reads as "sequence is a required integer between 1 and 2^31-1".

Copy this single schema block for reference. It includes only the features used in this lab:

schema.yaml
---
iosxe: include('iosxe', required=False)
---

# Root structure
iosxe:
  global: include('global', required=False)
  devices: list(include('devices'), required=False)
  device_groups: list(include('device_groups'), required=False)
  templates: list(include('iosxe_templates'), required=False)

# Global configuration (Task03: Banner, Task06: Variables)
global:
  variables: map(key=str(), required=False)
  configuration: include('device_configuration', required=False)
  templates: list(str(), required=False)

# Device definitions (Task03, Task05, Task06, Task08)
devices:
  name: str()
  host: str(required=False)
  configuration: include('device_configuration', required=False)
  templates: list(str(), required=False)
  variables: map(key=str(), required=False)

# Device groups (Task04: ACL)
device_groups:
  name: str()
  devices: list(str(), required=False)
  configuration: include('device_configuration', required=False)
  templates: list(str(), required=False)

# Template definitions (Task07, Task08, Task09)
iosxe_templates:
  name: str()
  type: enum('model', 'file', 'cli')
  file: str(required=False)
  content: str(required=False)
  configuration: include('device_configuration', required=False)

# Device configuration block (used by global, devices, device_groups, templates)
device_configuration:
  banner: include('banner', required=False)
  access_lists: include('access_lists', required=False)
  system: include('system', required=False)
  vlan: include('vlan', required=False)
  routing: include('routing', required=False)
  interfaces: include('interfaces', required=False)

# Banner (Task03)
banner:
  exec: str(required=False)
  login: str(required=False)
  motd: str(required=False)

# Access Lists (Task04)
access_lists:
  standard: list(include('access_lists_standard'), required=False)

access_lists_standard:
  name: str()
  entries: list(include('access_lists_standard_entries'), required=False)

access_lists_standard_entries:
  sequence: int()
  action: enum('deny', 'permit')
  prefix: ip(required=False)
  prefix_mask: str(required=False)
  any: bool(required=False)
  host: ip(required=False)

# System - IP Hosts (Task05), Hostname (Task06)
system:
  hostname: regex('^[^\s]*$', required=False)
  ip_hosts: list(include('system_ip_hosts'), required=False)

system_ip_hosts:
  name: str()
  ips: list(ip())
  vrf: str(required=False)

# VLAN (Task07)
vlan:
  vlans: list(include('vlan_vlans'), required=False)

vlan_vlans:
  id: int(min=1, max=4094)
  name: str(required=False)

# Routing - BGP (Task08)
routing:
  bgp: include('routing_bgp', required=False)

routing_bgp:
  as_number: any(int(), str())
  router_id_interface_type: enum('Loopback', required=False)
  router_id_interface_id: any(int(), str(), required=False)
  neighbors: list(include('bgp_neighbors'), required=False)

bgp_neighbors:
  ip: ip()
  remote_as: any(int(), str())
  description: str(required=False)

# Interfaces (Task05: Loopbacks, Task08: Ethernets)
interfaces:
  ethernets: list(include('ethernets'), required=False)
  loopbacks: list(include('loopbacks'), required=False)

ethernets:
  type: any(enum('GigabitEthernet', 'FastEthernet', 'Ethernet', 'Port-channel', 'FiveGigabitEthernet', 'TenGigabitEthernet', 'TwentyFiveGigE', 'FortyGigabitEthernet', 'HundredGigE', 'TwoHundredGigE', 'FourHundredGigE'), regex("^.*[\$\%]\{.*$"))
  id: str()
  description: str(required=False)
  shutdown: any(bool(), regex("^.*[\$\%]\{.*$"), required=False)
  ipv4: include('interface_ipv4', required=False)

interface_ipv4:
  address: any(ip(), regex("^.*[\$\%]\{.*$"), required=False)
  address_mask: any(ip(), regex("^.*[\$\%]\{.*$"), required=False)

# Loopback Interfaces (Task05)
loopbacks:
  id: any(int(), regex("^.*[\$\%]\{.*$"))
  description: str(required=False)
  shutdown: any(bool(), regex("^.*[\$\%]\{.*$"), required=False)
  ipv4: include('interface_ipv4', required=False)

← Previous: Appendix I - CI/CD pipeline definition · Next: Appendix III - nac-test reference