<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Jason Edelman's Blog</title>
    <atom:link href="https://jedelman.com/feed.xml" rel="self" type="application/rss+xml"/>
    <link>https://jedelman.com/</link>
    <description>Focused on networking, from the past to the present: SDN, Automation, and DevOps.</description>
    <pubDate>Mon, 24 Jul 2023 01:07:06 +0000</pubDate>
    
      <item>
      <title>Automated Testing &amp; Intent Verification for Network Operations</title>
      <link>https://jedelman.com/home/automated-testing-intent-verfication-for-network-operations/</link>
      <guid isPermaLink="true">https://jedelman.com/home/automated-testing-intent-verfication-for-network-operations/</guid>
      <description>&lt;p&gt;The most important part of writing quality software is testing.  Writing unit tests provide assurance the changes you’re making aren’t going to break anything in your software application.  Sounds pretty great, right?  Why is it that in networking operations we’re still mainly using ping, traceroute, and human verification for network validation and testing?&lt;/p&gt;

&lt;h1 id=&quot;the-network-is-the-application&quot;&gt;The Network is the Application&lt;/h1&gt;

&lt;p&gt;I’ve written in the past that deploying configurations faster, or more generally, configuration management, is just one small piece of what network automation is.  A major component much less talked about is automated testing.  Automated testing starts with data collection and quickly evolves to include verification.  It’s quite a simple idea and one that &lt;a href=&quot;http://networktocode.com&quot;&gt;we&lt;/a&gt; recommend as the best place to start with automation as it’s much more risk adverse to &lt;em&gt;deploying configurations faster&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In our example, the network is the application, and &lt;em&gt;unit tests&lt;/em&gt; need to be written to verify &lt;em&gt;our application&lt;/em&gt; (as network operators) has valid configurations before each change is implemented, but also integrations tests are needed to ensure &lt;em&gt;our application&lt;/em&gt; is operating as expected after each change.&lt;/p&gt;

&lt;h1 id=&quot;diy-testing&quot;&gt;DIY Testing&lt;/h1&gt;

&lt;p&gt;If you choose to go down the DIY path for network automation, which could involve using an open source framework as a foundation, e.g. Salt, Ansible, Puppet, you may also go down the path of writing tests manually.  The types of tests that you should be using for production network changes are limitless from verifying neighbors to the quantity routes to even more basic things such as MTU consistency and the enforcement of Enterprise standards for names and descriptions.  Writing these tests to verify your intent is no easy feat.  It’ll take time and dedicated resources for each part of your network.&lt;/p&gt;

&lt;h1 id=&quot;commercial-testing-platforms&quot;&gt;Commercial Testing Platforms&lt;/h1&gt;

&lt;p&gt;On the other hand, if you prefer to have a hand to shake, or throat to choke, you may also want to consider platforms such as Forward Networks or Veriflow.  I recently saw Veriflow at the latest Networking Field Day and Forward at ONUG.  Veriflow has dozens of built-in consistency and intent-checks–they basically collect the output of operational show commands and offer a platform to define automated tests/checks against that data.  If I must admit, Veriflow was one of my favorite presentations of the NFD event.  It’s worth noting that everything they offer is also exposed via a RESTful API.&lt;/p&gt;

&lt;h1 id=&quot;from-api-to-platform-integrations&quot;&gt;From API to Platform Integrations&lt;/h1&gt;

&lt;p&gt;These types of vendors that are focused on intent-based verification need to provide more than an API though.  In conversations with both companies, the focus is using the UI and doesn’t fully reflect an API-first strategy.  We haven’t quite crossed the chasm of network automation going main stream, but as they say, skate to where the puck is going, not where it is.  What do I mean by this?&lt;/p&gt;

&lt;p&gt;In the network automation space, the puck is heading to leveraging CI/CD pipelines for network operations.  This means companies need integrations, not just APIs (same as I’ve said in the past about network vendors touting APIs).  In this case, companies have the opportunity to be CI platforms for the network.  This could be in the form of git integrations, e.g. just like Travis has a native plug-in to GitHub.  Think about describing your tests in a YAML config file stored in a repo that triggers Veriflow tests when ever a pull request is opened.  Think about doing a deployment with Ansible, but having Ansible trigger post-deployment verification tests (if you aren’t already writing your own tests with Ansible).&lt;/p&gt;

&lt;h1 id=&quot;closing&quot;&gt;Closing&lt;/h1&gt;

&lt;p&gt;The truth is all of that is possible today, but wouldn’t it be nice if there were native integrations available so that everyone wasn’t re-inventing the wheel?&lt;/p&gt;

&lt;p&gt;The network automation space and its surrounding ecosystem of tools is still in its infancy and I truly look forward to its future.&lt;/p&gt;

&lt;p&gt;Thanks,&lt;/p&gt;

&lt;p&gt;Jason (@jedelman8)&lt;/p&gt;

</description>
      <pubDate>Mon, 23 Oct 2017 00:00:00 +0000</pubDate>
      </item>
    
      <item>
      <title>Arista's Programmability Strategy</title>
      <link>https://jedelman.com/home/aristas-programmability-strategy/</link>
      <guid isPermaLink="true">https://jedelman.com/home/aristas-programmability-strategy/</guid>
      <description>&lt;p&gt;Arista is largely known for its operating system, best known as EOS.  Arista has been known to deploy new features at a more rapid pace than other vendors and to have a more open OS–since EOS was the first production-grade network network operating system to expose any form of Linux to end users.&lt;/p&gt;

&lt;p&gt;Because of this, I believe it’s perceived Arista has a better programmability strategy than other vendors.  From what I can tell, it is not the case.  However, given a few features Arista has in EOS, it makes programming EOS a bit easier than other platforms.  Let’s take a look.&lt;/p&gt;

&lt;p&gt;At Network Field Day 16, Arista reviewed their programmability strategy.  There were 5 core components reviewed:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;EAPI&lt;/li&gt;
  &lt;li&gt;OpenConfig&lt;/li&gt;
  &lt;li&gt;NetDB Streaming&lt;/li&gt;
  &lt;li&gt;Turbines&lt;/li&gt;
  &lt;li&gt;EosSdk&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/img/arista-nfd16.PNG&quot; alt=&quot;Arista Programmability Strategy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Before diving into each of these, I’ll first point out that when I look at “OS programmability,” what is important [to me] is device-level programmability (not controllers or streaming capabilities–those are important topics, but should be covered on their own).  Programmability is the ability to &lt;em&gt;program&lt;/em&gt; change on a device, isn’t it?  Now let’s look at the 5 components in Arista’s strategy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EAPI&lt;/strong&gt; - it’s a great API for learning to program an EOS switch.  This is on par with Cisco’s Nexus NX-API CLI.  However, EAPI (same for NX-API) is not a robust RESTful API.  They are great APIs for learning because they still use commands.  It’s the kind of API you need when the OS was built before an API-first strategy, which is totally fine (but shouldn’t be the final &lt;em&gt;strategy&lt;/em&gt;).  You simply send commands to the device via HTTP/S and get JSON responses back (if the command is supported).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenConfig (OC)&lt;/strong&gt; - on its own, OC should not be a programmability strategy without more context provided.  What transports are supported? Is it streaming only?  Is it for configuration management?  What models are supported?  In Arista’s case, this is gRPC only and for streaming data only.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NetDB Streaming&lt;/strong&gt; - I’m hard-pressed to include this one for two reasons. It’s for streaming (not &lt;em&gt;programming&lt;/em&gt;) and you need to engage with Arista as a customer to understand it / use it in more detail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Turbines&lt;/strong&gt; - as you can see from the photo, these are custom apps on top of CVP.  As mentioned previously, I’d rather not conflate device level programmability and &lt;em&gt;controller&lt;/em&gt; programmability.  In addition, it’s still a &lt;em&gt;work in progress&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EosSdk&lt;/strong&gt; - it is in fact an avenue for device level programmability, but for the  control plane of the switch (compared to management plane).  I think this is slick and great knowing it’s there, but out of reach and not needed for the majority of EOS users.&lt;/p&gt;

&lt;p&gt;Update: shortly after this published, I was informed the latest release of EOS has gRPC support for streaming and also configuration of certain models.  Some of these models are also exposed via NETCONF too.&lt;/p&gt;

&lt;h1 id=&quot;summary&quot;&gt;Summary&lt;/h1&gt;

&lt;p&gt;When I take a step back and look at Arista’s strategy for programmability, this is what I’m left with:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Arista should consider creating a real object-based RESTful API–one that doesn’t use CLI commands, even if this uses custom models.  RESTCONF comes to mind.&lt;/li&gt;
  &lt;li&gt;There needs to be a differentiation between programmability and streaming telemetry.&lt;/li&gt;
  &lt;li&gt;Be very explicit with what’s supported with regards to OpenConfig.  See above for more context.&lt;/li&gt;
  &lt;li&gt;If a platform is supporting YANG models, it would be much preferred to support NETCONF and/or RESTCONF for a real API (in the context of configuring the management plane).  These are preferred over gRPC for the majority of users at this point in time.  For example, in Python it’s quite easy to get started with Python &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;requests&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ncclient&lt;/code&gt;.  How would one would get started with a vendor-neutral gRPC client?  From what I’ve seen, every vendor has been developing their own gRPC clients thus far.  Does this mean it’s not standard gRPC?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What makes eAPI a valid strategy (and more programmable than other OSs) is not the API itself, but EOS supporting two features: config replace (atomic config replace) and configuration sessions (batch transactions like a candidate configuration).  Having an open OS and these features are great, but shouldn’t minimize the focus on proper [configuration] API development.&lt;/p&gt;

&lt;p&gt;General thoughts?  Feel free to comment below!&lt;/p&gt;

&lt;p&gt;Thanks,&lt;/p&gt;

&lt;p&gt;Jason (@jedelman8)&lt;/p&gt;

</description>
      <pubDate>Sun, 01 Oct 2017 00:00:00 +0000</pubDate>
      </item>
    
      <item>
      <title>Intent-Based Network Automation with Ansible</title>
      <link>https://jedelman.com/home/intent-based-network-automation-with-ansible/</link>
      <guid isPermaLink="true">https://jedelman.com/home/intent-based-network-automation-with-ansible/</guid>
      <description>&lt;p&gt;The latest in all the networking buzz these days is Intent-Based Networking (IBN).  There are varying definitions of what IBN is and is not.  Does IBN mean you need to deploy networking solely from business policy, does IBN mean you must be streaming telemetry from every network device in real-time, is it a combination of both?  Is it automation?&lt;/p&gt;

&lt;p&gt;This article isn’t meant to define IBN, rather, it’s meant to provide a broader, yet more practical perspective on automation and intent.&lt;/p&gt;

&lt;h1 id=&quot;intent-isnt-new&quot;&gt;Intent isn’t New&lt;/h1&gt;

&lt;p&gt;One could argue that intent-based systems have been around for years, especially when managing servers.  Why not look at &lt;em&gt;DevOps tools&lt;/em&gt; like CFEngine, Chef, and Puppet (being three of the first)?  They focused on desired state–their goal was to get managed systems into a technical desired state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If something is in its desired state, doesn’t that mean it’s in its intended state?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These tools did this eliminating the need to know the specific Linux server commands to configure the device–you simply defined your desired state with a declarative approach to systems management, e.g. ensure Bob is configured on the system without worrying about the command to add Bob.  One major difference was those tools used the term “declarative” and not “intent-based” when it comes to industry terms and hype.  That said, it’s actually quite a solid approach to systems management.&lt;/p&gt;

&lt;h1 id=&quot;using-devops-tools-for-networking&quot;&gt;Using DevOps Tools for Networking&lt;/h1&gt;

&lt;p&gt;Using a declarative approach for systems management was solid enough that eventually these tools were extended to manage network devices.  The only caveat was the companies that developed these tools never employed anyone focused on network integrations.  Then along came Ansible–they were the same in that they employed no one that developed network integrations (circa 2014-15).  There was a major difference between Puppet/Chef and Ansible though.  It was that Ansible was dead simple and the network community drove the initial Ansible &amp;lt;–&amp;gt; network device integrations.  Even vendors like Juniper and Arista wrote their own modules.  Finally, Ansible made investments and continues to do so, and now has a full team dedicated to networking.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Since I mentioned all other popular “configuration management” tools, there is even the newest of these tools: Salt by SaltStack, that has a growing interest in the community to be used for network automation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;intent-based-network-automation-with-ansible&quot;&gt;Intent-Based Network Automation with Ansible&lt;/h1&gt;

&lt;p&gt;Let’s get back to Ansible.  Ansible is interesting because it’s often debated if it’s &lt;em&gt;imperative&lt;/em&gt; or &lt;em&gt;declarative&lt;/em&gt;.  This partially goes back to defining something as intent-driven or not.  More on this later though.&lt;/p&gt;

&lt;p&gt;Major point: &lt;strong&gt;certain &lt;em&gt;tools&lt;/em&gt; are not tools–they are mere platforms that you can build on&lt;/strong&gt;.  This is how I see Ansible.  If you look at a single task (in Ansible terminology) today, you may in theory be using CLI commands or making specific API calls.  What’s great about this is that you know 100% what is being sent to the device. What’s not so great about this?  It may not be considered intent-based by industry pundits.  However, platforms like Ansible have building blocks.&lt;/p&gt;

&lt;p&gt;Within Ansible, there are modules, tasks, plays, and roles that allow you to build your own abstractions that perform how &lt;em&gt;you&lt;/em&gt; need them to fit your environment.  This means you can write an Ansible playbook to automate your network that enforces your precise intent.  Of course, if you look inside the playbook, you may see &lt;em&gt;some&lt;/em&gt; imperative tasks, but who cares?  This is why there are platform architects (who build robust playbooks) and users of the system (who execute the playbooks).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You should be able to define your desired state according to your Enterprise standards.&lt;/strong&gt;&lt;/p&gt;

&lt;h1 id=&quot;using-cli-commands-to-drive-intent&quot;&gt;Using CLI Commands to Drive Intent&lt;/h1&gt;

&lt;p&gt;All we do at &lt;a href=&quot;networktocode.com&quot;&gt;Network to Code&lt;/a&gt; is network automation.  If all we had was something that could be used for greenfield deployments or that only worked in the WAN, Campus, &lt;strong&gt;or&lt;/strong&gt; DC, we wouldn’t exist as a services company.  Our major selling point is that we make network automation consumable and something that can be adopted and deployed in a gradual, yet effective, fashion across a wide variety of network types.  This means using CLI commands to even drive intent–let’s face it, it’s the world we live in.&lt;/p&gt;

&lt;p&gt;If there is any solution categorized as Intent-Based Networking (open source of commercial), I guarantee you it’s using CLI commands if it’s managing devices such as Cisco Nexus, IOS, or Arista EOS.  All this means is that the solution built more logic on top to enforce intent, perform real-time checks, and allows you to see and mange this with a slick UI.&lt;/p&gt;

&lt;h1 id=&quot;network-intent-with-napalm&quot;&gt;Network Intent with NAPALM&lt;/h1&gt;

&lt;p&gt;This post wouldn’t be complete without mention of NAPALM.  NAPALM at its core is a Python library that was built to offer a uniform way (in Python) to manage network device configurations.  While this isn’t meant to be a primer on NAPALM, there is a way to declaratively manage full device configurations with NAPALM.  This means if your desire is to have a particular running configuration on the device, you can use NAPALM to do so.  The subtle, but major difference here to traditional automation, is you do not have to issue any “no” or “delete” commands to do this.&lt;/p&gt;

&lt;p&gt;You literally focus on what your intent is with CLI commands, which in my opinion isn’t a bad thing because CLI devices is what’s mostly deployed today in production environments (forget about what transport is used - CLI over API or CLI over SSH…it’s still being used).  Looking back, NAPALM was arguably the first networking library that offered intent (but uses declarative in their terminology just as the initial DevOps tools did).  Again, the real value here is that NAPALM is a collection of device drivers, so why not build atop NAPALM.  In fact, any commercial tool is using something equivalent like NAPALM to manage device configurations.&lt;/p&gt;

&lt;h2 id=&quot;using-ansible-and-napalm&quot;&gt;Using Ansible and NAPALM&lt;/h2&gt;

&lt;p&gt;Because Ansible was extensible, there were NAPALM modules written pretty early on, pre-dating any network module in core today.  We could go onto say that Ansible has been doing IBN for over several years now!  In either case, systems have building blocks.  These days you can use native modules in Ansible core (much more of this coming with Ansible 2.4), or NAPALM modules with Ansible to write pretty robust playbooks–each playbook could do something like manage a configuration of device with intent in mind or something that makes adoption easier, managing each feature with intent in mind!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You shouldn’t have to change your Enterprise standards to adopt automation.&lt;/strong&gt;&lt;/p&gt;

