{"id":1475,"date":"2023-03-22T16:22:53","date_gmt":"2023-03-22T15:22:53","guid":{"rendered":"http:\/\/192.168.1.213:8088\/?p=1475"},"modified":"2023-10-13T05:40:10","modified_gmt":"2023-10-13T04:40:10","slug":"cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics","status":"publish","type":"post","link":"http:\/\/192.168.1.213:8088\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics\/","title":{"rendered":"Cisco NDFC ZTP (Zero-Touch-Provisioning) with Ansible for BGP EVPN fabrics"},"content":{"rendered":"\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t

\n\t\t\t\tTable of Contents\t\t\t<\/h4>\n\t\t\t\t\t\t\t
<\/i><\/div>\n\t\t\t\t
<\/i><\/div>\n\t\t\t\t\t<\/div>\n\t\t
\n\t\t\t
\n\t\t\t\t<\/i>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t
Introduction<\/h5>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\t\t

If you want to build BGP EVPN based Datacenter fabrics, Cisco’s answer is NDFC (Nexus Dashboard Fabric Controller)<\/a>.<\/p>

Cisco Nexus Dashboard Fabric Controller (NDFC) is a network automation and management solution offered by Cisco. NDFC provides a single dashboard for managing and automating network operations across multi-cloud, on-premises, and edge environments.<\/p>

In this article, I am describing how to build a BGP EPVN fabric and provision Spine and Leaf switches using POAP (PowerOn auto-provisioning)<\/a> with Ansible modules<\/a>.<\/p>

POAP is being used to configure and update devices once they are booted and come up without any configuration. It is a very convenient way to configure the fabric, add the devices and then just turn on the devices in the data center and everything gets configured automatically!<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t

\n\t\t\t\t
\n\t\t\t
Lab setup<\/h5>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\t\t

My entire environment is fully virtualized. I am running a virtual Nexus Dashboard<\/a> and CML (Cisco Modelling Labs)<\/a> to simulate my Nexus devices.<\/p>

If you want to replicate this setup as well, make sure to allocate enough resources for the Nexus Dashboard (16x vCPUs and 64GB RAM<\/strong>).
<\/strong>
https:\/\/www.cisco.com\/c\/en\/us\/td\/docs\/dcn\/nd\/2x\/deployment\/cisco-nexus-dashboard-deployment-guide-221\/nd-deploy-esx-22x.html<\/a><\/p>

As always I run the code in a GitLab CI\/CD pipeline and it is executed within a Docker container. The Docker container is stored in my own GitLab Docker registry. If you don’t know how to set up the GitLab server with a Docker registry, check out my previous article:<\/p>

GITLAB CI\/CD PIPELINE TO BUILD YOUR OWN DOCKER CONTAINER AND UPLOAD TO YOUR OWN REGISTRY \ud83d\udce6<\/a><\/div><\/div>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t
Docker container<\/h6>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\t\t

For this use case I am using a very basic Docker container with:<\/p>

  • Ansible<\/li>
  • Ansible lint<\/li>
  • Ansible Galaxy collection dcnm (the name of the previous version of NDFC)
    Cisco is a master in renaming products \ud83d\ude09<\/li><\/ul>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\tFROM ubuntu:22.04\r\n\r\nRUN apt-get update && \\\r\n  apt-get install -y gcc python3.11 git python3-pip ssh && \\\r\n  pip3 install --upgrade pip && \\\r\n  pip3 install ansible requests && \\\r\n  pip3 install jmespath && \\\r\n  pip3 install ansible-lint && \\ \r\n  ansible-galaxy collection install cisco.dcnm<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cdb57df elementor-widget elementor-widget-heading\" data-id=\"cdb57df\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h5 class=\"elementor-heading-title elementor-size-default\">Building the container in a pipeline<\/h5>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4c4ea92 elementor-widget elementor-widget-code-highlight\" data-id=\"4c4ea92\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-markup line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-markup\">\n\t\t\t\t\t<xmp>variables:\r\n  IMAGE_NAME: $CI_REGISTRY_IMAGE\/ndfc-automation  \r\n  IMAGE_TAG: \"1.0\"\r\n\r\nstages:\r\n  - build\r\n\r\nbuild_image:\r\n  stage: build\r\n  tags:\r\n    - shell-runner\r\n  script:\r\n    - docker build -t $IMAGE_NAME:$IMAGE_TAG .\r\n\r\npush_image:\r\n  stage: build\r\n  needs:\r\n    - build_image\r\n  tags:\r\n    - shell-runner\r\n  before_script:\r\n    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\r\n  script:\r\n    - docker push $IMAGE_NAME:$IMAGE_TAG<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d532f83 elementor-widget elementor-widget-heading\" data-id=\"d532f83\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h5 class=\"elementor-heading-title elementor-size-default\">Building the data model<\/h5>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e849cba elementor-widget elementor-widget-text-editor\" data-id=\"e849cba\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>As the base is set now, it is time to build the data model. If you create a BGP EVPN fabric there are a lot of variables you need to deal with. That&#8217;s why I created the following data model which I will load later into my Ansible playbook:<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2705235 elementor-widget elementor-widget-heading\" data-id=\"2705235\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\">fabric_settings.yaml:<\/h6>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0d0fb1e elementor-widget elementor-widget-text-editor\" data-id=\"0d0fb1e\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>To create the fabric I am using the Easy_Fabric template and left pretty much everything as a default value. The only values I changed are:<\/p><ul><li>Fabric name<\/li><li>BGP AS<\/li><li>Bootstrap settings (DHCP,Gateway)<\/li><\/ul>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-09d380a elementor-widget elementor-widget-code-highlight\" data-id=\"09d380a\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"2,5-6,197-200\" class=\"highlight-height language-markup line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-markup\">\n\t\t\t\t\t<xmp>---\nfabricName: BGP_EVPN_POAP\ntemplateName: Easy_Fabric\nnvPairs:\n  FABRIC_NAME: BGP_EVPN_POAP\n  BGP_AS: '65001'\n  UNDERLAY_IS_V6: 'false'\n  USE_LINK_LOCAL: false\n  V6_SUBNET_TARGET_MASK: ''\n  LINK_STATE_ROUTING: ospf\n  RR_COUNT: '2'\n  ANYCAST_GW_MAC: 2020.0000.00aa\n  PM_ENABLE: 'false'\n  BGP_AS_PREV: ''\n  PM_ENABLE_PREV: 'false'\n  ENABLE_FABRIC_VPC_DOMAIN_ID_PREV: ''\n  FABRIC_VPC_DOMAIN_ID_PREV: ''\n  LINK_STATE_ROUTING_TAG_PREV: ''\n  OVERLAY_MODE_PREV: ''\n  ENABLE_PVLAN_PREV: ''\n  FABRIC_MTU_PREV: '9216'\n  L2_HOST_INTF_MTU_PREV: '9216'\n  DEPLOYMENT_FREEZE: 'false'\n  INBAND_MGMT_PREV: 'false'\n  BOOTSTRAP_ENABLE_PREV: 'false'\n  MGMT_V6PREFIX: '64'\n  ENABLE_NETFLOW_PREV: ''\n  VPC_DELAY_RESTORE_TIME: '60'\n  FABRIC_TYPE: Switch_Fabric\n  ENABLE_AGENT: 'false'\n  AGENT_INTF: eth0\n  SSPINE_ADD_DEL_DEBUG_FLAG: Disable\n  BRFIELD_DEBUG_FLAG: Disable\n  ACTIVE_MIGRATION: 'false'\n  FF: Easy_Fabric\n  MSO_SITE_ID: ''\n  MSO_CONTROLER_ID: ''\n  MSO_SITE_GROUP_NAME: ''\n  PREMSO_PARENT_FABRIC: ''\n  MSO_CONNECTIVITY_DEPLOYED: ''\n  ANYCAST_RP_IP_RANGE_INTERNAL: ''\n  DHCP_START_INTERNAL: ''\n  DHCP_END_INTERNAL: ''\n  MGMT_GW_INTERNAL: ''\n  MGMT_PREFIX_INTERNAL: ''\n  BOOTSTRAP_MULTISUBNET_INTERNAL: ''\n  MGMT_V6PREFIX_INTERNAL: ''\n  DHCP_IPV6_ENABLE_INTERNAL: ''\n  UNNUM_DHCP_START_INTERNAL: ''\n  UNNUM_DHCP_END_INTERNAL: ''\n  ENABLE_EVPN: 'true'\n  FEATURE_PTP_INTERNAL: 'false'\n  SSPINE_COUNT: '0'\n  SPINE_COUNT: '0'\n  abstract_feature_leaf: base_feature_leaf_upg\n  abstract_feature_spine: base_feature_spine_upg\n  abstract_dhcp: base_dhcp\n  abstract_multicast: base_multicast_11_1\n  abstract_anycast_rp: anycast_rp\n  abstract_loopback_interface: int_fabric_loopback_11_1\n  abstract_isis: base_isis_level2\n  abstract_ospf: base_ospf\n  abstract_vpc_domain: base_vpc_domain_11_1\n  abstract_vlan_interface: int_fabric_vlan_11_1\n  abstract_isis_interface: isis_interface\n  abstract_ospf_interface: ospf_interface_11_1\n  abstract_pim_interface: pim_interface\n  abstract_route_map: route_map\n  abstract_bgp: base_bgp\n  abstract_bgp_rr: evpn_bgp_rr\n  abstract_bgp_neighbor: evpn_bgp_rr_neighbor\n  abstract_extra_config_leaf: extra_config_leaf\n  abstract_extra_config_spine: extra_config_spine\n  abstract_extra_config_tor: extra_config_tor\n  abstract_extra_config_bootstrap: extra_config_bootstrap_11_1\n  temp_anycast_gateway: anycast_gateway\n  temp_vpc_domain_mgmt: vpc_domain_mgmt\n  temp_vpc_peer_link: int_vpc_peer_link_po\n  abstract_routed_host: int_routed_host\n  abstract_trunk_host: int_trunk_host\n  L3VNI_MCAST_GROUP: ''\n  PHANTOM_RP_LB_ID1: ''\n  PHANTOM_RP_LB_ID2: ''\n  PHANTOM_RP_LB_ID3: ''\n  PHANTOM_RP_LB_ID4: ''\n  VPC_PEER_LINK_VLAN: '3600'\n  ENABLE_VPC_PEER_LINK_NATIVE_VLAN: 'false'\n  VPC_PEER_KEEP_ALIVE_OPTION: management\n  VPC_AUTO_RECOVERY_TIME: '360'\n  VPC_DELAY_RESTORE: '150'\n  VPC_PEER_LINK_PO: '500'\n  VPC_ENABLE_IPv6_ND_SYNC: 'true'\n  ADVERTISE_PIP_BGP: 'false'\n  ENABLE_FABRIC_VPC_DOMAIN_ID: 'false'\n  FABRIC_VPC_DOMAIN_ID: ''\n  FABRIC_VPC_QOS_POLICY_NAME: ''\n  BGP_LB_ID: '0'\n  NVE_LB_ID: '1'\n  ANYCAST_LB_ID: ''\n  LINK_STATE_ROUTING_TAG: UNDERLAY\n  OSPF_AUTH_KEY_ID: ''\n  OSPF_AUTH_KEY: ''\n  ISIS_LEVEL: ''\n  ISIS_P2P_ENABLE: false\n  ISIS_AUTH_ENABLE: false\n  ISIS_AUTH_KEYCHAIN_NAME: ''\n  ISIS_AUTH_KEYCHAIN_KEY_ID: ''\n  ISIS_AUTH_KEY: ''\n  ISIS_OVERLOAD_ENABLE: false\n  ISIS_OVERLOAD_ELAPSE_TIME: ''\n  BGP_AUTH_KEY_TYPE: ''\n  BGP_AUTH_KEY: ''\n  PIM_HELLO_AUTH_KEY: ''\n  BFD_IBGP_ENABLE: false\n  BFD_OSPF_ENABLE: false\n  BFD_ISIS_ENABLE: false\n  BFD_PIM_ENABLE: false\n  BFD_AUTH_ENABLE: false\n  BFD_AUTH_KEY_ID: ''\n  BFD_AUTH_KEY: ''\n  IBGP_PEER_TEMPLATE: ''\n  IBGP_PEER_TEMPLATE_LEAF: ''\n  default_vrf: Default_VRF_Universal\n  default_network: Default_Network_Universal\n  vrf_extension_template: Default_VRF_Extension_Universal\n  network_extension_template: Default_Network_Extension_Universal\n  OVERLAY_MODE: config-profile\n  ENABLE_PVLAN: 'false'\n  default_pvlan_sec_network: ''\n  FABRIC_MTU: '9216'\n  L2_HOST_INTF_MTU: '9216'\n  HOST_INTF_ADMIN_STATE: 'true'\n  POWER_REDUNDANCY_MODE: ps-redundant\n  COPP_POLICY: strict\n  HD_TIME: '180'\n  BROWNFIELD_NETWORK_NAME_FORMAT: Auto_Net_VNI$$VNI$$_VLAN$$VLAN_ID$$\n  BROWNFIELD_SKIP_OVERLAY_NETWORK_ATTACHMENTS: 'false'\n  CDP_ENABLE: 'false'\n  ENABLE_NGOAM: 'true'\n  ENABLE_TENANT_DHCP: 'true'\n  ENABLE_NXAPI: 'true'\n  ENABLE_PBR: 'false'\n  STRICT_CC_MODE: 'false'\n  AAA_REMOTE_IP_ENABLED: 'false'\n  SNMP_SERVER_HOST_TRAP: 'true'\n  ANYCAST_BGW_ADVERTISE_PIP: 'false'\n  PTP_LB_ID: ''\n  PTP_DOMAIN_ID: ''\n  MPLS_LB_ID: ''\n  TCAM_ALLOCATION: 'true'\n  DEAFULT_QUEUING_POLICY_CLOUDSCALE: ''\n  DEAFULT_QUEUING_POLICY_R_SERIES: ''\n  DEAFULT_QUEUING_POLICY_OTHER: ''\n  ENABLE_MACSEC: 'false'\n  MACSEC_KEY_STRING: ''\n  MACSEC_ALGORITHM: ''\n  MACSEC_FALLBACK_KEY_STRING: ''\n  MACSEC_FALLBACK_ALGORITHM: ''\n  MACSEC_CIPHER_SUITE: ''\n  MACSEC_REPORT_TIMER: ''\n  STP_ROOT_OPTION: unmanaged\n  STP_VLAN_RANGE: ''\n  MST_INSTANCE_RANGE: ''\n  STP_BRIDGE_PRIORITY: ''\n  EXTRA_CONF_LEAF: ''\n  EXTRA_CONF_SPINE: ''\n  EXTRA_CONF_TOR: ''\n  EXTRA_CONF_INTRA_LINKS: ''\n  STATIC_UNDERLAY_IP_ALLOC: 'false'\n  MPLS_LOOPBACK_IP_RANGE: ''\n  LOOPBACK0_IPV6_RANGE: ''\n  LOOPBACK1_IPV6_RANGE: ''\n  V6_SUBNET_RANGE: ''\n  ROUTER_ID_RANGE: ''\n  L2_SEGMENT_ID_RANGE: 30000-49000\n  L3_PARTITION_ID_RANGE: 50000-59000\n  NETWORK_VLAN_RANGE: 2300-2999\n  VRF_VLAN_RANGE: 2000-2299\n  SUBINTERFACE_RANGE: 2-511\n  VRF_LITE_AUTOCONFIG: Manual\n  AUTO_SYMMETRIC_VRF_LITE: false\n  AUTO_VRFLITE_IFC_DEFAULT_VRF: false\n  AUTO_SYMMETRIC_DEFAULT_VRF: false\n  DEFAULT_VRF_REDIS_BGP_RMAP: ''\n  DCI_SUBNET_RANGE: 10.33.0.0\/16\n  DCI_SUBNET_TARGET_MASK: '30'\n  SERVICE_NETWORK_VLAN_RANGE: 3000-3199\n  ROUTE_MAP_SEQUENCE_NUMBER_RANGE: 1-65534\n  DNS_SERVER_IP_LIST: ''\n  DNS_SERVER_VRF: ''\n  NTP_SERVER_IP_LIST: ''\n  NTP_SERVER_VRF: ''\n  SYSLOG_SERVER_IP_LIST: ''\n  SYSLOG_SEV: ''\n  SYSLOG_SERVER_VRF: ''\n  AAA_SERVER_CONF: ''\n  BOOTSTRAP_ENABLE: true\n  DHCP_START: 198.18.1.200\n  DHCP_END: 198.18.1.250\n  MGMT_GW: 198.18.1.1\n  SEED_SWITCH_CORE_INTERFACES: ''\n  SPINE_SWITCH_CORE_INTERFACES: ''\n  INBAND_DHCP_SERVERS: ''\n  UNNUM_BOOTSTRAP_LB_ID: ''\n  UNNUM_DHCP_START: ''\n  UNNUM_DHCP_END: ''\n  BOOTSTRAP_CONF: ''\n  enableRealTimeBackup: ''\n  enableScheduledBackup: ''\n  scheduledTime: ''\n  ENABLE_NETFLOW: 'false'\n  NETFLOW_EXPORTER_LIST: ''\n  NETFLOW_RECORD_LIST: ''\n  NETFLOW_MONITOR_LIST: ''\n  FABRIC_INTERFACE_TYPE: p2p\n  SUBNET_TARGET_MASK: '30'\n  REPLICATION_MODE: Multicast\n  VPC_DOMAIN_ID_RANGE: 1-1000\n  FABRIC_VPC_QOS: 'false'\n  OSPF_AREA_ID: 0.0.0.0\n  OSPF_AUTH_ENABLE: 'false'\n  BGP_AUTH_ENABLE: 'false'\n  BFD_ENABLE: 'false'\n  ENABLE_NXAPI_HTTP: 'true'\n  GRFIELD_DEBUG_FLAG: Disable\n  FEATURE_PTP: 'false'\n  MPLS_HANDOFF: 'false'\n  ENABLE_DEFAULT_QUEUING_POLICY: 'false'\n  LOOPBACK0_IP_RANGE: 10.2.0.0\/22\n  LOOPBACK1_IP_RANGE: 10.3.0.0\/22\n  SUBNET_RANGE: 10.4.0.0\/16\n  INBAND_MGMT: 'false'\n  MULTICAST_GROUP_SUBNET: 239.1.1.0\/25\n  ENABLE_TRM: 'false'\n  RP_COUNT: '2'\n  RP_MODE: asm\n  RP_LB_ID: '254'\n  PIM_HELLO_AUTH_ENABLE: 'false'\n  ANYCAST_RP_IP_RANGE: 10.254.254.0\/24\n  DHCP_ENABLE: true\n  ENABLE_AAA: 'false'\n  SITE_ID: '65001'\n  DHCP_IPV6_ENABLE: DHCPv4\n  BOOTSTRAP_MULTISUBNET: \"#Scope_Start_IP, Scope_End_IP, Scope_Default_Gateway, Scope_Subnet_Prefix\"\n  MGMT_PREFIX: '24'<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9d8b061 elementor-widget elementor-widget-heading\" data-id=\"9d8b061\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\">fabric_inventory.yaml:<\/h6>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1d86780 elementor-widget elementor-widget-text-editor\" data-id=\"1d86780\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>It also makes sense to create a separate file for the switch inventory details. The most important information is the <strong>serial number<\/strong> of the device as we need to map the correct role to each switch (Spine, Leaf, Border-Leaf etc.).\u00a0<\/p><p><strong>Make sure to have that information handy before starting with POAP!<\/strong><\/p><div>\u00a0<\/div>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e8c0d95 elementor-widget elementor-widget-code-highlight\" data-id=\"e8c0d95\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-markup line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-markup\">\n\t\t\t\t\t<xmp>---\r\ninventory_data:\r\n  switches:\r\n    - seed_ip: 198.18.1.151\r\n      user_name: admin\r\n      password: C1sco12345\r\n      role: spine\r\n      poap:\r\n        - serial_number: 9YW0T2HLH4A\r\n          model: 'N9K-C9300v'\r\n          version: '9.3(11)'\r\n          hostname: 'POAP-SPINE01'\r\n          config_data:\r\n            modulesModel: [N9K-X9364v, N9K-vSUP]\r\n            gateway: 198.18.1.1\/24\r\n    - seed_ip: 198.18.1.152\r\n      user_name: admin\r\n      password: C1sco12345\r\n      role: leaf\r\n      poap:\r\n        - serial_number: 9BH06YFWE60\r\n          model: 'N9K-C9300v'\r\n          version: '9.3(11)'\r\n          hostname: 'POAP-LEAF01'\r\n          config_data:\r\n            modulesModel: [N9K-X9364v, N9K-vSUP]\r\n            gateway: 198.18.1.1\/24\r\n    - seed_ip: 198.18.1.153\r\n      user_name: admin\r\n      password: C1sco12345\r\n      role: leaf\r\n      poap:\r\n        - serial_number: 9TPC3FV5ITL\r\n          model: 'N9K-C9300v'\r\n          version: '9.3(11)'\r\n          hostname: 'POAP-LEAF02'\r\n          config_data:\r\n            modulesModel: [N9K-X9364v, N9K-vSUP]\r\n            gateway: 198.18.1.1\/24<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-30a4548 elementor-widget elementor-widget-heading\" data-id=\"30a4548\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h5 class=\"elementor-heading-title elementor-size-default\">Building the playbok<\/h5>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-88f756f elementor-widget elementor-widget-text-editor\" data-id=\"88f756f\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>For the Ansible playbook, it just needs four different modules:<\/p><ul><li><strong>ansible.builtin.include_vars:<\/strong><br \/>Both defined yaml files needs to be loaded for the fabric and inventory data<\/li><li><strong>cisco.dcnm.dcnm_rest:<\/strong><br \/>This module is used to create the fabric using the fabric_settings by converting it into JSON payload<\/li><li><strong>ansible.builtin.pause:<br \/><\/strong>Once the fabric is created it will take some time in order to get the IP address from the DHCP server (in my case the NDFC controller) and the switches are visible in the POAP inventory.\u00a0<\/li><li><strong>cisco.dcnm.dcnm_inventory:<\/strong><br \/>The inventory module is used to add and provision the devices into the created fabric\u00a0<\/li><\/ul><p>\u00a0<\/p><p>Make sure that the following parameters are set in the ansible.cfg:\u00a0<\/p><div><div><strong>[persistent_connection]<\/strong><\/div><div><strong>connect_timeout = 100<\/strong><\/div><div><strong>command_timeout = 1800<\/strong><\/div><\/div><div>\u00a0<\/div><div>The execution of the provisioning process takes around <strong>10-15 minutes<\/strong> as the devices will reboot and NDFC will configure the devices. That&#8217;s why the command_timeout parameter needs to be adjusted.\u00a0<\/div>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-23d3c7e elementor-widget elementor-widget-code-highlight\" data-id=\"23d3c7e\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-markup line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-markup\">\n\t\t\t\t\t<xmp>---\r\n\r\n- name: Create fabric and pre-provision switches # Create fabric and pre-provision switches\r\n  hosts: ndfc_controller # ndfc_controller\r\n  gather_facts: false\r\n\r\n  tasks:\r\n    - name: Load fabric data # Load fabric data\r\n      ansible.builtin.include_vars:\r\n        file: data\/fabric_settings.yaml\r\n        name: fabric_settings\r\n\r\n    - name: Load inventory data # Load inventory data\r\n      ansible.builtin.include_vars:\r\n        file: data\/fabric_inventory.yaml\r\n        name: fabric_inventory\r\n\r\n    - name: Create template policy using Ansible # Create template policy using Ansible\r\n      cisco.dcnm.dcnm_rest:\r\n        method: POST\r\n        path: \/appcenter\/cisco\/ndfc\/api\/v1\/lan-fabric\/rest\/control\/fabrics\r\n        json_data: '{{ fabric_settings | to_json }}'\r\n\r\n    - name: Sleep # Sleep\r\n      ansible.builtin.pause:\r\n        seconds: 300\r\n\r\n    - name: Provision of switch Configuration # Provision switch configuration\r\n      cisco.dcnm.dcnm_inventory:\r\n        fabric: '{{ fabric_settings.fabricName }}'\r\n        state: merged\r\n        config: '{{ fabric_inventory.inventory_data.switches }}'<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2b935d3 elementor-widget elementor-widget-heading\" data-id=\"2b935d3\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h5 class=\"elementor-heading-title elementor-size-default\">Building the pipeline<\/h5>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3a77032 elementor-widget elementor-widget-text-editor\" data-id=\"3a77032\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>The pipeline itself is very simple and consists of three stages:<\/p><ul><li><strong>BUILD<br \/><\/strong>The Docker container will be created and uploaded to the GitLab Docker registry\u00a0<\/li><li><strong>LINTING<br \/><\/strong>Ansible playbook syntax will be checked against linting rules<\/li><li><strong>DEPLOY<br \/><\/strong>Ansible playbook will be executed<\/li><\/ul>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-14351bf elementor-widget elementor-widget-code-highlight\" data-id=\"14351bf\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-markup line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-markup\">\n\t\t\t\t\t<xmp>variables:\r\n  IMAGE_NAME: $CI_REGISTRY_IMAGE\/ndfc-automation  \r\n  IMAGE_TAG: \"1.0\"\r\n\r\nstages:\r\n  - build\r\n  - linting\r\n  - deploy\r\n\r\nbuild_image:\r\n  stage: build\r\n  tags:\r\n    - shell-runner\r\n  script:\r\n    - docker build -t $IMAGE_NAME:$IMAGE_TAG .\r\n\r\npush_image:\r\n  stage: build\r\n  needs:\r\n    - build_image\r\n  tags:\r\n    - shell-runner\r\n  before_script:\r\n    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\r\n  script:\r\n    - docker push $IMAGE_NAME:$IMAGE_TAG\r\n\r\nansible_linting:\r\n  stage: linting\r\n  needs:\r\n    - push_image\r\n  image: $IMAGE_NAME:$IMAGE_TAG\r\n  tags:\r\n    - docker-runner\r\n  before_script:\r\n    - cd ansible\r\n  script:\r\n    - ansible-lint deploy_provision_fabric.yaml\r\n\r\nansible_deploy:\r\n  stage: deploy\r\n  needs:\r\n    - ansible_linting\r\n  image: $IMAGE_NAME:$IMAGE_TAG\r\n  tags:\r\n    - docker-runner\r\n  before_script:\r\n    - cd ansible\r\n  script:\r\n    - ansible-playbook deploy_provision_fabric.yaml<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3a668e7 elementor-widget elementor-widget-heading\" data-id=\"3a668e7\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h5 class=\"elementor-heading-title elementor-size-default\">Run the pipeline<\/h5>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c3ab8ec elementor-widget elementor-widget-text-editor\" data-id=\"c3ab8ec\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Let&#8217;s run the pipeline and validate the process:<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f565e24 elementor-widget elementor-widget-text-editor\" data-id=\"f565e24\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>At first, the Ansible play will create the fabric:<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8473e94 elementor-widget elementor-widget-image\" data-id=\"8473e94\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_001.png\" data-elementor-open-lightbox=\"yes\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6MTU0NSwidXJsIjoiaHR0cDpcL1wvMTkyLjE2OC4xLjIxMzo4MDg4XC93cC1jb250ZW50XC91cGxvYWRzXC8yMDIzXC8wM1wvY2lzY28tbmRmYy16dHAtemVyby10b3VjaC1wcm92aXNpb25pbmctd2l0aC1hbnNpYmxlLWZvci1iZ3AtZXZwbi1mYWJyaWNzXzAwMS5wbmcifQ%3D%3D\">\n\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"800\" height=\"405\" src=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_001-1024x518.png\" class=\"attachment-large size-large wp-image-1545\" alt=\"\" srcset=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_001-1024x518.png 1024w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_001-300x152.png 300w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_001-768x388.png 768w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_001-1536x776.png 1536w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_001.png 2038w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1e588ab elementor-widget elementor-widget-text-editor\" data-id=\"1e588ab\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>After some time once the switches booted up, it will start with the POAP process and sends out DHCP request.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-86b15d8 elementor-widget elementor-widget-image\" data-id=\"86b15d8\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_002.png\" data-elementor-open-lightbox=\"yes\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6MTU0MSwidXJsIjoiaHR0cDpcL1wvMTkyLjE2OC4xLjIxMzo4MDg4XC93cC1jb250ZW50XC91cGxvYWRzXC8yMDIzXC8wM1wvY2lzY28tbmRmYy16dHAtemVyby10b3VjaC1wcm92aXNpb25pbmctd2l0aC1hbnNpYmxlLWZvci1iZ3AtZXZwbi1mYWJyaWNzXzAwMi5wbmcifQ%3D%3D\">\n\t\t\t\t\t\t\t<img decoding=\"async\" width=\"800\" height=\"243\" src=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_002-1024x311.png\" class=\"attachment-large size-large wp-image-1541\" alt=\"\" srcset=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_002-1024x311.png 1024w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_002-300x91.png 300w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_002-768x233.png 768w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_002-1536x466.png 1536w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_002.png 1878w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8946937 elementor-widget elementor-widget-text-editor\" data-id=\"8946937\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>As the fabric has the DHCP server option enabled and a range is assigned, the switches will receive an IP address.\u00a0<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-883cabc elementor-widget elementor-widget-image\" data-id=\"883cabc\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_003.png\" data-elementor-open-lightbox=\"yes\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6MTU0MCwidXJsIjoiaHR0cDpcL1wvMTkyLjE2OC4xLjIxMzo4MDg4XC93cC1jb250ZW50XC91cGxvYWRzXC8yMDIzXC8wM1wvY2lzY28tbmRmYy16dHAtemVyby10b3VjaC1wcm92aXNpb25pbmctd2l0aC1hbnNpYmxlLWZvci1iZ3AtZXZwbi1mYWJyaWNzXzAwMy5wbmcifQ%3D%3D\">\n\t\t\t\t\t\t\t<img decoding=\"async\" width=\"800\" height=\"242\" src=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_003-1024x310.png\" class=\"attachment-large size-large wp-image-1540\" alt=\"\" srcset=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_003-1024x310.png 1024w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_003-300x91.png 300w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_003-768x233.png 768w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_003-1536x466.png 1536w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_003.png 1880w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4257991 elementor-widget elementor-widget-text-editor\" data-id=\"4257991\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Once the switches become available, which will be after some minutes, they will be added to the fabric.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3c58b79 elementor-widget elementor-widget-image\" data-id=\"3c58b79\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_004.png\" data-elementor-open-lightbox=\"yes\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6MTU0MywidXJsIjoiaHR0cDpcL1wvMTkyLjE2OC4xLjIxMzo4MDg4XC93cC1jb250ZW50XC91cGxvYWRzXC8yMDIzXC8wM1wvY2lzY28tbmRmYy16dHAtemVyby10b3VjaC1wcm92aXNpb25pbmctd2l0aC1hbnNpYmxlLWZvci1iZ3AtZXZwbi1mYWJyaWNzXzAwNC5wbmcifQ%3D%3D\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"391\" src=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_004-1024x501.png\" class=\"attachment-large size-large wp-image-1543\" alt=\"\" srcset=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_004-1024x501.png 1024w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_004-300x147.png 300w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_004-768x376.png 768w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_004-1536x751.png 1536w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_004.png 2008w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-df0c8d0 elementor-widget elementor-widget-text-editor\" data-id=\"df0c8d0\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>The switches will download the python script from the NDFC server, configure basic connectivity like IP address and credentials and the switch will reboot.\u00a0<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7773129 elementor-widget elementor-widget-image\" data-id=\"7773129\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_005.png\" data-elementor-open-lightbox=\"yes\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6MTU0MiwidXJsIjoiaHR0cDpcL1wvMTkyLjE2OC4xLjIxMzo4MDg4XC93cC1jb250ZW50XC91cGxvYWRzXC8yMDIzXC8wM1wvY2lzY28tbmRmYy16dHAtemVyby10b3VjaC1wcm92aXNpb25pbmctd2l0aC1hbnNpYmxlLWZvci1iZ3AtZXZwbi1mYWJyaWNzXzAwNS5wbmcifQ%3D%3D\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"242\" src=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_005-1024x310.png\" class=\"attachment-large size-large wp-image-1542\" alt=\"\" srcset=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_005-1024x310.png 1024w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_005-300x91.png 300w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_005-768x233.png 768w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_005-1536x465.png 1536w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_005.png 1881w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-39c2e39 elementor-widget elementor-widget-text-editor\" data-id=\"39c2e39\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>The Ansible tasks wait for the switches to come back online to configure the &#8220;role&#8221; (Spine\/Leaf) related configurations. This process can take up to 10 &#8211; 15 minutes.\u00a0<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d2019c5 elementor-widget elementor-widget-image\" data-id=\"d2019c5\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_006.png\" data-elementor-open-lightbox=\"yes\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6MTUzOSwidXJsIjoiaHR0cDpcL1wvMTkyLjE2OC4xLjIxMzo4MDg4XC93cC1jb250ZW50XC91cGxvYWRzXC8yMDIzXC8wM1wvY2lzY28tbmRmYy16dHAtemVyby10b3VjaC1wcm92aXNpb25pbmctd2l0aC1hbnNpYmxlLWZvci1iZ3AtZXZwbi1mYWJyaWNzXzAwNi5wbmcifQ%3D%3D\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"400\" src=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_006-1024x512.png\" class=\"attachment-large size-large wp-image-1539\" alt=\"\" srcset=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_006-1024x512.png 1024w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_006-300x150.png 300w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_006-768x384.png 768w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_006-1536x768.png 1536w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_006.png 2010w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9b0289f elementor-widget elementor-widget-text-editor\" data-id=\"9b0289f\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Once the switches come back online, the config state is unknown. NDFC will sync this after a while.\u00a0<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5d3cc6e elementor-widget elementor-widget-image\" data-id=\"5d3cc6e\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_007.png\" data-elementor-open-lightbox=\"yes\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6MTUzOCwidXJsIjoiaHR0cDpcL1wvMTkyLjE2OC4xLjIxMzo4MDg4XC93cC1jb250ZW50XC91cGxvYWRzXC8yMDIzXC8wM1wvY2lzY28tbmRmYy16dHAtemVyby10b3VjaC1wcm92aXNpb25pbmctd2l0aC1hbnNpYmxlLWZvci1iZ3AtZXZwbi1mYWJyaWNzXzAwNy5wbmcifQ%3D%3D\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"393\" src=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_007-1024x503.png\" class=\"attachment-large size-large wp-image-1538\" alt=\"\" srcset=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_007-1024x503.png 1024w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_007-300x147.png 300w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_007-768x377.png 768w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_007-1536x754.png 1536w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_007.png 2015w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5a09373 elementor-widget elementor-widget-text-editor\" data-id=\"5a09373\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Once the config state is synced, NDFC will push the configuration to the switches.\u00a0<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bb31045 elementor-widget elementor-widget-image\" data-id=\"bb31045\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_008.png\" data-elementor-open-lightbox=\"yes\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6MTUzNywidXJsIjoiaHR0cDpcL1wvMTkyLjE2OC4xLjIxMzo4MDg4XC93cC1jb250ZW50XC91cGxvYWRzXC8yMDIzXC8wM1wvY2lzY28tbmRmYy16dHAtemVyby10b3VjaC1wcm92aXNpb25pbmctd2l0aC1hbnNpYmxlLWZvci1iZ3AtZXZwbi1mYWJyaWNzXzAwOC5wbmcifQ%3D%3D\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"389\" src=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_008-1024x498.png\" class=\"attachment-large size-large wp-image-1537\" alt=\"\" srcset=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_008-1024x498.png 1024w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_008-300x146.png 300w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_008-768x374.png 768w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_008-1536x747.png 1536w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_008.png 2016w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-546764a elementor-widget elementor-widget-text-editor\" data-id=\"546764a\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>You can see the process more in detail if you go back to the pipeline status. The Ansible module will:\u00a0<\/p><ul><li>Add the switches\u00a0<\/li><li>Wait to rediscover the devices<\/li><li>Assign the role<\/li><li>Saves the config\u00a0<\/li><li>Deploys the config to the devices<\/li><\/ul>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a0e3fa9 elementor-widget elementor-widget-image\" data-id=\"a0e3fa9\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_009.png\" data-elementor-open-lightbox=\"yes\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6MTUzNiwidXJsIjoiaHR0cDpcL1wvMTkyLjE2OC4xLjIxMzo4MDg4XC93cC1jb250ZW50XC91cGxvYWRzXC8yMDIzXC8wM1wvY2lzY28tbmRmYy16dHAtemVyby10b3VjaC1wcm92aXNpb25pbmctd2l0aC1hbnNpYmxlLWZvci1iZ3AtZXZwbi1mYWJyaWNzXzAwOS5wbmcifQ%3D%3D\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"398\" src=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_009-1024x510.png\" class=\"attachment-large size-large wp-image-1536\" alt=\"\" srcset=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_009-1024x510.png 1024w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_009-300x149.png 300w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_009-768x382.png 768w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_009-1536x765.png 1536w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_009.png 2009w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-188c085 elementor-widget elementor-widget-text-editor\" data-id=\"188c085\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>After a while, you should see that the entire pipeline was executed successfully. \ud83d\ude03<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7d1f2f6 elementor-widget elementor-widget-image\" data-id=\"7d1f2f6\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_010.png\" data-elementor-open-lightbox=\"yes\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6MTU0OSwidXJsIjoiaHR0cDpcL1wvMTkyLjE2OC4xLjIxMzo4MDg4XC93cC1jb250ZW50XC91cGxvYWRzXC8yMDIzXC8wM1wvY2lzY28tbmRmYy16dHAtemVyby10b3VjaC1wcm92aXNpb25pbmctd2l0aC1hbnNpYmxlLWZvci1iZ3AtZXZwbi1mYWJyaWNzXzAxMC5wbmcifQ%3D%3D\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"320\" src=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_010-1024x409.png\" class=\"attachment-large size-large wp-image-1549\" alt=\"\" srcset=\"http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_010-1024x409.png 1024w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_010-300x120.png 300w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_010-768x306.png 768w, http:\/\/192.168.1.213:8088\/wp-content\/uploads\/2023\/03\/cisco-ndfc-ztp-zero-touch-provisioning-with-ansible-for-bgp-evpn-fabrics_010.png 1436w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-93fc3c0 elementor-widget elementor-widget-heading\" data-id=\"93fc3c0\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h5 class=\"elementor-heading-title elementor-size-default\">References<\/h5>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0536f9f elementor-widget elementor-widget-text-editor\" data-id=\"0536f9f\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul><li><a href=\"https:\/\/www.cisco.com\/c\/en\/us\/products\/collateral\/cloud-systems-management\/prime-data-center-network-manager\/nb-06-ndfc-ds-cte-en.html\" target=\"_blank\" rel=\"noopener\">https:\/\/www.cisco.com\/c\/en\/us\/products\/collateral\/cloud-systems-management\/prime-data-center-network-manager\/nb-06-ndfc-ds-cte-en.html<\/a><\/li><li><a href=\"https:\/\/www.cisco.com\/site\/us\/en\/products\/networking\/cloud-networking\/nexus-platform\/index.html\" target=\"_blank\" rel=\"noopener\">https:\/\/www.cisco.com\/site\/us\/en\/products\/networking\/cloud-networking\/nexus-platform\/index.html<\/a><\/li><li><a href=\"https:\/\/github.com\/CiscoDevNet\/ansible-dcnm\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/CiscoDevNet\/ansible-dcnm<\/a><\/li><li><a href=\"https:\/\/www.cisco.com\/c\/en\/us\/products\/cloud-systems-management\/modeling-labs\/index.html\" target=\"_blank\" rel=\"noopener\">https:\/\/www.cisco.com\/c\/en\/us\/products\/cloud-systems-management\/modeling-labs\/index.html<\/a><\/li><\/ul>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cd7db16 elementor-widget elementor-widget-html\" data-id=\"cd7db16\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<script type=\"text\/javascript\">\n(function($) {\n    $(window).load(function() {\n        $('.token.entity').each(function() {\n            var title = $(this).attr('title');\n            $(this).html(title);\n        })\n    });\n})(jQuery);\n<\/script>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-fd9d08c elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"fd9d08c\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b1a6e7b\" data-id=\"b1a6e7b\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Table of Contents Introduction If you want to build BGP EVPN based Datacenter fabrics, Cisco&#8217;s answer is NDFC (Nexus Dashboard Fabric Controller). Cisco Nexus Dashboard Fabric Controller (NDFC) is a network automation and management solution offered by Cisco. NDFC provides a single dashboard for managing and automating network operations across multi-cloud, on-premises, and edge environments. [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":1478,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_lock_modified_date":false,"footnotes":""},"categories":[11,14],"tags":[],"class_list":["post-1475","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-automation","category-cisco-technologies"],"_links":{"self":[{"href":"http:\/\/192.168.1.213:8088\/wp-json\/wp\/v2\/posts\/1475"}],"collection":[{"href":"http:\/\/192.168.1.213:8088\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/192.168.1.213:8088\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/192.168.1.213:8088\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/192.168.1.213:8088\/wp-json\/wp\/v2\/comments?post=1475"}],"version-history":[{"count":76,"href":"http:\/\/192.168.1.213:8088\/wp-json\/wp\/v2\/posts\/1475\/revisions"}],"predecessor-version":[{"id":1669,"href":"http:\/\/192.168.1.213:8088\/wp-json\/wp\/v2\/posts\/1475\/revisions\/1669"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/192.168.1.213:8088\/wp-json\/wp\/v2\/media\/1478"}],"wp:attachment":[{"href":"http:\/\/192.168.1.213:8088\/wp-json\/wp\/v2\/media?parent=1475"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/192.168.1.213:8088\/wp-json\/wp\/v2\/categories?post=1475"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/192.168.1.213:8088\/wp-json\/wp\/v2\/tags?post=1475"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}