<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>NetDevOps and Automation on Dennis Mwangi</title><link>https://dennismwangi.com/series/netdevops-and-automation/</link><description>Recent content in NetDevOps and Automation on Dennis Mwangi</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 20 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://dennismwangi.com/series/netdevops-and-automation/index.xml" rel="self" type="application/rss+xml"/><item><title>NetDevOps Pipeline Part 5: Automated Verification and State Validation</title><link>https://dennismwangi.com/netdevops/state-validation/</link><pubDate>Mon, 20 Jul 2026 00:00:00 +0000</pubDate><guid>https://dennismwangi.com/netdevops/state-validation/</guid><description>&lt;p&gt;In Part 4 of this series, we decoupled our network intent from the execution logic, using Jinja2 templates and model-driven YANG schemas to push VPLS configurations to our Nokia SR OS nodes via NETCONF.&lt;/p&gt;
&lt;p&gt;But seeing a yellow &lt;code&gt;CHANGED&lt;/code&gt; status in your terminal is only half the battle. The ultimate question isn&amp;rsquo;t &lt;em&gt;&amp;ldquo;Did the configuration push successfully?&amp;rdquo;&lt;/em&gt;, it is &lt;strong&gt;&amp;ldquo;Is the service actually operational in the data plane?&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this fifth and final part of our series, we close the loop. We will look at how to treat network operational states as structured data, execute automated &lt;strong&gt;Pre-Checks vs. Post-Checks&lt;/strong&gt;, and build an immutable validation gate using Ansible assertions to guarantee compliance across our Containerlab fabric.&lt;/p&gt;</description></item><item><title>NetDevOps Pipeline Part 4: Decoupling Logic with Jinja2 and YANG</title><link>https://dennismwangi.com/netdevops/jinja2-and-yang/</link><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><guid>https://dennismwangi.com/netdevops/jinja2-and-yang/</guid><description>&lt;p&gt;In Part 3 of this series, we treated our physical network topology like software application code, using Containerlab to spin up our test sandbox in seconds.&lt;/p&gt;
&lt;p&gt;With our nodes live, &lt;strong&gt;how do we actually generate and push configurations to them?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you hardcode configuration blocks directly into your Ansible tasks, your playbooks quickly become unmanageable. The moment a VLAN ID changes, or you swap a router from a Nokia SR OS node to a Cisco instance, your entire automation framework collapses under its own weight.&lt;/p&gt;</description></item><item><title>NetDevOps Pipeline Part 3: Topology Orchestration with Containerlab</title><link>https://dennismwangi.com/netdevops/iac-containerlab/</link><pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate><guid>https://dennismwangi.com/netdevops/iac-containerlab/</guid><description>&lt;p&gt;Up until now, our pipeline has focused on the management and mapping of data. We modeled our nodes inside our NetBox source of truth (Part 1), and then we built a dynamic handshake to pull that data straight into Ansible (Part 2).&lt;/p&gt;
&lt;p&gt;But there’s a missing link: &lt;strong&gt;Where are the actual routers coming from?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If we have to manually spin up heavy virtual machines, map virtual interfaces, and configure bridge links every time we want to test our playbooks, we lose all the speed advantages of automation.&lt;/p&gt;</description></item><item><title>NetDevOps Pipeline Part 2: Building a Dynamic Inventory with Ansible and NetBox</title><link>https://dennismwangi.com/netdevops/ansible-netbox-integration/</link><pubDate>Mon, 29 Jun 2026 00:00:00 +0000</pubDate><guid>https://dennismwangi.com/netdevops/ansible-netbox-integration/</guid><description>&lt;p&gt;By default, Ansible relies on static inventory files (&lt;code&gt;hosts.ini&lt;/code&gt; or &lt;code&gt;hosts.yaml&lt;/code&gt;). In a dynamic, modern network environment, managing these text files manually becomes an operational nightmare.&lt;/p&gt;
&lt;p&gt;To bridge this gap, we can tie Ansible&amp;rsquo;s execution directly to NetBox, using it as our single source of truth. Before we configure the plugin, your local control machine needs the official NetBox collection along with its underlying Python API wrapper and timezone dependencies:&lt;/p&gt;</description></item><item><title>NetDevOps Pipeline Part 1: Initializing NetBox as your Network Source of Truth</title><link>https://dennismwangi.com/netdevops/netbox/</link><pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate><guid>https://dennismwangi.com/netdevops/netbox/</guid><description>&lt;p&gt;&lt;strong&gt;NetBox&lt;/strong&gt; is an open-source Infrastructure Resource Management tool designed to act as that single source of truth. It decouples your network state variables from both your configuration playbooks and your physical hardware.&lt;/p&gt;
&lt;p&gt;In this guide, we will deploy NetBox locally on Ubuntu and model a very simple set of infrastructural data.&lt;/p&gt;
&lt;div class="mermaid"&gt;graph LR
subgraph Truth [Data Layer]
NB[(NetBox)] -- "Host Variables &amp; State" --&gt; API[REST API / GraphQL]
end
subgraph Logic [Execution Layer]
API -- "Dynamic Inventory" --&gt; Ans{Ansible Engine}
end
subgraph Infrastructure [Network Layer]
Ans -- "SSH / Netconf" --&gt; R1[Nokia 7750 SR-1]
Ans -- "SSH / Netconf" --&gt; R2[Multi-Vendor Edge]
end
style NB fill:#2d3748,stroke:#4a5568,stroke-width:2px,color:#fff
style Ans fill:#1a202c,stroke:#e2e8f0,stroke-width:2px,color:#fff
style R1 fill:#2b6cb0,stroke:#4299e1,stroke-width:2px,color:#fff
style R2 fill:#2b6cb0,stroke:#4299e1,stroke-width:2px,color:#fff&lt;/div&gt;&lt;h2 id="1-system-architecture--dependencies"&gt;1. System Architecture &amp;amp; Dependencies&lt;/h2&gt;
&lt;p&gt;Before provisioning, we must understand NetBox&amp;rsquo;s application layers. It is not a single monolith; it is an ecosystem of decoupled components that work together over defined boundaries:&lt;/p&gt;</description></item></channel></rss>