&lt;h1 id=&quot;from-automating-configurations-to-automating-intent&quot;&gt;From Automating Configurations to Automating Intent&lt;/h1&gt;

&lt;p&gt;This brings me to another point and question not often talked about when it comes to automation, configuration drift, intent, and declarative configuration management.&lt;/p&gt;

&lt;p&gt;If you’re managing network devices, what is the source of truth (SOT)?  Where are the desired (or intended, if we want to use current terminology) configuration inputs held?  Is it in a custom database? IPAM solution? YAML files?  Any answer is better than, “&lt;em&gt;it’s the network device and that’s the only thing we trust!&lt;/em&gt;”  However, after you consider where the SOT is and where you want it to be, you have to ask yourself, what about “additional configurations” that are on the device after you’ve automated your desired configuration?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;What if you desire 5 BGP neighbors and those 5 exist, but there are also 2 others?&lt;/li&gt;
  &lt;li&gt;What if you need 10 VLANs on each switch, but there is also an additional 2-3 on each switch?&lt;/li&gt;
  &lt;li&gt;What about SNMP community strings?  Do all of your SNMP tools work, but you still see the aging comm strings for the past 20 years that you’re afraid to delete?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We can ask these types of questions for every feature on a network device.  This is why there is actually a major difference with what we refer to as basic network automation (ensure your desired configuration exists) and fully declarative intent-based management per feature or per device (ensure your intended and desired configuration exists and remove all other configurations not in your SOT).&lt;/p&gt;

&lt;h1 id=&quot;using-ansible-as-a-platform&quot;&gt;Using Ansible as a Platform&lt;/h1&gt;

&lt;p&gt;If you treat Ansible as a platform, you get all of this today.  It’s up to you to choose what level of abstraction is right for your organization and the users of the platform.  For example, we at &lt;a href=&quot;networktocode.com&quot;&gt;Network to Code&lt;/a&gt; have been hard at work deploying solutions like this leveraging Ansible as a platform.  We’ve deployed Ansible Tower (self-service via Tower Surveys) on top of Ansible if that meets customer requirements, and we’ve developed custom integrations (including front-ends) that are more network centric that sit above Ansible (or Tower).&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Note: the alternative is to use Ansible as a power tool and not as a platform, in which there is still great value, but it’s then just automating CLI commands faster than you.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Realize there is a difference using something as a platform or a tool.&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;tabling-operational-state&quot;&gt;Tabling Operational State&lt;/h3&gt;

&lt;p&gt;This post didn’t cover operational state as that’s a bit more complex &lt;em&gt;to enforce&lt;/em&gt; and then you get into event-driven and auto-remediation systems, but in all of these tools and platforms, you have the ability to collect any information from the device (config or operational state), and then based on that data, work through your logic and intent-based deployment.&lt;/p&gt;

&lt;h1 id=&quot;lets-meet-at-ansiblefest-sf-2017&quot;&gt;Let’s Meet at AnsibleFest SF 2017&lt;/h1&gt;

&lt;p&gt;A few of us from the NTC team are at AnsibleFest in SF tomorrow, September 7.  If you’re interested in hearing more about our model-driven intent-based network automation services and solutions with Ansible, feel free to stop by our booth!&lt;/p&gt;

&lt;h1 id=&quot;network-automation-with-python--ansible-training&quot;&gt;Network Automation with Python &amp;amp; Ansible Training&lt;/h1&gt;

&lt;p&gt;In the spirit of AnsibleFest, NTC is offering 50% off any of our &lt;a href=&quot;http://networktocode.com/products/training/&quot;&gt;public training courses&lt;/a&gt; until 9/15.  Just email &lt;strong&gt;info@networktocode&lt;/strong&gt; asking for your promo code.&lt;/p&gt;

&lt;p&gt;Happy Automating!&lt;/p&gt;

&lt;p&gt;-Jason (@jedelman8)&lt;/p&gt;

</description>
      <pubDate>Wed, 06 Sep 2017 00:00:00 +0000</pubDate>
      </item>
    
      <item>
      <title>Using the Ansible ios_config Module</title>
      <link>https://jedelman.com/home/using-the-ansible-ios-config-module/</link>
      <guid isPermaLink="true">https://jedelman.com/home/using-the-ansible-ios-config-module/</guid>
      <description>&lt;p&gt;I get asked often on how to perform specific network automation tasks with Ansible.  There were a few questions recently pertaining to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ios_config&lt;/code&gt; module within Ansible core, so I decided to record a video to show different options you have when using it to deploy global configuration commands on IOS devices.&lt;/p&gt;

&lt;p&gt;Here is a summary of the four (4) options covered:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Embed commands in your playbook and reference them using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;commands&lt;/code&gt; (or lines) parameter.&lt;/li&gt;
  &lt;li&gt;Use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;src&lt;/code&gt; parameter and reference a configuration file with one or more commands in it.&lt;/li&gt;
  &lt;li&gt;Use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;src&lt;/code&gt; parameter and reference a Jinja2 template such that it inserts variables into the template, creating a list of commands, and  deploys them to a device.&lt;/li&gt;
  &lt;li&gt;Use two tasks.  In Task 1, use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;template&lt;/code&gt; module and reference a Jinja2 template to auto-generate a configuration file.  In Task 2, use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ios_config&lt;/code&gt; module and reference the config file built in Task 1 to deploy the commands from the file.  This is often used instead of option #3 since it allows you to store/view the config file before deploying fully de-coupling the build and deploy processes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href=&quot;https://youtu.be/WXLUgDmvHDI&quot; title=&quot;Using the ios_config module&quot;&gt;&lt;img src=&quot;/img/ios_config.png&quot; alt=&quot;Using the ios_config module&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The video does assume some existing knowledge on using Ansible.  The goal was to highlight different options available to you when using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ios_config&lt;/code&gt; module specifically for deploying global configuration commands.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Note: The video does NOT cover sending commands in any other configuration mode such as interface configuration mode or router configuration mode.  I’d recommend simply starting with global configuration commands and expand from there exploring how to further use the module issuing the command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ansible-doc ios_config&lt;/code&gt; on your Ansible machine.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;-Jason&lt;/p&gt;

&lt;p&gt;@jedelman8&lt;/p&gt;

</description>
      <pubDate>Wed, 03 May 2017 00:00:00 +0000</pubDate>
      </item>
    
      <item>
      <title>Self Driving Cars and Network Automation</title>
      <link>https://jedelman.com/home/self-driving-cars-and-network-automation/</link>
      <guid isPermaLink="true">https://jedelman.com/home/self-driving-cars-and-network-automation/</guid>
      <description>&lt;p&gt;Last year at Interop, there was a great mini-conference dedicated to the DevOps for Networking community.  In that session, I kicked off the day with a general view of where the industry was with respect to the intersection of DevOps and networking with a focus on network automation.&lt;/p&gt;

&lt;p&gt;One of the analogies I made was comparing network automation to self-driving cars posing the question, &lt;em&gt;“Are they real?”…“Are they real for us (the consumer)?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/self-driving-car1.png&quot; alt=&quot;Self-Driving Cars&quot; /&gt;&lt;/p&gt;

&lt;p&gt;No, they are not, but I continued to make the analogy.  Is &lt;em&gt;complete&lt;/em&gt; network automation real today?  While, the answer is yes, it’s not really a reality for most…&lt;em&gt;yet&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;So, what’s the connection between self-driving cars and network automation?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start small and expand.  Pick a problem, solve it, and integrate it.&lt;/strong&gt;&lt;/p&gt;

&lt;h1 id=&quot;self-driving-cars-are-coming&quot;&gt;Self-Driving Cars are Coming&lt;/h1&gt;

&lt;p&gt;While self-driving cars aren’t a reality for us to buy and purchase today, intelligent cars are– these are cars that have high-value services and features enhancing the way we drive, our safety, and much more generally, the way we in which we consume the streets and infrastructure around us.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/self-driving-car2.png&quot; alt=&quot;Intelligent Cars&quot; /&gt;&lt;/p&gt;

&lt;p&gt;These include automated features like self-parking, back-up cameras, automated beeping as you back-up, automatic-brakes, GPS, and computer systems that give you a plethora of visibility about the inner workings of the car (complex system).  So yes, you better believe it.  &lt;strong&gt;The self-driving car is coming– one feature, chip, feedback loop, and computer program at a time.&lt;/strong&gt;&lt;/p&gt;

&lt;h1 id=&quot;network-automation-is-coming&quot;&gt;Network Automation is Coming&lt;/h1&gt;

&lt;blockquote&gt;
  &lt;p&gt;All of the pieces are actually here already!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Achieving network automation&lt;/strong&gt; is hard, very hard.  But it’s actually not if you break it down into achievable milestones.  Maybe it’s something like the following:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Generate automated reports and documentation for Campus Access layer and expand networks from there.  You don’t need to start with &lt;em&gt;every network type&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;Create proper configuration templates for each new device type or for each new service being deployed. Again, you don’t need to start with &lt;em&gt;every device or network type&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;Create a compliance check for credentials in one part of the network and gradually expand compliance checks and networks checked against.&lt;/li&gt;
  &lt;li&gt;Standing up a new site? Look into zero touch provisioning.&lt;/li&gt;
  &lt;li&gt;Having a problem with bad switches in a stack or linecards in a chassis?  Perfect problem to solve.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As use-cases like this are being solved week after week, you’ll have short-term wins proving the value of automation, but also be moving towards the bigger picture of deploying services, integrating into 3rd party platforms, creating relevant feedback loops, offering APIs to the business, and much more.&lt;/p&gt;

&lt;p&gt;The biggest takeaway is to make sure you build a plan, know it’ll take time to achieve, and break it up into achievable milestones.  It’ll be a win for everyone involved.&lt;/p&gt;

&lt;p&gt;-Jason&lt;/p&gt;

&lt;p&gt;@jedelman8&lt;/p&gt;

</description>
      <pubDate>Sat, 22 Apr 2017 00:00:00 +0000</pubDate>
      </item>
    
      <item>
      <title>Automate When You Can, Program When You Must</title>
      <link>https://jedelman.com/home/automate-when-you-can-program-when-you-must/</link>
      <guid isPermaLink="true">https://jedelman.com/home/automate-when-you-can-program-when-you-must/</guid>
      <description>&lt;p&gt;I’ve had a general thought I’ve wanted to write about for quite some time now and after just seeing Matt Oswalt’s latest post &lt;a href=&quot;https://keepingitclassless.net/2017/03/learn-programming-or-perish/&quot;&gt;Learn Programming or Perish(?)&lt;/a&gt;, the thought finally makes it to paper so to speak in this post.  The thought I want to expand on is something I say quite a bit as I talk about network automation.  It is &lt;em&gt;automate when you can, program when you must.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;After reading Matt’s post, I’ll re-phrase to &lt;em&gt;automate when you can, script when you must&lt;/em&gt; specifically targeting network engineers (note: even though this is what I mean, the word &lt;em&gt;script&lt;/em&gt; makes it a bit clearer).  This is a twist on the network industry’s old saying of &lt;em&gt;switch when you can, route when you must&lt;/em&gt;.&lt;/p&gt;

&lt;h1 id=&quot;automate-when-you-can&quot;&gt;Automate When You Can&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Automate when you can&lt;/em&gt;&lt;/strong&gt; is saying use some form of tooling when you can to &lt;em&gt;do network automation&lt;/em&gt;.  Why re-invent the wheel when you don’t have to?  I’m a little biased these days, but this means using some form of extensible tooling, preferably open source, that &lt;em&gt;does automation&lt;/em&gt;.  Some of my favorites right now are Red Hat’s Ansible and Extreme’s StackStorm.  However, this could just as well be other open source tools such as Puppet, Chef, or SaltStack, or even commercial solutions from vendors like Cisco, VMware, Arista,  and &lt;strong&gt;insert favorite vendor&lt;/strong&gt;.   Ideally, you (your network team) are automating 80% of the time.&lt;/p&gt;

&lt;h1 id=&quot;program-when-you-must&quot;&gt;Program When You Must&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Program when you must&lt;/em&gt;&lt;/strong&gt;, now re-phrased as &lt;em&gt;script when you must&lt;/em&gt; is saying, when the &lt;strong&gt;tool&lt;/strong&gt; cannot do what you need it to do, or when the &lt;strong&gt;tool&lt;/strong&gt; becomes too complex to perform a certain operation, script it, and when you script it, hopefully you’re &lt;em&gt;extending&lt;/em&gt; the tool of your choice.  In Ansible, &lt;em&gt;scripting&lt;/em&gt; means you’re writing a custom module or enhancing an existing one or writing a custom Jinja2 filter.  This is NOT hard-core programming that requires years of professional training as a software engineer.  You can script (yes, it’s still programming) amazing things in 30-40 lines of code (maybe it’s a little more or less).  We aren’t talking about writing 1000s of lines of code though. Ideally, you (your network team) are scripting/programming 20% of the time.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Note: I used the word &lt;em&gt;programming&lt;/em&gt; in that last sentence because if you do have full-time &lt;em&gt;scripters&lt;/em&gt; on the team, they should be pushing themselves to get to the next level.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;the-8020-rule-for-network-automation&quot;&gt;The 80/20 Rule for Network Automation&lt;/h1&gt;

&lt;p&gt;The net result comes back to the 80/20 rule when looking at a team of current network engineers.  If you’re on a team of 10 people, 8 of them should be using using a tool day to day.  If it’s ~7, that’s more than okay.  &lt;strong&gt;Learning a tool to manage production environments is a challenge in itself&lt;/strong&gt;, forget about everyone learning &lt;em&gt;to write production code&lt;/em&gt;.  Of these 7-8 people, there will likely be a few that script more than others for sure- that’s the reality.&lt;/p&gt;

&lt;p&gt;Of the remaining 2-3 people though, they are scripting more frequently than the others.  These are the few that may straddle scripting and programming.   That said, the more the &lt;em&gt;scripters&lt;/em&gt; script, the more they realize they need to write better-quality code.  These folks realize that and &lt;em&gt;may&lt;/em&gt; make that gradual transition to worry about things like code review and automated tests.  This &lt;em&gt;could&lt;/em&gt; mean they evolve more into more of a software engineer in the long run.  However, that &lt;strong&gt;DOES NOT&lt;/strong&gt; happen over night.&lt;/p&gt;

&lt;h1 id=&quot;becoming-an-expert-over-night&quot;&gt;Becoming an Expert Over Night?&lt;/h1&gt;

&lt;p&gt;Did anyone with advanced network certifications get them over night?  Heck no.  It’s a gradual process.  I often equate it to the CCNA, CCNP, and CCIE.  Does one learn BGP as a CCNA? Sure, I bet if you ask someone who just passed the CCNA about BGP, they can tell you all they know about BGP and think that’s all they need to know.  Then they get to the CCNP routing book and realize there is so much more to learn; the process repeats again for the CCIE.  Oh, and this happens yet again for managing a production environment running BGP.&lt;/p&gt;

&lt;p&gt;So you’re a network engineer without any automation/programming knowledge?  That’s awesome.  Embrace it and learn as much as possible, but do not shoot for the &lt;em&gt;CCIE of programming&lt;/em&gt; tomorrow; go for the &lt;strong&gt;NA&lt;/strong&gt; - learn to write small scripts, understand data types, and data formats!&lt;/p&gt;

&lt;h1 id=&quot;network-automation-takeaways&quot;&gt;Network Automation Takeaways&lt;/h1&gt;

&lt;p&gt;First and foremost, realize there is no right or wrong path here, but let’s summarize this a bit for some key takeaways:&lt;/p&gt;

&lt;p&gt;As a network engineer…&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;If you’re just getting started with automation, experiment with a few tools, and then pick one.  Then stick with it.&lt;/li&gt;
  &lt;li&gt;No matter the tool, you need to understand data types.  This is not   programming.  Seeing a curly brace or two is okay, but still not programming.&lt;/li&gt;
  &lt;li&gt;You should understand data formats like JSON regardless of your tool of   choice.&lt;/li&gt;
  &lt;li&gt;You should understand how to script to either a) get something done your tool can’t do well or b) troubleshoot (diving into a stacktrace) c) extend your tool of choice such that a new task that your tool couldn’t do is now easily integrated into workflows your tool does do.  The value here is now others on your team can use your integration/plug-in without programming.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;final-thought&quot;&gt;Final Thought&lt;/h1&gt;

