{"id":16417,"date":"2025-12-15T12:19:24","date_gmt":"2025-12-15T12:19:24","guid":{"rendered":"https:\/\/dmsretail.com\/RetailNews\/two-new-ways-to-bring-netbox-into-your-cml-networks\/"},"modified":"2025-12-15T12:19:24","modified_gmt":"2025-12-15T12:19:24","slug":"two-new-ways-to-bring-netbox-into-your-cml-networks","status":"publish","type":"post","link":"https:\/\/dmsretail.com\/RetailNews\/two-new-ways-to-bring-netbox-into-your-cml-networks\/","title":{"rendered":"Two New Ways to Bring NetBox Into Your CML Networks"},"content":{"rendered":"<p> <p><a href=\"https:\/\/dmsretail.com\/online-workshops-list\/\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-496\" src=\"https:\/\/dmsretail.com\/RetailNews\/wp-content\/uploads\/2022\/05\/RETAIL-ONLINE-TRAINING-728-X-90.png\" alt=\"Retail Online Training\" width=\"729\" height=\"91\" srcset=\"https:\/\/dmsretail.com\/RetailNews\/wp-content\/uploads\/2022\/05\/RETAIL-ONLINE-TRAINING-728-X-90.png 729w, https:\/\/dmsretail.com\/RetailNews\/wp-content\/uploads\/2022\/05\/RETAIL-ONLINE-TRAINING-728-X-90-300x37.png 300w\" sizes=\"auto, (max-width: 729px) 100vw, 729px\" \/><\/a><\/p><br \/>\n<\/p>\n<div>\n<p>I had a very busy fall this year, and now I can\u2019t believe\u00a0<span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\">it\u2019s been three months since my last blog,\u00a0\u201cBringing Some Source of Truth to Your NetAI Agentic Playground.\u201d<\/span>\u00a0That\u2019s far longer than I had planned when I made my \u201cpublic accountability statement\u201d about my next blog post being about the work I had done to bring NetBox into my CML simulations in an easy and seamless fashion.<\/p>\n<p>But today, I\u2019m back. And eager to reveal two new contributions to the Cisco Modeling Labs (CML) community for your immediate use:<\/p>\n<ol>\n<li>A CML node and image definition for a NetBox server<\/li>\n<li>CML2NetBox, a Python utility that auto-populates NetBox based on a CML lab<\/li>\n<\/ol>\n<p>Let\u2019s dive into each of these options and see how they work!<\/p>\n<h2><strong>NetBox server node for Cisco Modeling Labs<\/strong><\/h2>\n<p>Not every CML network I build needs a NetBox server, but whenever I\u2019m working on a new network automation project, or something that involves creating a replica (or close replica) of our production network\u2014a \u201cdigital cousin,\u201d so to speak\u2014I will want to have a source of truth populated with data from the network simulation.<\/p>\n<p>In the past, I have manually populated NetBox with data using APIs, scripts, or CSV imports. However, these options aren\u2019t great, and they weren\u2019t part of the lab itself. That\u2019s where this new node definition comes in.<\/p>\n<p>Now I can simply drag the \u201cNetBox\u201d node into the topology and configure it to auto-populate from the CML lab definition itself.<\/p>\n<figure id=\"attachment_482449\" aria-describedby=\"caption-attachment-482449\" style=\"width: 800px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"lazy lazy-hidden wp-image-482449 size-full\" data-lazy-type=\"image\" src=\"https:\/\/blogs.cisco.com\/gcs\/ciscoblogs\/1\/2025\/12\/cmlnetbox-01.jpg\" alt=\"Showing the new NetBox node for CML in the web GUI\" width=\"800\" height=\"599\"\/><noscript><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-482449 size-full\" src=\"https:\/\/blogs.cisco.com\/gcs\/ciscoblogs\/1\/2025\/12\/cmlnetbox-01.jpg\" alt=\"Showing the new NetBox node for CML in the web GUI\" width=\"800\" height=\"599\"\/><\/noscript><figcaption id=\"caption-attachment-482449\" class=\"wp-caption-text\">Adding NetBox to a network topology in CML<\/figcaption><\/figure>\n<p>After that, just start the lab, and the node will read the CML lab information and automatically create sites, devices, IP addresses, and even cables connecting interfaces across all nodes in the topology.<\/p>\n<p>\u00a0<\/p>\n<figure id=\"attachment_482451\" aria-describedby=\"caption-attachment-482451\" style=\"width: 1024px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"lazy lazy-hidden size-large wp-image-482451\" data-lazy-type=\"image\" src=\"https:\/\/blogs.cisco.com\/gcs\/ciscoblogs\/1\/2025\/12\/cmlnetbox-02-1024x817.jpg\" alt=\"Showing the NetBox web interface with data auto populated from CML\" width=\"1024\" height=\"817\"\/><noscript><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-482451\" src=\"https:\/\/blogs.cisco.com\/gcs\/ciscoblogs\/1\/2025\/12\/cmlnetbox-02-1024x817.jpg\" alt=\"Showing the NetBox web interface with data auto populated from CML\" width=\"1024\" height=\"817\"\/><\/noscript><figcaption id=\"caption-attachment-482451\" class=\"wp-caption-text\">NetBox data matches the CML topology<\/figcaption><\/figure>\n<p>Pretty neat, right? For those of you interested in some technical details, let\u2019s dive in a little deeper.<\/p>\n<p>First up, the node definition, or more accurately, the\u00a0<em><strong>image definition<\/strong><\/em> that has been built and shared, is based on the Alpine 3.21 image included on the CML 2.9 reference platform. The NetBox-Docker project was then used to deploy NetBox Community v4.4.5.<\/p>\n<p>This NetBox server is intended to run within CML as part of lab topologies, and I wanted it to be very easy to use in these labs. So I made some \u201copinionated\u201d choices in its configuration.<\/p>\n<p>To align with other default credentials for nodes within CML, the admin user for NetBox has been pre-created with a username and password of <strong>cisco<\/strong>.<\/p>\n<p>I also created an API token \u201c<strong>0123456789012345678901234567890123456789<\/strong>\u201d for this user. (You are welcome to change these default credentials after you start the node, but having an admin account and API access available at node startup lets you get started with your network automation work immediately without needing to set up NetBox yourself.)<\/p>\n<p>In addition, I have pre-populated a\u00a0<strong>Manufacturer<\/strong> called \u201cCML\u201d along with\u00a0<strong>Device Types<\/strong> for each of the CML node types in the reference platform, as well as several additional node definitions from the cml-community and my personal use. Having them pre-created speeds up adding devices to NetBox. However, if you have a node definition that is NOT included in the base image, don\u2019t worry. The code that populates NetBox will dynamically create new <strong>Device Types<\/strong> as needed.<\/p>\n<p>While I worked to make using the NetBox node as easy as possible, there are requirements for adding it to a lab so it can access the CML lab details to populate NetBox. I\u2019ve provided full details in the CML Community README for the node, and I encourage you to read them when you set up the new node on your own CML server. I\u2019ll cover the highlights here as well.<\/p>\n<p>For starters, the NetBox node will need connectivity to the CML server\u2019s REST API through an \u201cexternal connector\u201d node. It can be either a bridge or a NAT-based external connector; however, for a NAT-based connector, you need to update a firewall rule in the CML Cockpit interface first. Full details on the change required and why are documented in the README.<\/p>\n<p>Next, you\u2019ll need to update the default CONFIG for the node with details for your CML server and the lab you want to synchronize with. The default day 0 config provided with the node includes detailed comments I left to help users understand the options and how to use the node. You\u2019ll find optional blocks for customizing the server\u2019s network configuration, but to automatically populate NetBox from CML, you\u2019ll need to uncomment and provide details for a set of environment variables.<\/p>\n<pre># export VIRL2_URL=https:\/\/192.168.255.1&#13;\n# export VIRL2_USER=admin&#13;\n# export VIRL2_PASS=1234QWer&#13;\n# export VIRL2_VERIFY_SSL=False&#13;\n# export LAB_NAME=\"My CML Lab\"&#13;\n&#13;\n<\/pre>\n<p>These values are needed because, while the NetBox server runs on the CML server, there is no way for the node to automatically \u201cknow\u201d these details about the server. So we provide them as ENVs so the scripts that connect to CML know the address, credentials, and which lab on the CML server to synchronize with. I expect that you\u2019ll synchronize the same lab that the NetBox node is running on, but you don\u2019t have to.\u00a0 You could synchronize any lab from the CML server.<\/p>\n<p>Speaking of scripts, you\u2019ll see references to two scripts at the end of the configuration. These scripts first ensure NetBox is up and running, then connect to and sync from CML. The output from both of these scripts is saved on the node in two log files that you can review after the node finishes booting. Just connect to the NetBox server\u2019s console and review the contents of the files.<\/p>\n<pre>((.venv) ) netbox-server:~$ cat startup_log.txt &#13;\n&#13;\nChecking if NetBox (http:\/\/localhost) is responding...&#13;\nSite not responding, waiting 5 seconds... (attempt 1\/48)&#13;\n.&#13;\nSite not responding, waiting 5 seconds... (attempt 14\/48)&#13;\nSite is responding! (attempt 15)&#13;\n&#13;\nChecking if CML Controller (https:\/\/192.168.255.1) is reachable...&#13;\nSite is responding! (attempt 1)&#13;\n&#13;\nWriting VIRL2 environment variables to \/home\/cisco\/.profile...&#13;\nAttempting to sync topology to NetBox...&#13;\n\ud83d\udd04 Starting lab topology synchronization...&#13;\n\ud83d\udce1 CML Server: https:\/\/192.168.255.1&#13;\n\ud83d\uddc4\ufe0f  NetBox Server: http:\/\/localhost&#13;\n\ud83e\uddea Lab Name: Example NetBox Server Topology&#13;\n&#13;\nBeginning lab synchronization now.&#13;\nAdding 6 nodes from CML lab 'Example NetBox Server Topology' to NetBox&#13;\n\ud83d\udcca Processed 5\/6 devices...&#13;\nAdding cables for 6 nodes from CML lab 'Example NetBox Server Topology' to NetBox&#13;\n\ud83d\udcca Processed cables for 5\/6 devices...&#13;\n&#13;\nTopology synced successfully.&#13;\n<\/pre>\n<p>While you are on the console, you can re-run the sync like this.<\/p>\n<pre>((.venv) ) netbox-server:~$ cml2netbox sync lab&#13;\n&#13;\n\ud83d\udd04 Starting lab topology synchronization...&#13;\n\ud83d\udce1 CML Server: https:\/\/192.168.255.1&#13;\n\ud83d\uddc4\ufe0f NetBox Server: http:\/\/localhost&#13;\n\ud83e\uddea Lab Name: Example NetBox Server Topology&#13;\nBeginning lab synchronization now.&#13;\nAdding 7 nodes from CML lab 'Example NetBox Server Topology' to NetBox&#13;\n\ud83d\udcca Processed 5\/7 devices...&#13;\nAdding cables for 7 nodes from CML lab 'Example NetBox Server Topology' to NetBox&#13;\n\ud83d\udcca Processed cables for 5\/7 devices...<\/pre>\n<p>You might wonder why you would want to re-run the sync? If you add more nodes to the CML topology after it starts, or add links between devices, those changes will be automatically added to NetBox.\u00a0 If you\u2019ve deleted nodes or cables, the script won\u2019t clean those out; you\u2019ll need to delete them manually.<\/p>\n<p>And you might also wonder what\u00a0<span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\"><strong>cml2netbox is<\/strong><\/span>? Well, that is the underlying \u201cmagic\u201d that makes this node work. And it is the subject we\u2019re going to talk about next!<\/p>\n<h2><strong>CML2NetBox: A Python utility for EVERYONE!<\/strong><\/h2>\n<p>I realize that some of you might want your CML lab data in NetBox, but not in a NetBox instance running in the CML lab; rather, in a NetBox server you already have running. If that sounds like you, then don\u2019t fret, just <strong>pip install cml2netbox<\/strong> and have fun!<\/p>\n<p>The truth is that the NetBox server node\u00a0<span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\">uses\u00a0<strong>cml2netbox<\/strong> under the hood; it\u2019s packaged directly into the node\/image definition and automatically configured and run during<\/span> node initialization. But now let\u2019s look at how we can use the utility directly.<\/p>\n<p>Similar to the node configuration, you\u2019ll need to provide values for the CML server you\u2019ll be synchronizing from, and you will also need to configure the details for the NetBox server you\u2019ll be synchronizing to.\u00a0<span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\">An\u00a0example .env file is\u00a0<\/span>provided with the code on GitHub.<\/p>\n<pre># CML2NetBox Configuration Example&#13;\n# Copy this file to .env and fill in your values&#13;\n&#13;\n# CML Lab Details&#13;\nLAB_NAME=\"Your CML Lab\"&#13;\nLAB_ID=\"your-lab-id-uuid-if-needed\"&#13;\n&#13;\n# CML Server Configuration&#13;\n# Can also use VIRL2_* variants for backward compatibility&#13;\nCML2_URL=https:\/\/your-cml-server.example.com&#13;\nCML2_USER=your-username&#13;\nCML2_PASS=your-password&#13;\nCML2_VERIFY_SSL=True&#13;\n&#13;\n# NetBox Server Configuration&#13;\nNETBOX_URL=https:\/\/your-netbox-server.example.com&#13;\nNETBOX_API_TOKEN=your-api-token-here&#13;\nNETBOX_VERIFY_SSL=True&#13;\n<\/pre>\n<p>Just copy this file and provide the data for your own servers.<\/p>\n<p>For completeness\u2019 sake, you can also provide all this data as\u00a0<span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\">command-line options when running\u00a0<strong>cml2netbox<\/strong>, but I find setting them in a file is simpler than typing them every time I <\/span>run the command.<\/p>\n<p>Let\u2019s see what options exist for the tool.<\/p>\n<pre>cml2netbox sync --help&#13;\nUsage: cml2netbox sync [OPTIONS] COMMAND [ARGS]...&#13;\n&#13;\n  Synchronization commands for CML and NetBox integration.&#13;\n&#13;\nOptions:&#13;\n  --help  Show this message and exit.&#13;\n&#13;\nCommands:&#13;\n  device-types  Sync CML device types with NetBox device types.&#13;\n  lab           Sync CML lab topology with NetBox.<\/pre>\n<p>There are two options. Nice.<\/p>\n<p>You can \u201cprepare\u201d a NetBox server by creating the CML manufacturer and device types for all node definitions with <strong>cml2netbox sync device-types<\/strong>. However, this isn\u2019t required. If you run <strong>cml2netbox sync lab<\/strong> before syncing the device types, the tool will create device types for each node in the lab. This will take a little longer the first time, as new device-types are created. But it does mean only the required device types will be created.<\/p>\n<p>But the real fun comes when you sync a lab like this.<\/p>\n<pre>cml2netbox sync lab&#13;\n&#13;\n\ud83d\udd04 Starting lab topology synchronization...&#13;\n\ud83d\udce1 CML Server: https:\/\/100.75.36.232&#13;\n\ud83d\uddc4\ufe0f  NetBox Server: http:\/\/100.75.36.232:6999&#13;\n\ud83e\uddea Lab Name: CCNA Prep 2025 S3E3 Advanced ACL Exploration&#13;\nBeginning lab synchronization now.&#13;\nAdding 8 nodes from CML lab 'CCNA Prep 2025 S3E3 Advanced ACL Exploration' to NetBox&#13;\n\ud83d\udcca Processed 5\/8 devices...&#13;\nAdding cables for 8 nodes from CML lab 'CCNA Prep 2025 S3E3 Advanced ACL Exploration' to NetBox&#13;\n<\/pre>\n<p>In this example, I synchronized a 2nd CML lab from the topology above into the NetBox server to demonstrate what happens when you sync multiple CML labs into the same NetBox server and how they are differentiated.<\/p>\n<figure id=\"attachment_482465\" aria-describedby=\"caption-attachment-482465\" style=\"width: 800px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"lazy lazy-hidden size-full wp-image-482465\" data-lazy-type=\"image\" src=\"https:\/\/blogs.cisco.com\/gcs\/ciscoblogs\/1\/2025\/12\/cmlnetbox-03.jpg\" alt=\"Sites view of the NetBox web interface showing two sites, one for each CMl topology synchronized.\" width=\"800\" height=\"596\"\/><noscript><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-482465\" src=\"https:\/\/blogs.cisco.com\/gcs\/ciscoblogs\/1\/2025\/12\/cmlnetbox-03.jpg\" alt=\"Sites view of the NetBox web interface showing two sites, one for each CMl topology synchronized.\" width=\"800\" height=\"596\"\/><\/noscript><figcaption id=\"caption-attachment-482465\" class=\"wp-caption-text\">Each CML topology corresponds to a NetBox Site<\/figcaption><\/figure>\n<p>CML2NetBox will create a new NetBox <strong>Site<\/strong> for each CML lab synchronized.\u00a0 This means that you can use a single NetBox server to hold data from 1, 10, or even 100 CML topologies!<\/p>\n<p>And one last note\u2026 cml2netbox will create a .log file for each run of the tool. By default, the logging level is INFO, but if you run in \u201cverbose\u201d mode, you\u2019ll get DEBUG level logging in the file. This can be helpful if\/when something goes wrong in a sync job, so you can figure out what happened. In my testing, this most often happens when you have multiple labs on a single NetBox server and encounter duplicate or conflicting objects.<\/p>\n<pre>cml2netbox -v sync lab&#13;\n&#13;\ntail -n 10 .\/20251202-140246-cml2netbox.log&#13;\n&#13;\n&#13;\n2025-12-02 14:03:13 - httpcore.http11 - DEBUG - response_closed.started&#13;\n2025-12-02 14:03:13 - httpcore.http11 - DEBUG - response_closed.complete&#13;\n2025-12-02 14:03:13 - urllib3.connectionpool - DEBUG - http:\/\/100.75.36.232:6999 \"GET \/api\/dcim\/devices\/?name=server-sw&amp;site_id=2&amp;limit=0 HTTP\/1.1\" 200 1924&#13;\n2025-12-02 14:03:13 - urllib3.connectionpool - DEBUG - http:\/\/100.75.36.232:6999 \"GET \/api\/dcim\/interfaces\/?device_id=14&amp;name=port0&amp;limit=0 HTTP\/1.1\" 200 2333&#13;\n2025-12-02 14:03:13 - cml2netbox_pkg.netbox_helpers - INFO - Interface port0 already has a cable: 11&#13;\n2025-12-02 14:03:13 - cml2netbox_pkg.netbox_helpers - INFO - No cables created for node server-sw&#13;\n2025-12-02 14:03:13 - cml2netbox_pkg.netbox_helpers - INFO - Connecting cables for CML node setup-installation&#13;\n2025-12-02 14:03:13 - cml2netbox_pkg.netbox_helpers - DEBUG - Skipping link where current node is not interface_a&#13;\n2025-12-02 14:03:13 - cml2netbox_pkg.netbox_helpers - INFO - No cables created for node setup-installation&#13;\n2025-12-02 14:03:13 - cml2netbox_pkg.cli - INFO - Completed synchronization of 8 nodes to NetBox&#13;\n<\/pre>\n<h2><strong>And done!<\/strong><\/h2>\n<p>Let it not be said that Hank doesn\u2019t keep his promises\u2026 it just might take me 3 months to get to it \ud83d\ude09<\/p>\n<p>Anyway, I hope you enjoyed this blog post, and even more so, that you take advantage of one or both of the options I shared.<\/p>\n<p>If you are new to CML, please check out Introduction to Network Simulations with Cisco Modeling Labs | CMLLAB Learning Path in Cisco U.\u00a0 You can also get started with Cisco Modeling Labs \u2013 Free Edition quick and easy.<\/p>\n<p>Until next time!<\/p>\n<p style=\"text-align: center;\"><iframe class=\"lazy lazy-hidden\" loading=\"lazy\" title=\"Everything You Need to Know About Cisco Modeling Labs (CML)\" width=\"640\" height=\"360\" data-lazy-type=\"iframe\" data-src=\"https:\/\/www.youtube-nocookie.com\/embed\/j0ndqddtrB8?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen=\"\"><\/iframe><noscript><iframe loading=\"lazy\" title=\"Everything You Need to Know About Cisco Modeling Labs (CML)\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube-nocookie.com\/embed\/j0ndqddtrB8?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen=\"\"><\/iframe><\/noscript><\/p>\n<p style=\"text-align: center;\" data-ttstextid=\"38\">Sign up for\u00a0Cisco U.\u00a0| Join the\u202f\u00a0Cisco Learning Network\u202ftoday for free.<\/p>\n<blockquote data-ttstextid=\"39\">\n<h2 style=\"text-align: center;\" data-ttstextid=\"40\"><strong>Learn with Cisco<\/strong><\/h2>\n<h4 style=\"text-align: center;\" data-ttstextid=\"41\"><strong><a href=\"https:\/\/twitter.com\/LearningatCisco\" target=\"_blank\" rel=\"noopener\">X<\/a>\u202f|\u202fThreads\u00a0|\u00a0Facebook\u202f|\u202fLinkedIn\u202f|\u202fInstagram<\/strong><strong>\u202f|\u202fYouTube<\/strong><\/h4>\n<\/blockquote>\n<p style=\"text-align: center;\" data-ttstextid=\"42\">Use\u202f\u00a0<strong>#CiscoU\u00a0<\/strong>and\u00a0<strong>#CiscoCert<\/strong>\u202fto join the conversation.<\/p>\n<blockquote class=\"wp-embedded-content\" data-secret=\"ayw3f80i4l\">\n<p>Speak Your Lab into Existence with AI-Driven Cisco Modeling Labs and MCP<\/p>\n<\/blockquote>\n<p><iframe loading=\"lazy\" class=\"lazy lazy-hidden wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"\u201cSpeak Your Lab into Existence with AI-Driven Cisco Modeling Labs and MCP\u201d \u2014 Cisco Blogs\" data-lazy-type=\"iframe\" data-src=\"https:\/\/blogs.cisco.com\/learning\/speak-your-lab-into-existence-with-ai-driven-cisco-modeling-labs-and-mcp\/embed#?secret=zlneIIO29K#?secret=ayw3f80i4l\" data-secret=\"ayw3f80i4l\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe><noscript><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"\u201cSpeak Your Lab into Existence with AI-Driven Cisco Modeling Labs and MCP\u201d \u2014 Cisco Blogs\" src=\"https:\/\/blogs.cisco.com\/learning\/speak-your-lab-into-existence-with-ai-driven-cisco-modeling-labs-and-mcp\/embed#?secret=zlneIIO29K#?secret=ayw3f80i4l\" data-secret=\"ayw3f80i4l\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe><\/noscript><\/p>\n<blockquote class=\"wp-embedded-content\" data-secret=\"6GwO7fdiXE\">\n<p>Using CI\/CD Pipelines for Infrastructure Configuration and Management<\/p>\n<\/blockquote>\n<p><iframe loading=\"lazy\" class=\"lazy lazy-hidden wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"\u201cUsing CI\/CD Pipelines for Infrastructure Configuration and Management\u201d \u2014 Cisco Blogs\" data-lazy-type=\"iframe\" data-src=\"https:\/\/blogs.cisco.com\/developer\/gitlabcicdpipelines01\/embed#?secret=3GaimIF1gj#?secret=6GwO7fdiXE\" data-secret=\"6GwO7fdiXE\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe><noscript><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"\u201cUsing CI\/CD Pipelines for Infrastructure Configuration and Management\u201d \u2014 Cisco Blogs\" src=\"https:\/\/blogs.cisco.com\/developer\/gitlabcicdpipelines01\/embed#?secret=3GaimIF1gj#?secret=6GwO7fdiXE\" data-secret=\"6GwO7fdiXE\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe><\/noscript><\/p>\n<\/p><\/div>\n<p><script async src=\"\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><script async defer src=\"https:\/\/platform.instagram.com\/en_US\/embeds.js\"><\/script><br \/>\n<br \/><p><a href=\"https:\/\/dmsretail.com\/online-workshops-list\/\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-496\" src=\"https:\/\/dmsretail.com\/RetailNews\/wp-content\/uploads\/2022\/05\/RETAIL-ONLINE-TRAINING-728-X-90.png\" alt=\"Retail Online Training\" width=\"729\" height=\"91\" srcset=\"https:\/\/dmsretail.com\/RetailNews\/wp-content\/uploads\/2022\/05\/RETAIL-ONLINE-TRAINING-728-X-90.png 729w, https:\/\/dmsretail.com\/RetailNews\/wp-content\/uploads\/2022\/05\/RETAIL-ONLINE-TRAINING-728-X-90-300x37.png 300w\" sizes=\"auto, (max-width: 729px) 100vw, 729px\" \/><\/a><\/p><br \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I had a very busy fall this year, and now I can\u2019t believe\u00a0it\u2019s been three months since my last blog,\u00a0\u201cBringing Some Source of Truth to [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":16418,"comment_status":"","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-16417","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology"],"_links":{"self":[{"href":"https:\/\/dmsretail.com\/RetailNews\/wp-json\/wp\/v2\/posts\/16417","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dmsretail.com\/RetailNews\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dmsretail.com\/RetailNews\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dmsretail.com\/RetailNews\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dmsretail.com\/RetailNews\/wp-json\/wp\/v2\/comments?post=16417"}],"version-history":[{"count":0,"href":"https:\/\/dmsretail.com\/RetailNews\/wp-json\/wp\/v2\/posts\/16417\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dmsretail.com\/RetailNews\/wp-json\/wp\/v2\/media\/16418"}],"wp:attachment":[{"href":"https:\/\/dmsretail.com\/RetailNews\/wp-json\/wp\/v2\/media?parent=16417"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dmsretail.com\/RetailNews\/wp-json\/wp\/v2\/categories?post=16417"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dmsretail.com\/RetailNews\/wp-json\/wp\/v2\/tags?post=16417"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}