&lt;p&gt;Try and de-couple personal learning objectives with and when managing production environments.  It doesn’t make much sense to build a &lt;strong&gt;FULL&lt;/strong&gt; tool from scratch (excluding APIs and/or front-ends) unless you’re dedicating several full-time software engineers, and even then, is that the best approach?  If you’re thinking along those lines, where do existing [open source] tools fall short for you?&lt;/p&gt;

&lt;p&gt;Happy Automating!&lt;/p&gt;

&lt;p&gt;-Jason&lt;/p&gt;

&lt;p&gt;@jedelman8&lt;/p&gt;

</description>
      <pubDate>Sun, 02 Apr 2017 00:00:00 +0000</pubDate>
      </item>
    
      <item>
      <title>Automating Cisco Nexus Switches with Ansible</title>
      <link>https://jedelman.com/home/automating-cisco-nexus-switches-with-ansible/</link>
      <guid isPermaLink="true">https://jedelman.com/home/automating-cisco-nexus-switches-with-ansible/</guid>
      <description>&lt;p&gt;For the past several years, the open source [network] community has been rallying around Ansible as a platform for network automation.  Just over a year ago, Ansible recognized the importance of embracing the network community and since then, has made significant additions to offer network automation &lt;em&gt;out of the box&lt;/em&gt;.  In this post, we’ll look at two distinct models you can use when automating network devices with Ansible, specifically focusing on Cisco Nexus switches.  I’ll refer to these models as CLI-Driven and Abstraction-Driven Automation.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Note: We’ll see in later posts how we can use these models and a third model to accomplish intent-driven automation as well.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For this post, we’ve chosen to highlight Nexus as there are more Nexus Ansible modules than any other network operating system as of Ansible 2.2 making it extremely easy to highlight these two models.&lt;/p&gt;

&lt;h1 id=&quot;cli-driven-automation&quot;&gt;CLI-Driven Automation&lt;/h1&gt;

&lt;p&gt;The first way to manage network devices with Ansible is to use the Ansible modules that are supported by a diverse number of operating systems including NX-OS, EOS, Junos, IOS, IOS-XR, and many more.  These modules can be considered &lt;em&gt;the lowest common denominator&lt;/em&gt; as they work the same way across operating systems requiring you to define the commands that you want to send to network devices.&lt;/p&gt;

&lt;p&gt;We’ll look at an example of this model managing VLANs on Nexus switches.&lt;/p&gt;

&lt;p&gt;The first thing we are going to do is define an appropriate data model for VLANs.  The more complex the feature (and if you want to consider multiple vendors), the more complex and advanced a data model can be.  In this case, we’ll simply create a list of key-value pairs and represent each VLAN by having a VLAN ID and VLAN NAME.&lt;/p&gt;

&lt;p&gt;The data model we are going to use for VLANs is the following:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;vlans&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;web_servers&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;20&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;app_servers&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;30&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;db_servers&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once we have our data (variables), we’ll use a Jinja2 template that’ll create the required configurations that we’ll ultimately deploy to each device.&lt;/p&gt;

&lt;p&gt;Below is the Jinaj2 template we’ll use to create our configurations.  In our template, we are requiring a VLAN name be present for each VLAN.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;{% for vlan in vlans %}
vlan {{ vlan.id }}
  name {{ vlan.name }}
{% endfor %}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once the configuration commands are built from the template, we need to deploy (ensure the required commands exist) them to the device.  This is where we can use the &lt;strong&gt;nxos_config&lt;/strong&gt; Ansible module.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The *_config modules exist for a large number of network operating systems, which is why we’re calling them the lowest common denominator.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We can create the required configurations and do the deployment with two Ansible tasks:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;BUILD CONFIGS&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;vlans.j2&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;dest&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;configs/vlans.cfg&lt;/span&gt;

    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ENSURE VLANS EXIST&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;nxos_config&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;configs/vlans.cfg&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;provider&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;nxos_provider&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;You could use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;commands&lt;/code&gt; parameter in the &lt;strong&gt;nxos_config&lt;/strong&gt; task rather than using a separate template task; however, it’s a little cleaner using templates.  Yes, this is subjective.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;You could also eliminate the task that uses the &lt;strong&gt;template&lt;/strong&gt; module all together and just do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;source: vlans.j2&lt;/code&gt;, but adding the secondary step offers the flexibility of validating the build step (command generation) before a deployment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;In this example, we are going to deploy the same VLANs to all devices.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If we run a playbook that has these tasks, it’ll ensure all VLANs in the variables file get deployed on the Nexus switches.&lt;/p&gt;

&lt;p&gt;But, what if you need to subsequently remove VLANs?&lt;/p&gt;

&lt;p&gt;In this current model, it’s up to you to either create a second template that uses &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;no vlan &amp;lt;id&amp;gt;&lt;/code&gt; or make a more complex template and based on some other variable, render the commands to either configure or un-configure VLANs.&lt;/p&gt;

&lt;h1 id=&quot;abstraction-driven-automation&quot;&gt;Abstraction-Driven Automation&lt;/h1&gt;

&lt;p&gt;Using the &lt;strong&gt;nxos_config&lt;/strong&gt; module is simply one way you can manage NX-OS devices with Ansible.  While it offers flexibility, you still need to develop templates or commands for everything you want to configure or un-configure on a given device.  For some tasks, this is quite easy; for others, it could get tedious.&lt;/p&gt;

&lt;p&gt;Another approach is to use Ansible modules that offer abstractions, eliminate the need to use commands or templates, while also making it quite easy to ensure a given configuration does NOT exist.&lt;/p&gt;

&lt;p&gt;We aren’t talking about high level abstractions here such as services or tenants, but still network-centric objects and abstractions such as VLANs without the need for you to define the commands that are needed for configuring a given resource or object.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;You can in fact stitch together multiple network-centric objects to create a higher level abstraction such as tenants quite easily with Ansible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let’s take a look at the same VLANs example from above, but instead of using &lt;strong&gt;nxos_config&lt;/strong&gt;, we are going to use &lt;strong&gt;nxos_vlan&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This module only manages VLANs globally on Nexus switches.&lt;/p&gt;

&lt;p&gt;Using this model, the single task we need to ensure the VLANs exist on each switch is the following:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ENSURE VLANS EXIST&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;nxos_vlan&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;vlan_id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;item.id&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;item.name&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;present&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;provider&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;nxos_provider&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;with_items&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;vlans&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And if we need to remove the same VLANs:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ENSURE VLANS DO NOT EXIST&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;nxos_vlan&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;vlan_id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;item.id&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;item.name&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;absent&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;provider&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;nxos_provider&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;with_items&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;vlans&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The only change required to ensure the VLAN does not exist is to change the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state&lt;/code&gt; parameter to &lt;strong&gt;absent&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you take a look at the &lt;a href=&quot;http://docs.ansible.com/ansible/list_of_network_modules.html#nxos&quot;&gt;Ansible docs for network modules&lt;/a&gt; you can see how many Nexus modules exist now in Ansible core.  For those new to Ansible, being in Ansible &lt;em&gt;Core&lt;/em&gt; means you get them when you install Ansible.&lt;/p&gt;

&lt;p&gt;Here is a list of all the Nexus modules that you’ll also find at the Ansible docs link above.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;nxos_aaa_server_host.py         nxos_hsrp.py            nxos_pim.py             nxos_udld_interface.py
nxos_aaa_server.py              nxos_igmp_interface.py  nxos_pim_rp_address.py  nxos_udld.py
nxos_acl_interface.py           nxos_igmp.py            nxos_ping.py            nxos_vlan.py
nxos_acl.py                     nxos_igmp_snooping.py   nxos_portchannel.py     nxos_vpc_interface.py
nxos_bgp_af.py                  nxos_install_os.py      nxos_reboot.py          nxos_vpc.py
nxos_bgp_neighbor_af.py         nxos_interface_ospf.py  nxos_rollback.py        nxos_vrf_af.py
nxos_bgp_neighbor.py            nxos_interface.py       nxos_smu.py             nxos_vrf_interface.py
nxos_bgp.py                     nxos_ip_interface.py    nxos_snapshot.py        nxos_vrf.py
nxos_command.py                 nxos_mtu.py             nxos_snmp_community.py  nxos_vrrp.py
nxos_config.py                  nxos_ntp_auth.py        nxos_snmp_contact.py    nxos_vtp_domain.py
nxos_evpn_global.py             nxos_ntp_options.py     nxos_snmp_host.py       nxos_vtp_password.py
nxos_evpn_vni.py                nxos_ntp.py             nxos_snmp_location.py   nxos_vtp_version.py
nxos_facts.py                   nxos_nxapi.py           nxos_snmp_traps.py      nxos_vxlan_vtep.py
nxos_feature.py                 nxos_ospf.py            nxos_snmp_user.py       nxos_vxlan_vtep_vni.py
nxos_file_copy.py               nxos_ospf_vrf.py        nxos_static_route.py    nxos_gir_profile_management.py
nxos_overlay_global.py          nxos_switchport.py      nxos_gir.py             nxos_pim_interface.py

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;beyond-configuration-management&quot;&gt;Beyond Configuration Management&lt;/h2&gt;

&lt;p&gt;Notice that not only are there a significant amount of modules for configuration management, but there are also quite a few for common operational tasks such as copying files to devices, rebooting devices, testing reachability (using ping), upgrading devices, and rolling back configurations (using the NX-OS checkpoint feature).&lt;/p&gt;

&lt;p&gt;Let’s look at one of these.  We’ll walk through how you can use multiple tasks in a given playbook to upgrade the operating system on Nexus switches.&lt;/p&gt;

&lt;h2 id=&quot;upgrading-nx-os-devices&quot;&gt;Upgrading NX-OS Devices&lt;/h2&gt;

&lt;p&gt;While there is one module called &lt;strong&gt;nxos_install_os&lt;/strong&gt; and that module does perform the actual upgrade, we’ll walk through the complete process starting with checking to see the current version of software on the Nexus switches and finishing with a task to assert the upgrade completed successfully.&lt;/p&gt;

&lt;p&gt;The first three tasks we are going to have in our playbook are the following:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Get current facts of each device so we can print the current version of NX-OS to the terminal during playbook execution&lt;/li&gt;
  &lt;li&gt;Print (debug) the current version of NX-OS to the terminal&lt;/li&gt;
  &lt;li&gt;Ensure the SCP server is enabled on each device so we can copy files&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is what these tasks look like:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;GATHER FACTS TO RECORD CURRENT VERSION OF NX-OS&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;nxos_facts&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;provider&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;nxos_provider&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;

&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;CURRENT OS VERSION&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;var=os&lt;/span&gt;

&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ENSURE SCP SERVER IS ENABLED&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;nxos_feature&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;feature&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;scp-server&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;enabled&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;provider&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;nxos_provider&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;Note: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nxos_provider&lt;/code&gt; is a variable that contains common parameters for the nxos_* modules.  In this particular case, it’s a dictionary that has the following keys:  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;username&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;password&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;transport&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;host&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After we know that &lt;strong&gt;scp&lt;/strong&gt; is enabled, we can confidently copy the required file(s) to each device.  Our example requires the OS image file exists on the Ansible control host.&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ENSURE FILE EXISTS ON DEVICE&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;nxos_file_copy&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;local_file&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;image_path&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}/{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;nxos_version&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;provider&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;nxos_provider&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In addition to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nxos_provider&lt;/code&gt;, we used two other variables to define the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;local_file&lt;/code&gt; parameter.  They are defined as the following:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;nxos_version&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;nxos.7.0.3.I2.2d.bin&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;image_path&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;../os-images/cisco/nxos&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;nxos_version_str&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;7.0(3)I2(2d)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;But, we also have a third variable that is the string representation of the new version (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nxos_version_str&lt;/code&gt;), which we’ll use in an upcoming task.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Based on your deployment, think about using the &lt;strong&gt;delegate_to&lt;/strong&gt; directive when using &lt;strong&gt;nxos_file_copy&lt;/strong&gt; so you can copy files from another host in the data center, or some location that is closer to your devices than the Ansible control host.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once we copy the image file to each switch, we’re ready to perform the final step: the upgrade.  It sounds like a single task, but in reality, it’s a bit more than that.  We’ll summarize these steps as the following:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Start the Upgrade (which initiates the reboot)&lt;/li&gt;
  &lt;li&gt;Ensure the device starts rebooting&lt;/li&gt;
  &lt;li&gt;Ensure the device comes back online&lt;/li&gt;
  &lt;li&gt;Gather facts again to collect new OS version&lt;/li&gt;
  &lt;li&gt;Print (debug) the OS to the terminal&lt;/li&gt;
  &lt;li&gt;Assert and Verify the expected version is running on the device&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If we translate these steps into Ansible tasks, we end up with the following:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ENSURE OS IS CORRECT&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;nxos_install_os&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;system_image_file&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;nxos_version&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;provider&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;nxos_provider&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;rescue&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;WAITING FOR DEVICE TO PERFORM ALL UPGRADE CHECKS AND STARTS REBOOT&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;wait_for&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;22&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;stopped&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;timeout&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;300&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;delay&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;60&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;inventory_hostname&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;

    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;REBOOT IN PROGRESS - WAITING FOR DEVICE TO COME BACK ONLINE&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;wait_for&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;22&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;started&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;timeout&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;300&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;delay&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;60&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;inventory_hostname&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;

  &lt;span class=&quot;na&quot;&gt;always&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;

    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;GATHER FACTS TO RECORD CURRENT VERSION OF NX-OS&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;nxos_facts&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;provider&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;nxos_provider&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&quot;&lt;/span&gt;

    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;CURRENT OS VERSION&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;var=os&lt;/span&gt;

    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;VERIFY CURRENT VERSION IS EXPECTED VERSION&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;assert&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;that&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}'&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;nxos_version_str&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}'&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As you read through the preceding tasks, take note of the feature being used within the playbook called Ansible blocks.  This is a critical feature to be aware of to account for errors when running a playbook and conditionally execute a group of tasks when an error occurs.  Because Ansible doesn’t yet allow for a device to lose connectivity within a task, we need to &lt;em&gt;assume&lt;/em&gt; a failure is going to occur.  Basically, whenever you use &lt;strong&gt;nxos_install_os&lt;/strong&gt;, the task &lt;strong&gt;will&lt;/strong&gt; fail when the switch reboots (for now).  Within a block, when a failure condition occurs, the tasks within the &lt;em&gt;rescue&lt;/em&gt; block start executing.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;rescue&lt;/strong&gt; tasks shown above ensure the device starts rebooting within 5 minutes and ensure the device comes back online within 5 minutes.  Note that these tests were executed against Nexus 9396s and 9372s - if you are using 7K or 9K chassis devices, you may want to increase the timeout values.&lt;/p&gt;

&lt;p&gt;Finally, the last three tasks &lt;em&gt;always&lt;/em&gt;  get executed and verify the upgrade was successful.&lt;/p&gt;

&lt;p&gt;In upcoming posts, we’ll take a look at a few other use cases and show some live demos.  Over time, we’ll get more complete examples on GitHub too.&lt;/p&gt;

&lt;p&gt;Thanks,&lt;/p&gt;

&lt;p&gt;Jason&lt;/p&gt;

&lt;p&gt;@jedelman8&lt;/p&gt;

</description>
      <pubDate>Mon, 05 Dec 2016 00:00:00 +0000</pubDate>
      </item>
    
      <item>
      <title>Network Automation Survey</title>
      <link>https://jedelman.com/home/network-automation-survey/</link>
      <guid isPermaLink="true">https://jedelman.com/home/network-automation-survey/</guid>
      <description>&lt;p&gt;Network Automation is just getting started and it’s odd to say that as IT professionals from other technology disciplines are always surprised to see how much manual interaction there still is between the networking engineering/operations teams and the actual devices they manage.&lt;/p&gt;

&lt;p&gt;I’ll never forget the days in 2012-2013 performing my best Google searches to find ways &lt;em&gt;to program&lt;/em&gt; or &lt;em&gt;to automate&lt;/em&gt; network routers and switches.  I didn’t care what programming language was being used or even what tool, but I found nothing.  Every time I heard someone say they were using a network script, I’d say “email it to me, that sounds interesting.”  Unfortunately, 100% of the time, it ended up being a notepad or a Word file, not a &lt;em&gt;script&lt;/em&gt;.  What a bummer.&lt;/p&gt;

&lt;p&gt;I like to think I’m a solid Googler too.  It was amazing though - there was near nothing.  Do a search today on network automation or network programming and you’d be amazed on what you’ll find - we’ve come a long way in the past 36 months with respect to network automation, but I truly believe we’re still in the 2nd or 3rd inning (if we were playing a game of baseball, of course).&lt;/p&gt;

&lt;p&gt;At this point, the industry needs feedback.  We need to primarily see what our peers are doing and maybe more importantly ensure vendors are aware for the need of better tools, libraries, and APIs.  We need a collective voice.&lt;/p&gt;

&lt;p&gt;In order to help make that happen, a public and anonymous &lt;a href=&quot;http://bit.ly/netdevops-survey&quot;&gt;Network Automation Survey&lt;/a&gt; was created that was initiated by several folks on the &lt;a href=&quot;slack.networktocode.com&quot;&gt;Network to Code Community Slack team&lt;/a&gt;.  I played a very small part in helping create it and now just doing a small part to make more people aware of it…&lt;/p&gt;

&lt;p&gt;So, please, do your part.  &lt;a href=&quot;http://bit.ly/netdevops-survey&quot;&gt;Take the Survey&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Until the results are reviewed and cleaned up, they are even &lt;a href=&quot;http://bit.ly/netdevops-survey-results&quot;&gt;available in raw format&lt;/a&gt; - full transparency along the way.&lt;/p&gt;

&lt;p&gt;Happy Automating!&lt;/p&gt;

&lt;p&gt;Thanks,&lt;/p&gt;

&lt;p&gt;Jason&lt;/p&gt;

&lt;p&gt;@jedelman8&lt;/p&gt;

</description>
      <pubDate>Tue, 15 Nov 2016 00:00:00 +0000</pubDate>
      </item>
    
      <item>
      <title>NETCONF, RESTCONF on IOS XE</title>
      <link>https://jedelman.com/home/netconf-restconf-on-ios-xe/</link>
      <guid isPermaLink="true">https://jedelman.com/home/netconf-restconf-on-ios-xe/</guid>
      <description>&lt;p&gt;There is a lot of buzz around network APIs such as NETCONF and RESTCONF.  Here we’ll take a quick a look at these APIs on Cisco IOS XE.  On the surface, it seems Cisco IOS XE is the first network device platform that supports NETCONF and RESTCONF both driven from YANG models.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Technically, RESTCONF isn’t officially supported or even seen in the CLI to enable it, but more on that later.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;yang&quot;&gt;YANG&lt;/h2&gt;

&lt;p&gt;When APIs are model driven, the model is the source of truth.  If done right, all API documentation and configuration validation could occur using tooling built directly from the models.  YANG is the leading data modeling language and as such, all API requests using RESTCONF/NETCONF are directly modeled from the YANG models IOS XE supports.  For this post, we’ll just say the models can easily be represented as JSON k/v pairs or XML documents.  We’ll cover YANG in more detail in a future post.&lt;/p&gt;

&lt;h2 id=&quot;netconf&quot;&gt;NETCONF&lt;/h2&gt;

&lt;p&gt;You can directly access the NETCONF server on IOS XE using the following SSH command (or equivalent from a SSH client).&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The NETCONF server is a SSH sub-system.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ ssh -p 830 ntc@csr1kv -s netconf 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The full response from the IOS XE NETCONF server can be seen below.&lt;/p&gt;

&lt;p&gt;When you get the response from the device, you need to respond with client capabilities, and then can you can enter NETCONF request objects into that terminal session directly communicating to the device using NETCONF — all without writing any code.  This is a good way to ensure your XML objects are built properly before testing them out in any type of script.&lt;/p&gt;

&lt;p&gt;So first, we can paste this object into the terminal:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;hello xmlns=&quot;urn:ietf:params:xml:ns:netconf:base:1.0&quot;&amp;gt;
    &amp;lt;capabilities&amp;gt;
        &amp;lt;capability&amp;gt;urn:ietf:params:netconf:base:1.0&amp;lt;/capability&amp;gt;
    &amp;lt;/capabilities&amp;gt;
&amp;lt;/hello&amp;gt;]]&amp;gt;]]&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now the client and the server have exchanged capabilities and the client is now able to send NETCONF request objects.&lt;/p&gt;

&lt;p&gt;We are going to query the device for the IP configuration on the GigabitEthernet2 interface.  We’ll do this by sending the following object to the device (still in the same terminal session from above).&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;This is not a typical interactive session, so don’t be alarmed if you aren’t getting feedback from the device before pasting in this object.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;nc:rpc&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;message-id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;101&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:nc=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;urn:ietf:params:xml:ns:netconf:base:1.0&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;nc:get&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;nc:filter&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;subtree&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;native&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://cisco.com/ns/yang/ned/ios&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
             &lt;span class=&quot;nt&quot;&gt;&amp;lt;interface&amp;gt;&lt;/span&gt;
              &lt;span class=&quot;nt&quot;&gt;&amp;lt;GigabitEthernet&amp;gt;&lt;/span&gt;
               &lt;span class=&quot;nt&quot;&gt;&amp;lt;name&amp;gt;&lt;/span&gt;2&lt;span class=&quot;nt&quot;&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
                 &lt;span class=&quot;nt&quot;&gt;&amp;lt;ip&amp;gt;&amp;lt;/ip&amp;gt;&lt;/span&gt;
              &lt;span class=&quot;nt&quot;&gt;&amp;lt;/GigabitEthernet&amp;gt;&lt;/span&gt;
             &lt;span class=&quot;nt&quot;&gt;&amp;lt;/interface&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;/native&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/nc:filter&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/nc:get&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/nc:rpc&amp;gt;&lt;/span&gt;
]]&amp;gt;]]&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is the response we get back:&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;rpc-reply&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;urn:ietf:params:xml:ns:netconf:base:1.0&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;message-id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;101&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:nc=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;urn:ietf:params:xml:ns:netconf:base:1.0&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;data&amp;gt;&amp;lt;native&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://cisco.com/ns/yang/ned/ios&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;interface&amp;gt;&amp;lt;GigabitEthernet&amp;gt;&amp;lt;name&amp;gt;&lt;/span&gt;2&lt;span class=&quot;nt&quot;&gt;&amp;lt;/name&amp;gt;&amp;lt;ip&amp;gt;&amp;lt;address&amp;gt;&amp;lt;primary&amp;gt;&amp;lt;address&amp;gt;&lt;/span&gt;10.1.1.1&lt;span class=&quot;nt&quot;&gt;&amp;lt;/address&amp;gt;&amp;lt;mask&amp;gt;&lt;/span&gt;255.255.255.0&lt;span class=&quot;nt&quot;&gt;&amp;lt;/mask&amp;gt;&amp;lt;/primary&amp;gt;&amp;lt;/address&amp;gt;&amp;lt;/ip&amp;gt;&amp;lt;/GigabitEthernet&amp;gt;&amp;lt;/interface&amp;gt;&amp;lt;/native&amp;gt;&amp;lt;/data&amp;gt;&amp;lt;/rpc-reply&amp;gt;&lt;/span&gt;]]&amp;gt;]]&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And if we clean up the response:&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;rpc-reply&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;urn:ietf:params:xml:ns:netconf:base:1.0&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:nc=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;urn:ietf:params:xml:ns:netconf:base:1.0&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;message-id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;101&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;data&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;native&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://cisco.com/ns/yang/ned/ios&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
         &lt;span class=&quot;nt&quot;&gt;&amp;lt;interface&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;GigabitEthernet&amp;gt;&lt;/span&gt;
               &lt;span class=&quot;nt&quot;&gt;&amp;lt;name&amp;gt;&lt;/span&gt;2&lt;span class=&quot;nt&quot;&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
               &lt;span class=&quot;nt&quot;&gt;&amp;lt;ip&amp;gt;&lt;/span&gt;
                  &lt;span class=&quot;nt&quot;&gt;&amp;lt;address&amp;gt;&lt;/span&gt;
                     &lt;span class=&quot;nt&quot;&gt;&amp;lt;primary&amp;gt;&lt;/span&gt;
                        &lt;span class=&quot;nt&quot;&gt;&amp;lt;address&amp;gt;&lt;/span&gt;10.1.1.1&lt;span class=&quot;nt&quot;&gt;&amp;lt;/address&amp;gt;&lt;/span&gt;
                        &lt;span class=&quot;nt&quot;&gt;&amp;lt;mask&amp;gt;&lt;/span&gt;255.255.255.0&lt;span class=&quot;nt&quot;&gt;&amp;lt;/mask&amp;gt;&lt;/span&gt;
                     &lt;span class=&quot;nt&quot;&gt;&amp;lt;/primary&amp;gt;&lt;/span&gt;
                  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/address&amp;gt;&lt;/span&gt;
               &lt;span class=&quot;nt&quot;&gt;&amp;lt;/ip&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;/GigabitEthernet&amp;gt;&lt;/span&gt;
         &lt;span class=&quot;nt&quot;&gt;&amp;lt;/interface&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;/native&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;/data&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/rpc-reply&amp;gt;&lt;/span&gt;]]&amp;gt;]]&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can see the structured XML response that makes it extremely easy to programmatically get data out of devices (as well as configure them).  Say good bye to manual parsing forever.&lt;/p&gt;

&lt;h2 id=&quot;restconf&quot;&gt;RESTCONF&lt;/h2&gt;

&lt;p&gt;The RESTCONF API on IOS XE is built from the same models NETCONF is using.  You also have your choice if you want to use XML or JSON data encoding when using RESTCONF.&lt;/p&gt;

&lt;p&gt;Here we’ll use JSON.&lt;/p&gt;

&lt;p&gt;The following URL using an HTTP GET accomplishes the same thing as shown in the previous NETCONF GET operation.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;HTTP GET
http://csr1kv/restconf/api/config/native/interface/GigabitEthernet/2/ip/address
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The JSON response returned back to us is this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;{
  &quot;ned:address&quot;: {
    &quot;primary&quot;: {
      &quot;address&quot;: &quot;10.1.1.1&quot;,
      &quot;mask&quot;: &quot;255.255.255.0&quot;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This maps nicely back into a Python dictionary that we can easily parse and work with.&lt;/p&gt;

&lt;h2 id=&quot;closing&quot;&gt;Closing&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;RESTCONF and NETCONF are both model driven APIs on IOS XE&lt;/li&gt;
  &lt;li&gt;RESTCONF is &lt;strong&gt;NOT&lt;/strong&gt; the same REST API that has been on the CSR1KV or IOS XE - it’s a brand new API&lt;/li&gt;
  &lt;li&gt;You’ll need 16.3.1 to test this - the testing for this post used the CSR1KV&lt;/li&gt;
  &lt;li&gt;The RESTCONF/NETCONF APIs support 100s of YANG models - all testing here was using the native Cisco IOS model.  This is a personal favorite of mine as the full running configuration is modeled in JSON/XML.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;restconf-as-good-as-it-seems-is-not-yet-officially-supported-by-tac-and-its-actually-hidden-in-the-cli--why--who-knows--but-if-youre-interested-in-it-make-sure-cisco-is-aware&quot;&gt;RESTCONF, as good as it seems, is not yet officially supported by TAC and it’s actually &lt;strong&gt;hidden&lt;/strong&gt; in the CLI.  Why?  Who knows?  But if you’re interested in it, make sure Cisco is aware.&lt;/h3&gt;

&lt;p&gt;As you can see, there is no RESTCONF command:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;csr1(config)#rest?
% Unrecognized command
csr1(config)#rest
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;But, watch this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;csr1(config)#
csr1(config)#restconf
csr1(config)#
csr1(config)#do show run | inc restconf
restconf
csr1(config)#
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And it then works like a charm.&lt;/p&gt;

&lt;h2 id=&quot;want-to-test-netconfrestconf&quot;&gt;Want to test NETCONF/RESTCONF?&lt;/h2&gt;

&lt;p&gt;Check the Network to Code &lt;a href=&quot;https://labs.networktocode.com&quot;&gt;Labs&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;netconf-server-capabilities&quot;&gt;NETCONF Server Capabilities&lt;/h2&gt;

&lt;p&gt;RESPONSE AS DESCRIBED ABOVE&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;hello xmlns=&quot;urn:ietf:params:xml:ns:netconf:base:1.0&quot;&amp;gt;
&amp;lt;capabilities&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:netconf:base:1.0&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:netconf:base:1.1&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:netconf:capability:writable-running:1.0&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:netconf:capability:xpath:1.0&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:netconf:capability:validate:1.0&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:netconf:capability:validate:1.1&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:netconf:capability:rollback-on-error:1.0&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:netconf:capability:notification:1.0&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:netconf:capability:interleave:1.0&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://tail-f.com/ns/netconf/actions/1.0&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://tail-f.com/ns/netconf/extensions&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:netconf:capability:with-defaults:1.0?basic-mode=report-all&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults?revision=2011-06-01&amp;amp;amp;module=ietf-netconf-with-defaults&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://cisco.com/ns/example/enable?module=enable&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://cisco.com/ns/yang/ned/ios?module=ned&amp;amp;amp;revision=2016-07-01&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://cisco.com/ns/yang/ned/ios/asr1k?module=ned-asr1k&amp;amp;amp;revision=2016-04-07&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://cisco.com/yang/cisco-ia?module=cisco-ia&amp;amp;amp;revision=2016-05-20&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://cisco.com/yang/cisco-odm?module=cisco-odm&amp;amp;amp;revision=2016-05-16&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://cisco.com/yang/cisco-self-mgmt?module=cisco-self-mgmt&amp;amp;amp;revision=2016-05-14&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://tail-f.com/ns/aaa/1.1?module=tailf-aaa&amp;amp;amp;revision=2015-06-16&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://tail-f.com/ns/mibs/IPV6-TC/199812010000Z?module=IPV6-TC&amp;amp;amp;revision=1998-12-01&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://tail-f.com/ns/mibs/SNMP-COMMUNITY-MIB/200308060000Z?module=SNMP-COMMUNITY-MIB&amp;amp;amp;revision=2003-08-06&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://tail-f.com/ns/mibs/SNMP-FRAMEWORK-MIB/200210140000Z?module=SNMP-FRAMEWORK-MIB&amp;amp;amp;revision=2002-10-14&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://tail-f.com/ns/mibs/SNMP-MPD-MIB/200210140000Z?module=SNMP-MPD-MIB&amp;amp;amp;revision=2002-10-14&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://tail-f.com/ns/mibs/SNMP-NOTIFICATION-MIB/200210140000Z?module=SNMP-NOTIFICATION-MIB&amp;amp;amp;revision=2002-10-14&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://tail-f.com/ns/mibs/SNMP-TARGET-MIB/200210140000Z?module=SNMP-TARGET-MIB&amp;amp;amp;revision=2002-10-14&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://tail-f.com/ns/mibs/SNMP-USER-BASED-SM-MIB/200210160000Z?module=SNMP-USER-BASED-SM-MIB&amp;amp;amp;revision=2002-10-16&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://tail-f.com/ns/mibs/SNMP-VIEW-BASED-ACM-MIB/200210160000Z?module=SNMP-VIEW-BASED-ACM-MIB&amp;amp;amp;revision=2002-10-16&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://tail-f.com/ns/mibs/SNMPv2-MIB/200210160000Z?module=SNMPv2-MIB&amp;amp;amp;revision=2002-10-16&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://tail-f.com/ns/mibs/SNMPv2-SMI/1.0?module=SNMPv2-SMI&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://tail-f.com/ns/mibs/SNMPv2-TC/1.0?module=SNMPv2-TC&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://tail-f.com/ns/mibs/TRANSPORT-ADDRESS-MIB/200211010000Z?module=TRANSPORT-ADDRESS-MIB&amp;amp;amp;revision=2002-11-01&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://tail-f.com/ns/webui?module=tailf-webui&amp;amp;amp;revision=2013-03-07&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://tail-f.com/yang/acm?module=tailf-acm&amp;amp;amp;revision=2013-03-07&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://tail-f.com/yang/common-monitoring?module=tailf-common-monitoring&amp;amp;amp;revision=2013-06-14&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://tail-f.com/yang/confd-monitoring?module=tailf-confd-monitoring&amp;amp;amp;revision=2013-06-14&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;http://tail-f.com/yang/netconf-monitoring?module=tailf-netconf-monitoring&amp;amp;amp;revision=2014-11-13&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-acl-oper?module=cisco-acl-oper&amp;amp;amp;revision=2016-03-30&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-bfd-state?module=cisco-bfd-state&amp;amp;amp;revision=2015-04-09&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-bgp-state?module=cisco-bgp-state&amp;amp;amp;revision=2015-10-16&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-bridge-common?module=cisco-bridge-common&amp;amp;amp;revision=2014-09-25&amp;amp;amp;features=configurable-bd-mac-limit-notif,configurable-bd-mac-limit-max,configurable-bd-mac-limit-actions,configurable-bd-mac-aging-types,configurable-bd-flooding-control&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-bridge-domain?module=cisco-bridge-domain&amp;amp;amp;revision=2014-12-01&amp;amp;amp;features=parameterized-bridge-domains,configurable-bd-storm-control,configurable-bd-static-mac,configurable-bd-snooping-profiles,configurable-bd-sh-group-number,configurable-bd-mtu,configurable-bd-member-features,configurable-bd-mac-secure,configurable-bd-mac-features,configurable-bd-mac-event-action,configurable-bd-ipsg,configurable-bd-groups,configurable-bd-flooding-mode,configurable-bd-flooding,configurable-bd-dai,clear-bridge-domain&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-cfm-stats?module=cisco-cfm-stats&amp;amp;amp;revision=2015-04-09&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-cfm-stats-dev?module=cisco-cfm-stats-dev&amp;amp;amp;revision=2015-05-27&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-checkpoint-archive?module=cisco-checkpoint-archive&amp;amp;amp;revision=2015-05-20&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-efp-stats?module=cisco-efp-stats&amp;amp;amp;revision=2015-07-07&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-environment?module=cisco-environment&amp;amp;amp;revision=2015-04-09&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-ethernet?module=cisco-ethernet&amp;amp;amp;revision=2016-05-10&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-flow-monitor?module=cisco-flow-monitor&amp;amp;amp;revision=2015-10-26&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-ip-sla-stats?module=cisco-ip-sla-stats&amp;amp;amp;revision=2015-05-29&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-ip-sla-stats-dev?module=cisco-ip-sla-stats-dev&amp;amp;amp;revision=2015-06-30&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-lldp-state?module=cisco-lldp-state&amp;amp;amp;revision=2015-04-09&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-memory-stats?module=cisco-memory-stats&amp;amp;amp;revision=2015-04-09&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-mpls-fwd?module=cisco-mpls-fwd&amp;amp;amp;revision=2015-04-09&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-platform-software?module=cisco-platform-software&amp;amp;amp;revision=2015-07-09&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-process-cpu?module=cisco-process-cpu&amp;amp;amp;revision=2015-04-09&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-process-memory?module=cisco-process-memory&amp;amp;amp;revision=2015-04-09&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-qos-action-marking-cfg?module=cisco-qos-action-marking-cfg&amp;amp;amp;revision=2015-05-09&amp;amp;amp;features=set-wlan-user-priority-support,set-vlan-inner-support,set-srp-priority-support,set-qos-grp-support,set-prec-tunnel-support,set-prec-support,set-mpls-exp-top-support,set-mpls-exp-imp-support,set-fr-fecn-becn-support,set-fr-de-support,set-dscp-tunnel-support,set-discard-class-support,set-dei-support,set-dei-imp-support,set-cos-support,set-cos-inner-suppport,set-atm-clp-support&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-qos-action-oper?module=cisco-qos-action-oper&amp;amp;amp;revision=2015-05-09&amp;amp;amp;features=queue-peak-size-stats-support,priority-bandwidth-exceed-drops-support,marking-stats-support,drop-pkts-no-buffer-stats-support,drop-pkts-flow-stats-support,aggregate-priority-stats-support&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-qos-action-qlimit-cfg?module=cisco-qos-action-qlimit-cfg&amp;amp;amp;revision=2015-05-09&amp;amp;amp;features=qos-grp-based-queuing-support,mpls-exp-based-queuing-support,disc-class-based-queuing-support&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-qos-common?module=cisco-qos-common&amp;amp;amp;revision=2015-05-09&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-routing-ext?module=cisco-routing-ext&amp;amp;amp;revision=2016-07-09&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-storm-control?module=cisco-storm-control&amp;amp;amp;revision=2014-09-25&amp;amp;amp;features=configurable-storm-control-actions&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:cisco-virtual-service?module=cisco-virtual-service&amp;amp;amp;revision=2016-04-19&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:govern?module=govern&amp;amp;amp;revision=2014-07-16&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:pim?module=pim&amp;amp;amp;revision=2014-06-27&amp;amp;amp;features=bsr,auto-rp&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:pw?module=cisco-pw&amp;amp;amp;revision=2014-12-01&amp;amp;amp;features=static-label-direct-config,pw-vccv,pw-tag-impose-vlan-id,pw-status-config,pw-static-oam-config,pw-short-config,pw-sequencing,pw-preferred-path,pw-port-profiles,pw-oam-refresh-config,pw-mac-withdraw-config,pw-load-balancing,pw-ipv6-source,pw-interface,pw-grouping-config,pw-class-tag-rewrite,pw-class-switchover-delay,pw-class-status,pw-class-source-ip,pw-class-flow-setting,preferred-path-peer,predictive-redundancy-config,flow-label-tlv-code17,flow-label-static-config&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:cisco:params:xml:ns:yang:table-map?module=cisco-table-map&amp;amp;amp;revision=2015-05-19&amp;amp;amp;features=table-map-template-support&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:c3pl-types?module=policy-types&amp;amp;amp;revision=2013-10-07&amp;amp;amp;features=protocol-name-support,match-wlan-user-priority-support,match-vpls-support,match-vlan-support,match-vlan-inner-support,match-src-mac-support,match-security-group-support,match-qos-group-support,match-prec-support,match-packet-length-support,match-mpls-exp-top-support,match-mpls-exp-imp-support,match-metadata-support,match-ipv6-acl-support,match-ipv6-acl-name-support,match-ipv4-acl-support,match-ipv4-acl-name-support,match-ip-rtp-support,match-input-interface-support,match-fr-dlci-support,match-fr-de-support,match-flow-record-support,match-flow-ip-support,match-dst-mac-support,match-discard-class-support,match-dei-support,match-dei-inner-support,match-cos-support,match-cos-inner-support,match-class-map-support,match-atm-vci-support,match-atm-clp-support,match-application-support&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:cisco-ospf?module=cisco-ospf&amp;amp;amp;revision=2016-03-30&amp;amp;amp;features=graceful-shutdown,flood-reduction,database-filter&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:cisco-policy?module=cisco-policy&amp;amp;amp;revision=2016-03-30&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:cisco-policy-filters?module=cisco-policy-filters&amp;amp;amp;revision=2016-03-30&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:cisco-policy-target?module=cisco-policy-target&amp;amp;amp;revision=2016-03-30&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:common-mpls-static?module=common-mpls-static&amp;amp;amp;revision=2015-07-22&amp;amp;amp;deviations=common-mpls-static-devs&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:common-mpls-types?module=common-mpls-types&amp;amp;amp;revision=2015-05-28&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:iana-crypt-hash?module=iana-crypt-hash&amp;amp;amp;revision=2014-04-04&amp;amp;amp;features=crypt-hash-sha-512,crypt-hash-sha-256,crypt-hash-md5&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:iana-if-type?module=iana-if-type&amp;amp;amp;revision=2014-05-08&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:ietf-diffserv-action?module=ietf-diffserv-action&amp;amp;amp;revision=2015-04-07&amp;amp;amp;features=priority-rate-burst-support,hierarchial-policy-support,aqm-red-support&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:ietf-diffserv-classifier?module=ietf-diffserv-classifier&amp;amp;amp;revision=2015-04-07&amp;amp;amp;features=policy-inline-classifier-config&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:ietf-diffserv-policy?module=ietf-diffserv-policy&amp;amp;amp;revision=2015-04-07&amp;amp;amp;features=policy-template-support,hierarchial-policy-support&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:ietf-diffserv-target?module=ietf-diffserv-target&amp;amp;amp;revision=2015-04-07&amp;amp;amp;features=target-inline-policy-config&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:ietf-inet-types?module=ietf-inet-types&amp;amp;amp;revision=2013-07-15&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:ietf-interfaces?module=ietf-interfaces&amp;amp;amp;revision=2014-05-08&amp;amp;amp;features=pre-provisioning,if-mib,arbitrary-names&amp;amp;amp;deviations=ietf-ip-devs&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:ietf-interfaces-ext?module=ietf-interfaces-ext&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:ietf-ip?module=ietf-ip&amp;amp;amp;revision=2014-01-08&amp;amp;amp;features=ipv6-privacy-autoconf,ipv4-non-contiguous-netmasks&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:ietf-ipv4-unicast-routing?module=ietf-ipv4-unicast-routing&amp;amp;amp;revision=2015-05-25&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:ietf-ipv6-unicast-routing?module=ietf-ipv6-unicast-routing&amp;amp;amp;revision=2015-05-25&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:ietf-key-chain?module=ietf-key-chain&amp;amp;amp;revision=2015-02-24&amp;amp;amp;features=independent-send-accept-lifetime,hex-key-string,accept-tolerance&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:ietf-netconf-acm?module=ietf-netconf-acm&amp;amp;amp;revision=2012-02-22&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring&amp;amp;amp;revision=2010-10-04&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:ietf-netconf-notifications?module=ietf-netconf-notifications&amp;amp;amp;revision=2012-02-06&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:ietf-ospf?module=ietf-ospf&amp;amp;amp;revision=2015-03-09&amp;amp;amp;features=ttl-security,te-rid,router-id,remote-lfa,prefix-suppression,ospfv3-authentication-ipsec,nsr,node-flag,multi-topology,multi-area-adj,mtu-ignore,max-lsa,max-ecmp,lls,lfa,ldp-igp-sync,ldp-igp-autoconfig,interface-inheritance,instance-inheritance,graceful-restart,fast-reroute,demand-circuit,bfd,auto-cost,area-inheritance,admin-control&amp;amp;amp;deviations=ietf-ospf-devs&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:ietf-routing?module=ietf-routing&amp;amp;amp;revision=2015-05-25&amp;amp;amp;features=router-id,multiple-ribs&amp;amp;amp;deviations=ietf-ipv4-unicast-routing-devs,ietf-ipv6-unicast-routing-devs,ietf-ospf-devs,ietf-routing-devs&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:ietf-yang-smiv2?module=ietf-yang-smiv2&amp;amp;amp;revision=2012-06-22&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:ietf-yang-types?module=ietf-yang-types&amp;amp;amp;revision=2013-07-15&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:nvo?module=nvo&amp;amp;amp;revision=2015-06-02&amp;amp;amp;deviations=nvo-devs&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:policy-attr?module=policy-attr&amp;amp;amp;revision=2015-04-27&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:ATM-FORUM-TC-MIB?module=ATM-FORUM-TC-MIB&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:ATM-MIB?module=ATM-MIB&amp;amp;amp;revision=1998-10-19&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:ATM-TC-MIB?module=ATM-TC-MIB&amp;amp;amp;revision=1998-10-19&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:BGP4-MIB?module=BGP4-MIB&amp;amp;amp;revision=1994-05-05&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:BRIDGE-MIB?module=BRIDGE-MIB&amp;amp;amp;revision=2005-09-19&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-AAA-SERVER-MIB?module=CISCO-AAA-SERVER-MIB&amp;amp;amp;revision=2003-11-17&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-AAA-SESSION-MIB?module=CISCO-AAA-SESSION-MIB&amp;amp;amp;revision=2006-03-21&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-AAL5-MIB?module=CISCO-AAL5-MIB&amp;amp;amp;revision=2003-09-22&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-ATM-EXT-MIB?module=CISCO-ATM-EXT-MIB&amp;amp;amp;revision=2003-01-06&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-ATM-PVCTRAP-EXTN-MIB?module=CISCO-ATM-PVCTRAP-EXTN-MIB&amp;amp;amp;revision=2003-01-20&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-ATM-QOS-MIB?module=CISCO-ATM-QOS-MIB&amp;amp;amp;revision=2002-06-10&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-BGP-POLICY-ACCOUNTING-MIB?module=CISCO-BGP-POLICY-ACCOUNTING-MIB&amp;amp;amp;revision=2002-07-26&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-BGP4-MIB?module=CISCO-BGP4-MIB&amp;amp;amp;revision=2010-09-30&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-BULK-FILE-MIB?module=CISCO-BULK-FILE-MIB&amp;amp;amp;revision=2002-06-10&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-CBP-TARGET-MIB?module=CISCO-CBP-TARGET-MIB&amp;amp;amp;revision=2006-05-24&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-CBP-TARGET-TC-MIB?module=CISCO-CBP-TARGET-TC-MIB&amp;amp;amp;revision=2006-03-24&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-CBP-TC-MIB?module=CISCO-CBP-TC-MIB&amp;amp;amp;revision=2008-06-24&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-CDP-MIB?module=CISCO-CDP-MIB&amp;amp;amp;revision=2005-03-21&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-CEF-TC?module=CISCO-CEF-TC&amp;amp;amp;revision=2005-09-30&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-CONFIG-COPY-MIB?module=CISCO-CONFIG-COPY-MIB&amp;amp;amp;revision=2005-04-06&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-CONFIG-MAN-MIB?module=CISCO-CONFIG-MAN-MIB&amp;amp;amp;revision=2007-04-27&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-CONTEXT-MAPPING-MIB?module=CISCO-CONTEXT-MAPPING-MIB&amp;amp;amp;revision=2008-11-22&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-DATA-COLLECTION-MIB?module=CISCO-DATA-COLLECTION-MIB&amp;amp;amp;revision=2002-10-30&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-DIAL-CONTROL-MIB?module=CISCO-DIAL-CONTROL-MIB&amp;amp;amp;revision=2005-05-26&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-DOT3-OAM-MIB?module=CISCO-DOT3-OAM-MIB&amp;amp;amp;revision=2006-05-31&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-DYNAMIC-TEMPLATE-MIB?module=CISCO-DYNAMIC-TEMPLATE-MIB&amp;amp;amp;revision=2007-09-06&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-DYNAMIC-TEMPLATE-TC-MIB?module=CISCO-DYNAMIC-TEMPLATE-TC-MIB&amp;amp;amp;revision=2012-01-27&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-EIGRP-MIB?module=CISCO-EIGRP-MIB&amp;amp;amp;revision=2004-11-16&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-EMBEDDED-EVENT-MGR-MIB?module=CISCO-EMBEDDED-EVENT-MGR-MIB&amp;amp;amp;revision=2006-11-07&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-ENTITY-ALARM-MIB?module=CISCO-ENTITY-ALARM-MIB&amp;amp;amp;revision=1999-07-06&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-ENTITY-FRU-CONTROL-MIB?module=CISCO-ENTITY-FRU-CONTROL-MIB&amp;amp;amp;revision=2013-08-19&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-ENTITY-SENSOR-MIB?module=CISCO-ENTITY-SENSOR-MIB&amp;amp;amp;revision=2015-01-15&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-ENTITY-VENDORTYPE-OID-MIB?module=CISCO-ENTITY-VENDORTYPE-OID-MIB&amp;amp;amp;revision=2014-12-09&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-ETHERLIKE-EXT-MIB?module=CISCO-ETHERLIKE-EXT-MIB&amp;amp;amp;revision=2010-06-04&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-FIREWALL-TC?module=CISCO-FIREWALL-TC&amp;amp;amp;revision=2006-03-03&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-FTP-CLIENT-MIB?module=CISCO-FTP-CLIENT-MIB&amp;amp;amp;revision=2006-03-31&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-HSRP-EXT-MIB?module=CISCO-HSRP-EXT-MIB&amp;amp;amp;revision=2010-09-02&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-HSRP-MIB?module=CISCO-HSRP-MIB&amp;amp;amp;revision=2010-09-06&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IETF-ATM2-PVCTRAP-MIB?module=CISCO-IETF-ATM2-PVCTRAP-MIB&amp;amp;amp;revision=1998-02-03&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IETF-ATM2-PVCTRAP-MIB-EXTN?module=CISCO-IETF-ATM2-PVCTRAP-MIB-EXTN&amp;amp;amp;revision=2000-07-11&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IETF-BFD-MIB?module=CISCO-IETF-BFD-MIB&amp;amp;amp;revision=2011-04-16&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IETF-FRR-MIB?module=CISCO-IETF-FRR-MIB&amp;amp;amp;revision=2008-04-29&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IETF-ISIS-MIB?module=CISCO-IETF-ISIS-MIB&amp;amp;amp;revision=2005-08-16&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IETF-MPLS-ID-STD-03-MIB?module=CISCO-IETF-MPLS-ID-STD-03-MIB&amp;amp;amp;revision=2012-06-07&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IETF-MPLS-TE-EXT-STD-03-MIB?module=CISCO-IETF-MPLS-TE-EXT-STD-03-MIB&amp;amp;amp;revision=2012-06-06&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IETF-PW-ATM-MIB?module=CISCO-IETF-PW-ATM-MIB&amp;amp;amp;revision=2005-04-19&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IETF-PW-ENET-MIB?module=CISCO-IETF-PW-ENET-MIB&amp;amp;amp;revision=2002-09-22&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IETF-PW-MIB?module=CISCO-IETF-PW-MIB&amp;amp;amp;revision=2004-03-17&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IETF-PW-MPLS-MIB?module=CISCO-IETF-PW-MPLS-MIB&amp;amp;amp;revision=2003-02-26&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IETF-PW-TC-MIB?module=CISCO-IETF-PW-TC-MIB&amp;amp;amp;revision=2006-07-21&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IETF-PW-TDM-MIB?module=CISCO-IETF-PW-TDM-MIB&amp;amp;amp;revision=2006-07-21&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IF-EXTENSION-MIB?module=CISCO-IF-EXTENSION-MIB&amp;amp;amp;revision=2013-03-13&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IMAGE-LICENSE-MGMT-MIB?module=CISCO-IMAGE-LICENSE-MGMT-MIB&amp;amp;amp;revision=2007-10-16&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IMAGE-MIB?module=CISCO-IMAGE-MIB&amp;amp;amp;revision=1995-08-15&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IP-LOCAL-POOL-MIB?module=CISCO-IP-LOCAL-POOL-MIB&amp;amp;amp;revision=2007-11-12&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IP-TAP-MIB?module=CISCO-IP-TAP-MIB&amp;amp;amp;revision=2004-03-11&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IP-URPF-MIB?module=CISCO-IP-URPF-MIB&amp;amp;amp;revision=2011-12-29&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IPMROUTE-MIB?module=CISCO-IPMROUTE-MIB&amp;amp;amp;revision=2005-03-07&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IPSEC-FLOW-MONITOR-MIB?module=CISCO-IPSEC-FLOW-MONITOR-MIB&amp;amp;amp;revision=2007-10-24&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IPSEC-POLICY-MAP-MIB?module=CISCO-IPSEC-POLICY-MAP-MIB&amp;amp;amp;revision=2000-08-17&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IPSLA-AUTOMEASURE-MIB?module=CISCO-IPSLA-AUTOMEASURE-MIB&amp;amp;amp;revision=2007-06-13&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IPSLA-ECHO-MIB?module=CISCO-IPSLA-ECHO-MIB&amp;amp;amp;revision=2007-08-16&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IPSLA-JITTER-MIB?module=CISCO-IPSLA-JITTER-MIB&amp;amp;amp;revision=2007-07-24&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-IPSLA-TC-MIB?module=CISCO-IPSLA-TC-MIB&amp;amp;amp;revision=2007-03-23&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-MEDIA-GATEWAY-MIB?module=CISCO-MEDIA-GATEWAY-MIB&amp;amp;amp;revision=2009-02-25&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-MPLS-LSR-EXT-STD-MIB?module=CISCO-MPLS-LSR-EXT-STD-MIB&amp;amp;amp;revision=2012-04-30&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-MPLS-TC-EXT-STD-MIB?module=CISCO-MPLS-TC-EXT-STD-MIB&amp;amp;amp;revision=2012-02-22&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-NBAR-PROTOCOL-DISCOVERY-MIB?module=CISCO-NBAR-PROTOCOL-DISCOVERY-MIB&amp;amp;amp;revision=2002-08-16&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-NTP-MIB?module=CISCO-NTP-MIB&amp;amp;amp;revision=2006-07-31&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-OSPF-MIB?module=CISCO-OSPF-MIB&amp;amp;amp;revision=2003-07-18&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-OSPF-TRAP-MIB?module=CISCO-OSPF-TRAP-MIB&amp;amp;amp;revision=2003-07-18&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-PIM-MIB?module=CISCO-PIM-MIB&amp;amp;amp;revision=2000-11-02&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-PING-MIB?module=CISCO-PING-MIB&amp;amp;amp;revision=2001-08-28&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-PRODUCTS-MIB?module=CISCO-PRODUCTS-MIB&amp;amp;amp;revision=2014-11-06&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-PTP-MIB?module=CISCO-PTP-MIB&amp;amp;amp;revision=2011-01-28&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-QOS-PIB-MIB?module=CISCO-QOS-PIB-MIB&amp;amp;amp;revision=2007-08-29&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-RADIUS-EXT-MIB?module=CISCO-RADIUS-EXT-MIB&amp;amp;amp;revision=2010-05-25&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-RF-MIB?module=CISCO-RF-MIB&amp;amp;amp;revision=2005-09-01&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-RTTMON-TC-MIB?module=CISCO-RTTMON-TC-MIB&amp;amp;amp;revision=2012-05-25&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-SESS-BORDER-CTRLR-CALL-STATS-MIB?module=CISCO-SESS-BORDER-CTRLR-CALL-STATS-MIB&amp;amp;amp;revision=2010-09-03&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-SESS-BORDER-CTRLR-STATS-MIB?module=CISCO-SESS-BORDER-CTRLR-STATS-MIB&amp;amp;amp;revision=2010-09-15&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-SMI?module=CISCO-SMI&amp;amp;amp;revision=2012-08-29&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-SONET-MIB?module=CISCO-SONET-MIB&amp;amp;amp;revision=2003-03-07&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-ST-TC?module=CISCO-ST-TC&amp;amp;amp;revision=2012-08-08&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-STP-EXTENSIONS-MIB?module=CISCO-STP-EXTENSIONS-MIB&amp;amp;amp;revision=2013-03-07&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-SUBSCRIBER-IDENTITY-TC-MIB?module=CISCO-SUBSCRIBER-IDENTITY-TC-MIB&amp;amp;amp;revision=2011-12-23&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-SUBSCRIBER-SESSION-MIB?module=CISCO-SUBSCRIBER-SESSION-MIB&amp;amp;amp;revision=2012-08-08&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-SUBSCRIBER-SESSION-TC-MIB?module=CISCO-SUBSCRIBER-SESSION-TC-MIB&amp;amp;amp;revision=2012-01-27&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-SYSLOG-MIB?module=CISCO-SYSLOG-MIB&amp;amp;amp;revision=2005-12-03&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-TAP2-MIB?module=CISCO-TAP2-MIB&amp;amp;amp;revision=2009-11-06&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-TC?module=CISCO-TC&amp;amp;amp;revision=2011-11-11&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-UBE-MIB?module=CISCO-UBE-MIB&amp;amp;amp;revision=2010-11-29&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB?module=CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB&amp;amp;amp;revision=2013-07-15&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-VLAN-MEMBERSHIP-MIB?module=CISCO-VLAN-MEMBERSHIP-MIB&amp;amp;amp;revision=2007-12-14&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-VOICE-COMMON-DIAL-CONTROL-MIB?module=CISCO-VOICE-COMMON-DIAL-CONTROL-MIB&amp;amp;amp;revision=2010-06-30&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-VOICE-DIAL-CONTROL-MIB?module=CISCO-VOICE-DIAL-CONTROL-MIB&amp;amp;amp;revision=2012-05-15&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-VOICE-DNIS-MIB?module=CISCO-VOICE-DNIS-MIB&amp;amp;amp;revision=2002-05-01&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-VPDN-MGMT-MIB?module=CISCO-VPDN-MGMT-MIB&amp;amp;amp;revision=2009-06-16&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:CISCO-VTP-MIB?module=CISCO-VTP-MIB&amp;amp;amp;revision=2013-10-14&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:DIAL-CONTROL-MIB?module=DIAL-CONTROL-MIB&amp;amp;amp;revision=1996-09-23&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:DIFFSERV-DSCP-TC?module=DIFFSERV-DSCP-TC&amp;amp;amp;revision=2002-05-09&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:DIFFSERV-MIB?module=DIFFSERV-MIB&amp;amp;amp;revision=2002-02-07&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:DISMAN-EVENT-MIB?module=DISMAN-EVENT-MIB&amp;amp;amp;revision=2000-10-16&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:DISMAN-EXPRESSION-MIB?module=DISMAN-EXPRESSION-MIB&amp;amp;amp;revision=2000-10-16&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:DRAFT-MSDP-MIB?module=DRAFT-MSDP-MIB&amp;amp;amp;revision=1999-12-16&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:DS1-MIB?module=DS1-MIB&amp;amp;amp;revision=1998-08-01&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:DS3-MIB?module=DS3-MIB&amp;amp;amp;revision=1998-08-01&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:ENTITY-MIB?module=ENTITY-MIB&amp;amp;amp;revision=2005-08-10&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:ENTITY-SENSOR-MIB?module=ENTITY-SENSOR-MIB&amp;amp;amp;revision=2002-12-16&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:ENTITY-STATE-MIB?module=ENTITY-STATE-MIB&amp;amp;amp;revision=2005-11-22&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:ENTITY-STATE-TC-MIB?module=ENTITY-STATE-TC-MIB&amp;amp;amp;revision=2005-11-22&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:ETHER-WIS?module=ETHER-WIS&amp;amp;amp;revision=2003-09-19&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:EXPRESSION-MIB?module=EXPRESSION-MIB&amp;amp;amp;revision=2005-11-24&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:EtherLike-MIB?module=EtherLike-MIB&amp;amp;amp;revision=2003-09-19&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:FRAME-RELAY-DTE-MIB?module=FRAME-RELAY-DTE-MIB&amp;amp;amp;revision=1997-05-01&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:HCNUM-TC?module=HCNUM-TC&amp;amp;amp;revision=2000-06-08&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:IANA-ADDRESS-FAMILY-NUMBERS-MIB?module=IANA-ADDRESS-FAMILY-NUMBERS-MIB&amp;amp;amp;revision=2000-09-08&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:IANA-RTPROTO-MIB?module=IANA-RTPROTO-MIB&amp;amp;amp;revision=2000-09-26&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:IANAifType-MIB?module=IANAifType-MIB&amp;amp;amp;revision=2006-03-31&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:IEEE8021-TC-MIB?module=IEEE8021-TC-MIB&amp;amp;amp;revision=2008-10-15&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:IF-MIB?module=IF-MIB&amp;amp;amp;revision=2000-06-14&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:IGMP-STD-MIB?module=IGMP-STD-MIB&amp;amp;amp;revision=2000-09-28&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:INET-ADDRESS-MIB?module=INET-ADDRESS-MIB&amp;amp;amp;revision=2005-02-04&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:INT-SERV-MIB?module=INT-SERV-MIB&amp;amp;amp;revision=1997-10-03&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:INTEGRATED-SERVICES-MIB?module=INTEGRATED-SERVICES-MIB&amp;amp;amp;revision=1995-11-03&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:IP-FORWARD-MIB?module=IP-FORWARD-MIB&amp;amp;amp;revision=1996-09-19&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:IP-MIB?module=IP-MIB&amp;amp;amp;revision=2006-02-02&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:IPMROUTE-STD-MIB?module=IPMROUTE-STD-MIB&amp;amp;amp;revision=2000-09-22&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:IPV6-FLOW-LABEL-MIB?module=IPV6-FLOW-LABEL-MIB&amp;amp;amp;revision=2003-08-28&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:MPLS-L3VPN-STD-MIB?module=MPLS-L3VPN-STD-MIB&amp;amp;amp;revision=2006-01-23&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:MPLS-LDP-GENERIC-STD-MIB?module=MPLS-LDP-GENERIC-STD-MIB&amp;amp;amp;revision=2004-06-03&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:MPLS-LDP-STD-MIB?module=MPLS-LDP-STD-MIB&amp;amp;amp;revision=2004-06-03&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:MPLS-LSR-STD-MIB?module=MPLS-LSR-STD-MIB&amp;amp;amp;revision=2004-06-03&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:MPLS-TC-MIB?module=MPLS-TC-MIB&amp;amp;amp;revision=2001-01-04&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:MPLS-TC-STD-MIB?module=MPLS-TC-STD-MIB&amp;amp;amp;revision=2004-06-03&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:MPLS-TE-STD-MIB?module=MPLS-TE-STD-MIB&amp;amp;amp;revision=2004-06-03&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:NHRP-MIB?module=NHRP-MIB&amp;amp;amp;revision=1999-08-26&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:NOTIFICATION-LOG-MIB?module=NOTIFICATION-LOG-MIB&amp;amp;amp;revision=2000-11-27&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:OSPF-MIB?module=OSPF-MIB&amp;amp;amp;revision=2006-11-10&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:OSPF-TRAP-MIB?module=OSPF-TRAP-MIB&amp;amp;amp;revision=2006-11-10&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:P-BRIDGE-MIB?module=P-BRIDGE-MIB&amp;amp;amp;revision=2006-01-09&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:PIM-MIB?module=PIM-MIB&amp;amp;amp;revision=2000-09-28&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:PerfHist-TC-MIB?module=PerfHist-TC-MIB&amp;amp;amp;revision=1998-11-07&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:RFC-1212?module=RFC-1212&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:RFC-1215?module=RFC-1215&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:RFC1155-SMI?module=RFC1155-SMI&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:RFC1315-MIB?module=RFC1315-MIB&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:RMON-MIB?module=RMON-MIB&amp;amp;amp;revision=2000-05-11&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:RSVP-MIB?module=RSVP-MIB&amp;amp;amp;revision=1998-08-25&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:SNMP-FRAMEWORK-MIB?module=SNMP-FRAMEWORK-MIB&amp;amp;amp;revision=2002-10-14&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:SNMP-PROXY-MIB?module=SNMP-PROXY-MIB&amp;amp;amp;revision=2002-10-14&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:SNMP-TARGET-MIB?module=SNMP-TARGET-MIB&amp;amp;amp;revision=1998-08-04&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:SNMPv2-MIB?module=SNMPv2-MIB&amp;amp;amp;revision=2002-10-16&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:SNMPv2-TC?module=SNMPv2-TC&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:SONET-MIB?module=SONET-MIB&amp;amp;amp;revision=2003-08-11&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:TCP-MIB?module=TCP-MIB&amp;amp;amp;revision=2005-02-18&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:TOKEN-RING-RMON-MIB?module=TOKEN-RING-RMON-MIB&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:TOKENRING-MIB?module=TOKENRING-MIB&amp;amp;amp;revision=1994-10-23&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:TUNNEL-MIB?module=TUNNEL-MIB&amp;amp;amp;revision=2005-05-16&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:UDP-MIB?module=UDP-MIB&amp;amp;amp;revision=2005-05-20&amp;lt;/capability&amp;gt;
&amp;lt;capability&amp;gt;urn:ietf:params:xml:ns:yang:smiv2:VPN-TC-STD-MIB?module=VPN-TC-STD-MIB&amp;amp;amp;revision=2005-11-15&amp;lt;/capability&amp;gt;
&amp;lt;/capabilities&amp;gt;
&amp;lt;session-id&amp;gt;729&amp;lt;/session-id&amp;gt;&amp;lt;/hello&amp;gt;]]&amp;gt;]]&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

</description>
      <pubDate>Fri, 14 Oct 2016 00:00:00 +0000</pubDate>
      </item>
    
      <item>
      <title>Launching Network to Code On Demand Labs</title>
      <link>https://jedelman.com/home/launching-network-to-code-on-demand-labs/</link>
      <guid isPermaLink="true">https://jedelman.com/home/launching-network-to-code-on-demand-labs/</guid>
      <description>&lt;p&gt;I changed things up this week and wrote an article on LinkedIn about the launch of the &lt;a href=&quot;https://www.linkedin.com/pulse/self-service-demand-network-infrastructure-jason-edelman?trk=pulse_spock-articles&quot;&gt;Network to Code On Demand Labs platform&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It is a cloud based service that allows you to launch any number of network topologies in minutes for simulations, labs, demos, and testing.&lt;/p&gt;

&lt;p&gt;Check it out if you want 22 hours free of on-demand network access to devices of your choice!&lt;/p&gt;

&lt;p&gt;Thanks,&lt;/p&gt;

&lt;p&gt;Jason&lt;/p&gt;

&lt;p&gt;@jedelman8&lt;/p&gt;

</description>
      <pubDate>Fri, 07 Oct 2016 00:00:00 +0000</pubDate>
      </item>
    
      <item>
      <title>OpenConfig, RESTCONF, and Automated Cable Verification at iNOG9</title>
      <link>https://jedelman.com/home/openconfig-restconf-and-automated-cable-verification-at-inog9/</link>
      <guid isPermaLink="true">https://jedelman.com/home/openconfig-restconf-and-automated-cable-verification-at-inog9/</guid>
      <description>&lt;p&gt;Last week I was in Dublin for business which just so happened to overlap with &lt;a href=&quot;http://www.meetup.com/Irish-Network-Operators-Group/events/227495670/&quot;&gt;iNOG9&lt;/a&gt;, which was last Wednesday.  As luck would have it, I had the opportunity to speak at iNOG9 about network automation.&lt;/p&gt;

&lt;p&gt;You can watch the video if you want to see the &lt;a href=&quot;https://www.youtube.com/watch?v=fS_q7o98JKI&quot;&gt;presentation&lt;/a&gt;, but the three mini demos I gave were:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Cable verification on Juniper vMX devices using Ansible&lt;/li&gt;
  &lt;li&gt;Automating BGP on IOS-XR using OpenConfig BGP models using Ansible&lt;/li&gt;
  &lt;li&gt;Using Postman to explore and demo the new RESTCONF/YANG interface on IOS XE.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Few words about each.&lt;/p&gt;

&lt;h2 id=&quot;cable-verification&quot;&gt;Cable verification&lt;/h2&gt;

&lt;p&gt;Usually when the topic of network automation comes up, configuration management is &lt;em&gt;assumed&lt;/em&gt;.  It should &lt;strong&gt;not&lt;/strong&gt; be as there are so many other forms and types of automation.  Here I showed how we can verify cabling (via neighbors) is accurate on a Junos vMX topology.  Of course, the hard part here is having the discipline to define the desired cabling topology first.  Note: links for sample playbooks can be found below on the GitHub repo.&lt;/p&gt;

&lt;h2 id=&quot;openconfig-bgp-automation-with-ansible&quot;&gt;OpenConfig BGP Automation with Ansible&lt;/h2&gt;

&lt;p&gt;I built a custom Ansible module built around NETCONF (ncclient), but uses the OpenConfig YANG model for global BGP configuration.  For example, this is the XML representation of this YANG model that would be pushed over NETCONF:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Note: this is why Ansible is a great and extensible platform as this was a custom module built in just a few hours for this demo/presentation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;config&amp;gt;&lt;/span&gt;
 &lt;span class=&quot;nt&quot;&gt;&amp;lt;bgp&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://openconfig.net/yang/bgp&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;nc:operation=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;global&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;config&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;as&amp;gt;&lt;/span&gt;65512&lt;span class=&quot;nt&quot;&gt;&amp;lt;/as&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;router-id&amp;gt;&lt;/span&gt;100.1.1.1&lt;span class=&quot;nt&quot;&gt;&amp;lt;/router-id&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;/config&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/global&amp;gt;&lt;/span&gt;
 &lt;span class=&quot;nt&quot;&gt;&amp;lt;/bgp&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/config&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In theory, the Ansible task below should work on any vendor supporting NETCONF + OC-BGP.  Over time, we’ll try and add gRPC and RESTCONF transport types too.  Yes, it’s basic now as it only supports BGP AS and ROUTER ID, but the point is to show what vendor neutral data models offer.&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ENSURE DEVICES HAVE PROPER ASN AND RID&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;oc_bgp&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;asn&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;65536&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;router_id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;10.1.1.1&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;present&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;strong&gt;oc_bgp&lt;/strong&gt; Ansible module can found at the link below along with the sample playbook used at iNOG, etc.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks to @GabrieleGerbino for helping update some portions of the code.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;restconf-on-ios-xe&quot;&gt;RESTCONF on IOS-XE&lt;/h2&gt;

&lt;p&gt;I only had 20 short minutes to speak at iNOG and wish I could have spent more time showing off the new RESTCONF (and NETCONF) interfaces on IOS XE  (yes, they are fully driven by YANG models).  The RESTCONF interface is pretty awesome if I may say - it’s an http wrapper for using the same models that have been predominantly exposed by NETCONF/XML interfaces on other device types, but now with RESTCONF we can access them with native REST and use JSON or XML encoding!&lt;/p&gt;

&lt;p&gt;Even better, and this is what I demo’d, is the proper implementation of HTTP verbs for a REST API.  The example I gave was this:&lt;/p&gt;

&lt;p&gt;The following API call as a HTTP &lt;strong&gt;PATCH&lt;/strong&gt; simply &lt;em&gt;adds&lt;/em&gt; two routes to the static routing table.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; http://csr/restconf/api/config/native/ip/route  (PATCH)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;{
  &quot;ned:route&quot;: {
    &quot;ip-route-interface-forwarding-list&quot;: [
      {
        &quot;prefix&quot;: &quot;10.1.20.0&quot;,
        &quot;mask&quot;: &quot;255.255.255.0&quot;,
        &quot;fwd-list&quot;: [
          {
            &quot;fwd&quot;: &quot;10.0.0.2&quot;
          }
        ]
      },
      {
        &quot;prefix&quot;: &quot;10.1.30.0&quot;,
        &quot;mask&quot;: &quot;255.255.255.0&quot;,
        &quot;fwd-list&quot;: [
          {
            &quot;fwd&quot;: &quot;10.0.0.2&quot;
          }
        ]
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is standard and most commonly done today by network operators using the CLI.&lt;/p&gt;

&lt;p&gt;Here is the magic though.  The next API call using a HTTP &lt;strong&gt;PUT&lt;/strong&gt; declaratively states that this route(s) should be the only routes that exist in the static routing table - this means any other route in the static routing table will be purged.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; http://csr/restconf/api/config/native/ip/route  (PUT)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;{
  &quot;ned:route&quot;: {
    &quot;ip-route-interface-forwarding-list&quot;: [
      {
        &quot;prefix&quot;: &quot;0.0.0.0&quot;,
        &quot;mask&quot;: &quot;0.0.0.0&quot;,
        &quot;fwd-list&quot;: [
          {
            &quot;fwd&quot;: &quot;10.0.0.2&quot;
          }
        ]
      }
    ]
  }
}

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The end result is a single default static route in the static RT.&lt;/p&gt;

&lt;p&gt;This is massively valuable. This means you do NOT need any command negations, i.e. imagine having a 100 static routes and you wanted to remove them all today.  How would you do it today?  How will you do it tomorrow? Command negations is one of the barriers to get over with any form of automation.&lt;/p&gt;

&lt;h2 id=&quot;closing&quot;&gt;Closing&lt;/h2&gt;

&lt;p&gt;As always, any questions, just reach out.  All materials from this presentation including slides, playbooks, and files can be  found &lt;a href=&quot;https://github.com/networktocode/inog9&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The video from iNOG9 can be found &lt;a href=&quot;https://www.youtube.com/watch?v=fS_q7o98JKI&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks,&lt;/p&gt;

&lt;p&gt;Jason&lt;/p&gt;

&lt;p&gt;@jedelman8&lt;/p&gt;

</description>
      <pubDate>Wed, 05 Oct 2016 00:00:00 +0000</pubDate>
      </item>
    
      <item>
      <title>Network to Code and General Update</title>
      <link>https://jedelman.com/home/network-to-code-and-general-update/</link>
      <guid isPermaLink="true">https://jedelman.com/home/network-to-code-and-general-update/</guid>
      <description>&lt;p&gt;It’s been a long time since my last post, way longer than I’d like. For the last several months &lt;a href=&quot;http://networktocode.com/&quot;&gt;we’ve&lt;/a&gt; been neck deep in network automation. This post focuses on the highlights of not only what I’ve been up to, but also the rest of the Network to Code team.  More detailed posts will come over the coming days and weeks.&lt;/p&gt;

&lt;h2 id=&quot;training&quot;&gt;Training&lt;/h2&gt;

&lt;p&gt;As you can see from the website, we have a good number of &lt;a href=&quot;http://networktocode.com/products/training/&quot;&gt;public courses&lt;/a&gt; on network automation and even a few starting early next year that are completely virtual, but the majority of our training engagements have been private on-site instructor-led courses with Enterprises and Global Carriers.  The private courses have varied from using the same course outline you see on the website, but have also been modified for a particular vendor, device type, and/or API.  Popular topics covered in our training include Ansible, Python, NETCONF/RESTCONF/YANG, and  various vendor APIs including Nexus NX-API, Arista eAPI, Juniper’s XML API, to Cisco’s new NETCONF/RESTCONF APIs on IOS XE.&lt;/p&gt;

&lt;h2 id=&quot;software-development&quot;&gt;Software Development&lt;/h2&gt;

&lt;p&gt;We’ve contributed to various open source projects, but key highlights include contributions to Ansible &lt;a href=&quot;https://github.com/ansible/ansible-modules-core&quot;&gt;modules&lt;/a&gt; that are now part of core as well as adding Palo Alto Networks (PAN) drivers to both &lt;a href=&quot;https://github.com/ktbyers/netmiko&quot;&gt;netmiko&lt;/a&gt; and &lt;a href=&quot;https://github.com/napalm-automation/&quot;&gt;NAPALM&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;professional-services&quot;&gt;Professional Services&lt;/h2&gt;

&lt;p&gt;We’ve worked with companies of all shapes and sizes over the past several months to adopt network automation strategies and tooling.  Performing small automation tasks and writing playbooks is quite easy to get started, but does not compare to the intricate detail and patience needed to automate workflows in production environments.&lt;/p&gt;

&lt;h2 id=&quot;on-demand-labs&quot;&gt;On Demand Labs&lt;/h2&gt;

&lt;p&gt;I originally wrote about &lt;a href=&quot;/home/on-demand-network-labs&quot;&gt;this&lt;/a&gt; months ago, but we’re finally at a place to fully offer up the &lt;a href=&quot;https://labs.networktocode.com/&quot;&gt;Network to Code On Demand Labs&lt;/a&gt; platform.  This is a cloud platform that allows you to launch nearly any network topology in a matter of minutes lowering the barrier to start testing and automating.&lt;/p&gt;

&lt;p&gt;We already have close to twenty pre-built topologies and a growing amount of &lt;a href=&quot;http://networktocode.com/products/labs/tutorials/&quot;&gt;tutorials&lt;/a&gt;, but will be adding even more over the coming weeks.  Several companies have already purchased &lt;em&gt;promotion codes&lt;/em&gt; in bulk for various use cases ranging from lab testing to simulation to vendor POCs and demos.&lt;/p&gt;

&lt;p&gt;Check it out &lt;a href=&quot;https://labs.networktocode.com/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id=&quot;closing&quot;&gt;Closing&lt;/h1&gt;

&lt;p&gt;I’m merely using this post as a vehicle for providing everyone an update on where I’ve been and what’s been going on, but clearly this is not just me doing all of the work.  Huge thanks to the team for making all of this happen, and I’m sure we’ll have more to update everyone on in the coming months.  By the way, we are hiring, so please apply if you’re interested.&lt;/p&gt;

&lt;p&gt;As always- if you’re interested in talking automation or exploring how we can help, don’t hesitate to reach out - jason at networktocode dot com.&lt;/p&gt;

&lt;p&gt;Thanks,&lt;/p&gt;

&lt;p&gt;Jason&lt;/p&gt;

&lt;p&gt;@jedelman8&lt;/p&gt;

</description>
      <pubDate>Tue, 04 Oct 2016 00:00:00 +0000</pubDate>
      </item>
    
      <item>
      <title>On Demand Network Labs [FREE]</title>
      <link>https://jedelman.com/home/on-demand-network-labs/</link>
      <guid isPermaLink="true">https://jedelman.com/home/on-demand-network-labs/</guid>
      <description>&lt;p&gt;Way too often do we want to learn a new technology, but end up spending countless hours just getting the product, tool, or technology downloaded, installed, and at a point to begin using.  This is unacceptable.&lt;/p&gt;

&lt;p&gt;We need a platform that offers on-demand network infrastructure labs that makes it extremely easy to test and learn how to use network device APIs, how to write code against a network device, and how to use DevOps tool chains in the context of networking.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;It’s true, this has all become easier with tools such as Virtual Box and Vagrant, but you can still spend the same amount of time getting the underlying infrastructure setup as you spend on the actual tests you need to perform.  In that model, you also need to be able have enough horsepower to run enough virtual machines as well, which often isn’t the case.  On top of that, many Enterprises don’t  allow tools such as these to be installed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;on-demand-network-labs&quot;&gt;On Demand Network Labs&lt;/h1&gt;

&lt;p&gt;What I am proposing and getting ready to launch is a cloud based platform that allows you to launch pre-built network topologies in minutes.  Upon launch, they are ready to be used, automated, and managed - fully eliminating the time and hassle often required to get started.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;When launched, this will be the &lt;a href=&quot;http://networktocode.com&quot;&gt;Network to Code&lt;/a&gt; On Demand Network Labs platform.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Many vendors have &lt;em&gt;online labs&lt;/em&gt; - this is that, but from a multi-vendor and independent perspective.  Need a leaf spine from vendor X?  Need a multi-node routed WAN from vendor Y?  Want to see first hand how to use Puppet on a network device from vendor Z?  Sweet, well in just about 10 minutes, we get the virtual labs spun up and give you access to not only a pre-built jump host, but also a public IP address per device!  And yes, there are tutorials to follow.&lt;/p&gt;

&lt;p&gt;Here is a sneak peak:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/ntc_labs_home.png&quot; alt=&quot;NTCLABS&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;calling-early-adopters&quot;&gt;Calling Early Adopters&lt;/h1&gt;

&lt;p&gt;Are you interested in being an early user of our platform?  If so, you need to do one thing. Email us at &lt;a href=&quot;mailto:labs@networktocode.com&quot;&gt;labs@networktocode.com&lt;/a&gt; and tell us the following:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;What platforms you are most interested in, i.e. Cisco Nexus, Cisco IOS, Cisco IOS-XR, Arista, OpenDaylight, Citrix VPX, Cumulus, Juniper vMX, vSRX, etc.&lt;/li&gt;
  &lt;li&gt;What topology you’d like to see given the combination of platforms you’re requesting.&lt;/li&gt;
  &lt;li&gt;What tools you’re most interested in and want to learn how to use, i.e. just raw Python, gerrit, Jenkins, Puppet, Chef, Ansible, etc.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;if-you-email-us-and-include-those-three-things-well-offer-you-at-least-two-2-free-labs-of-4-hours-each&quot;&gt;If you email us and include those three things, &lt;strong&gt;we’ll offer you at least two (2) FREE labs of 4 hours each!&lt;/strong&gt;&lt;/h3&gt;

&lt;h1 id=&quot;testing--learning-to-ci-pipelines&quot;&gt;Testing &amp;amp; Learning to CI Pipelines&lt;/h1&gt;

&lt;p&gt;As much as this platform is meant for dev/test of learning automation automation technologies, it can be used for testing any feature the platform supports.  Additionally, we’ve had requests for infrastructure that can be used for Continuous Integration testing such that as users deploy CI pipelines, they can test again our cloud-based virtual platforms since often times, they don’t have enough physical kit to do this kind of testing on their premises.&lt;/p&gt;

&lt;p&gt;We look forward to hearing from the early adopters and continue to work hard preparing for a formal launch in the next several weeks!&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;UPDATE- This is only offering “free” labs to people that wish to be an early adopter.  The on-demand labs will not be “free” at launch (unless the vendors are sponsoring them). And if you are a vendor, and want to take part and learn more, please reach out.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thanks,
Jason
@jedelman8&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.S.  If you’re interested in formal instructor-led Network Automation training that covers Ansible and Python, check this out: &lt;a href=&quot;http://networktocode.com/products/training/&quot;&gt;Network Automation Course Schedule&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

</description>
      <pubDate>Sat, 20 Feb 2016 00:00:00 +0000</pubDate>
      </item>
    
      <item>
      <title>Big Switch Meets Ansible</title>
      <link>https://jedelman.com/home/big-switch-meets-ansible/</link>
      <guid isPermaLink="true">https://jedelman.com/home/big-switch-meets-ansible/</guid>
      <description>&lt;p&gt;Big Switch offers &lt;a href=&quot;labs.bigswitch.com&quot;&gt;on demand labs&lt;/a&gt; to get instant access to Big Cloud Fabric (BCF) and Big Monitoring Fabric (BMF).  Using these labs, it’s quite easy to experience the products first hand and see what they are all about.  The labs also come with lab guides that walk you through step-by-step on how to get started using BMF and BCF.&lt;/p&gt;

&lt;p&gt;For me, one of the more appealing aspects of these labs is that Big Switch also exposes the APIs such that you can access them directly from your personal machine.  This makes it possible to not only test the product, but also test the API on each controller platform (BMF and BCF).&lt;/p&gt;

&lt;p&gt;The best part is, you don’t even need to use any docs because they offer a command that shows the API calls being made by certain show commands.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;controller&amp;gt; debug rest
***** Enabled display rest mode *****
REST-SIMPLE: GET http://127.0.0.1:8080/api/v1/data/controller/core/controller/role
controller&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Like the output from a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;show version&lt;/code&gt;? Ensure &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;debug rest&lt;/code&gt; is enabled, and then just issue the command to grab the APIs being called to generate the text output on the CLI.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;controller&amp;gt; show version
REST-SIMPLE: GET http://127.0.0.1:8080/api/v1/data/controller/core/version/appliance
REST-SIMPLE: http://127.0.0.1:8080/api/v1/data/controller/core/version/appliance done, 0:00:00.012266
~~~~~~~~~~~~~~~~~~~~~~~~~~~ Appliance  ~~~~~~~~~~~~~~~~~~~~~~~~~~~
Name            : Big Cloud Fabric Appliance
Build date      : 2015-12-20 07:06:05 UTC
Build user      : bsn
Ci build number : 75
Ci job name     : bcf-3.5.0
Release string  : Big Cloud Fabric Appliance 3.5.0 (bcf-3.5.0 #75)
Version         : 3.5.0
REST-SIMPLE: GET http://127.0.0.1:8080/api/v1/data/controller/core/controller/role
REST-SIMPLE: http://127.0.0.1:8080/api/v1/data/controller/core/controller/role done, 0:00:00.013763
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can see that one of the APIs being called is this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;GET http://127.0.0.1:8080/api/v1/data/controller/core/version/appliance
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Pretty cool.&lt;/p&gt;

&lt;p&gt;This has to be going somewhere, right?  Absolutely…can’t just &lt;em&gt;play&lt;/em&gt; with an API and not build anything.&lt;/p&gt;

&lt;h1 id=&quot;big-switch-ansible-modules&quot;&gt;Big Switch Ansible Modules&lt;/h1&gt;

&lt;p&gt;Over the past few days, I spent time working with these APIs and ended up developing Ansible modules to collect facts for BMF and BCF.  They can be found &lt;a href=&quot;https://github.com/networktocode/bsn-ansible&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Facts is a great place to get started because you can now use this information to use as inputs into other modules (more in the future!) and even more important, the facts collected can be used to create dynamic reports, etc.&lt;/p&gt;

&lt;p&gt;So, if you’re using BMF and/or BCF, these modules can be used to help keep track of that inventory or to do health checks in real-time.&lt;/p&gt;

&lt;p&gt;Here is a sample playbook using the module &lt;strong&gt;bcf_get_facts&lt;/strong&gt; to collect facts from Big Cloud Fabric.&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;

   &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;GATHER FACTS FROM BIG SWITCH CONTROLLERS&lt;/span&gt;
     &lt;span class=&quot;na&quot;&gt;hosts&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;bcf&lt;/span&gt;
     &lt;span class=&quot;na&quot;&gt;connection&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;local&lt;/span&gt;

     &lt;span class=&quot;na&quot;&gt;tasks&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;

       &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;GATHER FACTS&lt;/span&gt;
         &lt;span class=&quot;na&quot;&gt;bcf_get_facts&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;controller= username= password=&lt;/span&gt;

       &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;DUMP FACTS TO TERMINAL&lt;/span&gt;
         &lt;span class=&quot;na&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;var=bsnbcf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The facts returned is a dictionary and are stored in the key &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bsnbcf&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bsnbmf&lt;/code&gt; based on which module you are using.&lt;/p&gt;

&lt;p&gt;This is an example of facts gathered from Big Cloud Fabric:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;{
    &quot;var&quot;: {
        &quot;bsnbcf&quot;: {
            &quot;cluster&quot;: {
                &quot;controllers&quot;: [
                    {
                        &quot;hostname&quot;: &quot;10.10.12.20&quot;,
                        &quot;role&quot;: &quot;active&quot;,
                        &quot;uptime&quot;: 33807223
                    }
                ],
                &quot;description&quot;: null,
                &quot;name&quot;: &quot;bigswitchcluster&quot;,
                &quot;redundancy_status&quot;: {
                    &quot;msg&quot;: &quot;Single node configured&quot;,
                    &quot;status&quot;: &quot;standalone&quot;
                },
                &quot;virtual_ip&quot;: null
            },
            &quot;fabric_nodes&quot;: [
                {
                    &quot;dpid&quot;: &quot;00:00:00:00:00:02:00:01&quot;,
                    &quot;fabric_state&quot;: &quot;connected&quot;,
                    &quot;name&quot;: &quot;R1L1&quot;,
                    &quot;role&quot;: &quot;leaf&quot;,
                    &quot;sw&quot;: &quot;Switch Light Virtual 3.5.0 2015-12-15.00:38-db7144c trusty-amd64&quot;
                },
                {
                    &quot;dpid&quot;: &quot;00:00:00:00:00:02:00:02&quot;,
                    &quot;fabric_state&quot;: &quot;connected&quot;,
                    &quot;name&quot;: &quot;R1L2&quot;,
                    &quot;role&quot;: &quot;leaf&quot;,
                    &quot;sw&quot;: &quot;Switch Light Virtual 3.5.0 2015-12-15.00:38-db7144c trusty-amd64&quot;
                },
                {
                    &quot;dpid&quot;: &quot;00:00:00:00:00:02:00:03&quot;,
                    &quot;fabric_state&quot;: &quot;connected&quot;,
                    &quot;name&quot;: &quot;R2L1&quot;,
                    &quot;role&quot;: &quot;leaf&quot;,
                    &quot;sw&quot;: &quot;Switch Light Virtual 3.5.0 2015-12-15.00:38-db7144c trusty-amd64&quot;
                },
                {
                    &quot;dpid&quot;: &quot;00:00:00:00:00:02:00:04&quot;,
                    &quot;fabric_state&quot;: &quot;connected&quot;,
                    &quot;name&quot;: &quot;R2L2&quot;,
                    &quot;role&quot;: &quot;leaf&quot;,
                    &quot;sw&quot;: &quot;Switch Light Virtual 3.5.0 2015-12-15.00:38-db7144c trusty-amd64&quot;
                },
                {
                    &quot;dpid&quot;: &quot;00:00:00:00:00:02:00:05&quot;,
                    &quot;fabric_state&quot;: &quot;connected&quot;,
                    &quot;name&quot;: &quot;R3L1&quot;,
                    &quot;role&quot;: &quot;leaf&quot;,
                    &quot;sw&quot;: &quot;Switch Light Virtual 3.5.0 2015-12-15.00:38-db7144c trusty-amd64&quot;
                },
                {
                    &quot;dpid&quot;: &quot;00:00:00:00:00:02:00:06&quot;,
                    &quot;fabric_state&quot;: &quot;connected&quot;,
                    &quot;name&quot;: &quot;R3L2&quot;,
                    &quot;role&quot;: &quot;leaf&quot;,
                    &quot;sw&quot;: &quot;Switch Light Virtual 3.5.0 2015-12-15.00:38-db7144c trusty-amd64&quot;
                },
                {
                    &quot;dpid&quot;: &quot;00:00:00:00:00:01:00:01&quot;,
                    &quot;fabric_state&quot;: &quot;connected&quot;,
                    &quot;name&quot;: &quot;S1&quot;,
                    &quot;role&quot;: &quot;spine&quot;,
                    &quot;sw&quot;: &quot;Switch Light Virtual 3.5.0 2015-12-15.00:38-db7144c trusty-amd64&quot;
                },
                {
                    &quot;dpid&quot;: &quot;00:00:00:00:00:01:00:02&quot;,
                    &quot;fabric_state&quot;: &quot;connected&quot;,
                    &quot;name&quot;: &quot;S2&quot;,
                    &quot;role&quot;: &quot;spine&quot;,
                    &quot;sw&quot;: &quot;Switch Light Virtual 3.5.0 2015-12-15.00:38-db7144c trusty-amd64&quot;
                },
                {
                    &quot;dpid&quot;: &quot;00:00:00:00:00:01:00:03&quot;,
                    &quot;fabric_state&quot;: &quot;connected&quot;,
                    &quot;name&quot;: &quot;S3&quot;,
                    &quot;role&quot;: &quot;spine&quot;,
                    &quot;sw&quot;: &quot;Switch Light Virtual 3.5.0 2015-12-15.00:38-db7144c trusty-amd64&quot;
                }
            ],
            &quot;hostname&quot;: &quot;controller&quot;,
            &quot;platform&quot;: &quot;Big Cloud Fabric Appliance 3.5.0 (bcf-3.5.0 #75)&quot;,
            &quot;summary&quot;: {
                &quot;controllers&quot;: 1,
                &quot;errors&quot;: 18,
                &quot;leaf_groups_configured&quot;: 3,
                &quot;leaves_configured&quot;: 6,
                &quot;leaves_connected&quot;: 6,
                &quot;overall_status&quot;: &quot;NOT OK&quot;,
                &quot;spines_configured&quot;: 3,
                &quot;spines_connected&quot;: 3,
                &quot;tenants&quot;: 0,
                &quot;vswitches_connected&quot;: 0,
                &quot;warnings&quot;: 14
            },
            &quot;vendor&quot;: &quot;big_switch_networks&quot;,
            &quot;version&quot;: &quot;3.5.0&quot;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And here is a sample from Big Monitoring Fabric:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &quot;var&quot;: {
        &quot;bsnbmf&quot;: {
            &quot;cluster&quot;: &quot;N/A&quot;,
            &quot;fabric_nodes&quot;: [
                {
                    &quot;alias&quot;: &quot;Filter-Switch&quot;,
                    &quot;dpid&quot;: &quot;00:00:00:00:00:00:00:0b&quot;,
                    &quot;serial_number&quot;: &quot;&quot;,
                    &quot;sw&quot;: &quot;Switch Light Virtual 3.1.0 2015-10-07.00:17-60a8572 trusty-amd64&quot;
                },
                {
                    &quot;alias&quot;: &quot;Core-Switch&quot;,
                    &quot;dpid&quot;: &quot;00:00:00:00:00:00:00:0c&quot;,
                    &quot;serial_number&quot;: &quot;&quot;,
                    &quot;sw&quot;: &quot;Switch Light Virtual 3.1.0 2015-10-07.00:17-60a8572 trusty-amd64&quot;
                },
                {
                    &quot;alias&quot;: &quot;Delivery-Switch&quot;,
                    &quot;dpid&quot;: &quot;00:00:00:00:00:00:00:0d&quot;,
                    &quot;serial_number&quot;: &quot;&quot;,
                    &quot;sw&quot;: &quot;Switch Light Virtual 3.1.0 2015-10-07.00:17-60a8572 trusty-amd64&quot;
                }
            ],
            &quot;hostname&quot;: &quot;N/A&quot;,
            &quot;platform&quot;: &quot;Big Tap Controller 5.5.0 (2015.10.14.1909-m.bsc.bigdb)&quot;,
            &quot;summary&quot;: {
                &quot;active_policies&quot;: 0,
                &quot;core_interfaces&quot;: 4,
                &quot;delivery_interfaces&quot;: 2,
                &quot;delivery_switches&quot;: 1,
                &quot;filter_interfaces&quot;: 1,
                &quot;filter_switches&quot;: 1,
                &quot;match_mode&quot;: &quot;bigtap-l3l4&quot;,
                &quot;num_policies&quot;: 0,
                &quot;num_services&quot;: 0,
                &quot;service_interfaces&quot;: 2,
                &quot;service_switches&quot;: 1,
                &quot;total_switches&quot;: 3
            },
            &quot;vendor&quot;: &quot;big_switch_networks&quot;,
            &quot;version&quot;: &quot;N/A&quot;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Feel free to contribute: &lt;a href=&quot;https://github.com/networktocode/bsn-ansible&quot;&gt;https://github.com/networktocode/bsn-ansible&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy Automating.&lt;/p&gt;

&lt;p&gt;Thanks,
Jason
@jedelman8&lt;/p&gt;

</description>
      <pubDate>Thu, 28 Jan 2016 00:00:00 +0000</pubDate>
      </item>
    
      <item>
      <title>The Network Automation Book</title>
      <link>https://jedelman.com/home/the-network-automation-book/</link>
      <guid isPermaLink="true">https://jedelman.com/home/the-network-automation-book/</guid>
      <description>&lt;p&gt;From OpenFlow to Software Defined Networking (SDN), there has been a lot of hype, 100s of millions of dollars in venture funding, and billions in exits within the network industry over the past 5+ years.  The one thing we know for certain about the industry in all of this is that change is here, and more is coming, which is exactly the reason for this post!&lt;/p&gt;

&lt;p&gt;Ironically, I also started this blog 5+ years ago.  In the beginning, this blog was a lot of speculation around OpenFlow and the future of Software Defined Networking (SDN).  Nowadays, it’s rare to hear me mention SDN at all, and the focus is much more practical on tools and technology that can help solve real problems.  For those that have been reading for a while, you probably saw this shift in addition to the career shift I made 18+ months ago.  These shifts go hand in hand with a new project I’ve been working on.&lt;/p&gt;

&lt;p&gt;It’s with great pleasure that I’m finally able to announce a project that started several months ago that falls in-line with exactly the same topics you read about frequently on this blog.&lt;/p&gt;

&lt;h1 id=&quot;what-is-the-project&quot;&gt;What is the Project?&lt;/h1&gt;

&lt;p&gt;It’s a book!  Yep, that’s right.  I’m honored to say I am a co-author of a book focused on Network Automation. The title is &lt;strong&gt;Network Programmability and Automation &lt;em&gt;Skills for the Next-Generation Network Engineer&lt;/em&gt;&lt;/strong&gt; and is being published by &lt;a href=&quot;http://shop.oreilly.com/product/0636920042082.do&quot;&gt;O’Reilly&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/npab-cover-early-access.png&quot; alt=&quot;BOOK COVER&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;whos-involved&quot;&gt;Who’s Involved?&lt;/h1&gt;

&lt;p&gt;I’m ecstatic to say the other authors are &lt;a href=&quot;https://twitter.com/Mierdin&quot;&gt;Matt Oswalt&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/scott_lowe&quot;&gt;Scott Lowe&lt;/a&gt;. Both are friends and industry leaders — they are each helping pave the way forward across the industry.&lt;/p&gt;

&lt;p&gt;Check out their announcements &lt;a href=&quot;http://keepingitclassless.net/2015/12/training-next-generation-network-engineer/&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;http://blog.scottlowe.org/2015/12/28/next-gen-network-engineering-skills/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And all three of us use Jekyll and GitHub pages for our blogs, so you won’t find any pop-ups for ads.  That’s just a bonus.&lt;/p&gt;

&lt;h1 id=&quot;when-is-it-getting-released&quot;&gt;When is it Getting Released?&lt;/h1&gt;

&lt;p&gt;It’s already in the O’Reilly early release program, so you can literally &lt;a href=&quot;http://shop.oreilly.com/product/0636920042082.do&quot;&gt;start reading&lt;/a&gt; today!&lt;/p&gt;

&lt;p&gt;You can also pre-order a copy from &lt;a href=&quot;http://www.amazon.com/Network-Programmability-Automation-Next-Generation-Engineer/dp/1491931256/ref=sr_1_1?ie=UTF8&amp;amp;qid=1451324745&amp;amp;sr=8-1&amp;amp;keywords=jason+edelman&quot;&gt;Amazon&lt;/a&gt; if you’d like.&lt;/p&gt;

&lt;p&gt;Or navigate directly to &lt;a href=&quot;https://www.safaribooksonline.com/library/view/network-programmability-and/9781491931240/&quot;&gt;Safari&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Because this is an early release, it’s not complete yet and may very well change before it is final.  That said, we’re actively taking feedback and will be making updates over the coming months.&lt;/p&gt;

&lt;h1 id=&quot;what-topics-does-the-book-cover&quot;&gt;What Topics Does the Book Cover?&lt;/h1&gt;

&lt;p&gt;We cover topics such as Python for the Network Engineer, Linux, Network Configuration Templating, Device APIs, and how to use DevOps tools such as Puppet, Chef, and Ansible automating network devices!  They are all important skills for the next-gen network engineer.&lt;/p&gt;

&lt;h1 id=&quot;summary&quot;&gt;Summary&lt;/h1&gt;

&lt;p&gt;Please give us feedback.  If you sign up for the early release program, you’ll see we have a dedicated email alias to send all comments/feedback too.  If it’s easier, just email me, Scott, or Matt directly!&lt;/p&gt;

&lt;p&gt;Happy Reading!&lt;/p&gt;

&lt;p&gt;Thanks,
Jason
@jedelman8&lt;/p&gt;

</description>
      <pubDate>Mon, 28 Dec 2015 00:00:00 +0000</pubDate>
      </item>
    
  </channel>
</rss>