<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel><title>Applying DevOps to networks</title><description>Applying DevOps to networks.</description><link>https://netdevops.me/</link><atom:link href="https://netdevops.me/feed_rss_created.xml" rel="self" type="application/rss+xml" /><managingEditor>Roman Dodin</managingEditor><docs>https://github.com/hellt/netdevops.me</docs><language>en-None</language> <pubDate>Fri, 31 Jan 2025 14:47:24 -0000</pubDate> <lastBuildDate>Fri, 31 Jan 2025 14:47:24 -0000</lastBuildDate> <ttl>1440</ttl> <generator>MkDocs RSS plugin - v1.8.0</generator> <item> <title>Managing multiple Go versions</title> <author>rdodin</author> <category>go</category> <description>&lt;h1&gt;Managing multiple Go versions&lt;/h1&gt;&lt;p&gt;When dealing with several Go projects you inevitably end up needing more than one Go version installed and selected correctly for a given project.&lt;/p&gt;&lt;p&gt;Somehow I always forget how I do this when I need to fix a new version for another project, so here is what I do for the future me:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Install the target release Go downloader. For example, for &lt;code&gt;go1.22.11&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;bashgo install golang.org/dl/go1.22.11@latest&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Now download the actual sdk&lt;/p&gt;&lt;p&gt;&lt;code&gt;bashgo1.22.11 download&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Now for whatever project that you want to set this version for, create the &lt;code&gt;direnv&lt;/code&gt;&#39;s &lt;code&gt;.envrc&lt;/code&gt; file and set the path accordingly:&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;code&gt;bashPATH=~/sdk/go1.22.11/bin:$PATH&lt;/code&gt;&lt;/p&gt;</description><link>https://netdevops.me/2025/managing-multiple-go-versions/</link> <pubDate>Fri, 31 Jan 2025 00:00:00 +0000</pubDate><source url="https://netdevops.me/feed_rss_created.xml">Applying DevOps to networks</source><comments>https://netdevops.me/2025/managing-multiple-go-versions/#__comments</comments><guid isPermaLink="true">https://netdevops.me/2025/managing-multiple-go-versions/</guid> </item> <item> <title>Managing multiple kubeconfigs by merging them</title> <author>rdodin</author> <category>kubernetes</category> <description>&lt;h1&gt;Managing multiple kubeconfigs by merging them&lt;/h1&gt;&lt;p&gt;Recently I&#39;ve been deploying k8s clusters on different cloud providers, with different automation stacks and in different configurations. As a result, I ended up with a bunch of of kubeconfigs polluting my &lt;code&gt;~/.kube&lt;/code&gt; directory.&lt;/p&gt;&lt;p&gt;As much as &lt;code&gt;kubectl&lt;/code&gt; is an swiss knife for all things k8s, it still can&#39;t quite make dealing with different kubeconfigs a breeze. The annoying part is that you have to have a single kubeconfig environment with all your clusters, users, contexts listed, and this is not the case when you have multiple kubeconfigs. So, naturally one would want to merge them into a single kubeconfig.&lt;/p&gt;&lt;p&gt;To do that I had to write a small script that does the following high level steps:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Backup existing &lt;code&gt;~/.kube/config&lt;/code&gt; file: you don&#39;t want to lose your existing kubeconfig because you messed up something in your script or overwrote it with a wrong kubeconfig.&lt;/li&gt;&lt;li&gt;Find paths to all kubeconfig files in a particular directory and set them as a &lt;code&gt;KUBECONFIG&lt;/code&gt; environment variable.&lt;/li&gt;&lt;li&gt;merge these kubeconfigs into a single &lt;code&gt;~/.kube/config&lt;/code&gt; file.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Here is the script:&lt;/p&gt;&lt;p&gt;&lt;code&gt;bashcp ~/.kube/config ~/.kube/bak/config_$(date +&#34;%Y-%m-%d_%H:%M:%S&#34;)_bak &amp;amp;&amp;amp; \KUBECONFIG=$(find ~/.kube/cluster_configs -type f | tr &#39;\n&#39; &#39;:&#39;) \kubectl config view --flatten &amp;gt; ~/.kube/config&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Nothing fancy, but it does the job. Essentially the rule of thumb that I follow now is to keep all my kubeconfigs in &lt;code&gt;~/.kube/cluster_configs&lt;/code&gt; directory and run this script whenever I add or delete a kubeconfig in this directory. The resulting kubeconfig will contain all the contexts from all of the files and I could do &lt;code&gt;kubectl config use-context &amp;lt;context&amp;gt;&lt;/code&gt; to switch between them.&lt;/p&gt;</description><link>https://netdevops.me/2024/managing-multiple-kubeconfigs-by-merging-them/</link> <pubDate>Mon, 24 Jun 2024 00:00:00 +0000</pubDate><source url="https://netdevops.me/feed_rss_created.xml">Applying DevOps to networks</source><comments>https://netdevops.me/2024/managing-multiple-kubeconfigs-by-merging-them/#__comments</comments><guid isPermaLink="true">https://netdevops.me/2024/managing-multiple-kubeconfigs-by-merging-them/</guid> </item> <item> <title>Using skopeo container image</title> <author>rdodin</author> <category>skopeo</category> <description>&lt;h1&gt;Using skopeo container image&lt;/h1&gt;&lt;p&gt;By now you know I hate to &#34;install&#34; things on the systems I work on, and that is because I have too many machines I carry work on. Hence, I prefer to containerize all the things and use handy aliases.&lt;/p&gt;&lt;p&gt;Here is one for skopeo to copy images between registries:&lt;/p&gt;&lt;p&gt;&lt;code&gt;bashalias skopeo=&#39;sudo docker run --rm \-v ~/.config/gcloud:/root/.config/gcloud:ro \-v ~/.docker/config.json:/tmp/auth.json:ro \-v /var/run/docker.sock:/var/run/docker.sock \-v /usr/bin/docker-credential-gcr:/usr/bin/docker-credential-gcr \-v $(pwd):/workdir \-w /workdir \quay.io/skopeo/stable:v1.14&#39;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;bash$ skopeo --versionskopeo version 1.14.2&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Note this quirky &lt;code&gt;docker-credential-gcr&lt;/code&gt; binary mount, this is an authentication helper for skopeo to authenticate with GCP.Other clouds might require other helpers or file mounts.&lt;/p&gt;&lt;p&gt;A nice blog post on how to use skopeo different transports - &lt;a href=&#34;https://www.redhat.com/sysadmin/7-transports-features&#34;&gt;https://www.redhat.com/sysadmin/7-transports-features&lt;/a&gt;&lt;/p&gt;</description><link>https://netdevops.me/2024/using-skopeo-container-image/</link> <pubDate>Fri, 08 Mar 2024 00:00:00 +0000</pubDate><source url="https://netdevops.me/feed_rss_created.xml">Applying DevOps to networks</source><comments>https://netdevops.me/2024/using-skopeo-container-image/#__comments</comments><guid isPermaLink="true">https://netdevops.me/2024/using-skopeo-container-image/</guid> </item> <item> <title>Adding border to the logos</title> <author>rdodin</author> <category>blogging</category> <description>&lt;h1&gt;Adding border to the logos&lt;/h1&gt;&lt;p&gt;It is super easy nowadays to generate a decent logo for your OSS project using any of genAI tool (dall-e, bing, etc). But one of the side-effects of the image generation might be the noise around the edges.&lt;/p&gt;&lt;p&gt;If that&#39;s your case you can apply a border (offset) to your logo to mask the potential rough edges. I can recommend &lt;a href=&#34;https://borderize.com/&#34;&gt;borderize&lt;/a&gt; service that makes it a matter of a few clicks.&lt;/p&gt;</description><link>https://netdevops.me/2024/adding-border-to-the-logos/</link> <pubDate>Thu, 15 Feb 2024 00:00:00 +0000</pubDate><source url="https://netdevops.me/feed_rss_created.xml">Applying DevOps to networks</source><comments>https://netdevops.me/2024/adding-border-to-the-logos/#__comments</comments><guid isPermaLink="true">https://netdevops.me/2024/adding-border-to-the-logos/</guid> </item> <item> <title>Formatting bash</title> <author>rdodin</author> <category>bash</category> <description>&lt;h1&gt;Formatting bash&lt;/h1&gt;&lt;p&gt;Whenever I need to format &lt;code&gt;bash&lt;/code&gt; scripts I use the mvdan&#39;s shfmt - &lt;a href=&#34;https://github.com/mvdan/sh/blob/master/cmd/shfmt/shfmt.1.scd&#34;&gt;https://github.com/mvdan/sh/blob/master/cmd/shfmt/shfmt.1.scd&lt;/a&gt; as a docker container:&lt;/p&gt;&lt;p&gt;&lt;code&gt;bashsudo docker run --rm -u &#34;$(id -u):$(id -g)&#34; -v $(pwd):/mnt -w /mnt mvdan/shfmt:v3 -w utils/if-wait.sh&lt;/code&gt;&lt;/p&gt;</description><link>https://netdevops.me/2024/formatting-bash/</link> <pubDate>Mon, 05 Feb 2024 00:00:00 +0000</pubDate><source url="https://netdevops.me/feed_rss_created.xml">Applying DevOps to networks</source><comments>https://netdevops.me/2024/formatting-bash/#__comments</comments><guid isPermaLink="true">https://netdevops.me/2024/formatting-bash/</guid> </item> <item> <title>Upscaling images</title> <author>rdodin</author> <category>blogging</category> <description>&lt;h1&gt;Upscaling images&lt;/h1&gt;&lt;p&gt;You know how in TV shows with IMDB rating ranging from 5 to 7 cops use that magic image recognition software that transforms the cctv image of a bad guy from the &#34;mashed potato&#34; quality to the Vogue cover? Yeah...&lt;/p&gt;&lt;p&gt;But recently I needed to upscale the AI generated logo I made for Clabernetes project, and the quality was &#34;meh&#34;, since it was a free service from Bing and whatnot. So whilst it was printable, the DPI was not good enough. So I decided to try my luck and google for these AI-powered image upscale services; frankly, my hopes were quite low.&lt;/p&gt;&lt;p&gt;The first hit with a fishy DNS name - https://www.upscale.media/ - did not reinforce my beliefs that this is all a gimmick. But I tried, and it was legit good. It upscaled my logo while removed the noise and blurriness from the original image.&lt;/p&gt;&lt;p&gt;Here is the comparison:&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;upscale&#34; src=&#34;https://gitlab.com/rdodin/pics/-/wikis/uploads/11d7dd09af1c82d31cf6ced1fd70e28b/image.png&#34;&gt;&lt;/p&gt;&lt;p&gt;So yeah, something I wanted to save here because I will likely use it next time as well.&lt;/p&gt;</description><link>https://netdevops.me/2024/upscaling-images/</link> <pubDate>Wed, 31 Jan 2024 00:00:00 +0000</pubDate><source url="https://netdevops.me/feed_rss_created.xml">Applying DevOps to networks</source><comments>https://netdevops.me/2024/upscaling-images/#__comments</comments><guid isPermaLink="true">https://netdevops.me/2024/upscaling-images/</guid> </item> <item> <title>OpenStack Client Container Image</title> <author>rdodin</author> <category>docker</category> <category>openstack</category> <description>&lt;h1&gt;OpenStack Client Container Image&lt;/h1&gt;&lt;p&gt;I like the portability, managability and package manager agnostic nature of container images. Especially for the tools I use couple of times a month. And even more so for Python tools that don&#39;t have native wheels for all their dependencies. Like OpenStack Client.&lt;/p&gt;&lt;p&gt;So I built a small &lt;a href=&#34;https://github.com/hellt/dockerfiles/blob/main/openstack-client/openstack-client.dockerfile&#34;&gt;multi-stage Dockerfile&lt;/a&gt; to build a container image with OpenStack Client and all its dependencies. It&#39;s based on the official Python image and has a slim footprint:&lt;/p&gt;&lt;p&gt;&lt;code&gt;Dockerfile--8&amp;lt;-- &#34;https://raw.githubusercontent.com/hellt/dockerfiles/main/openstack-client/openstack-client.dockerfile&#34;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;You can pull the image from &lt;a href=&#34;https://github.com/hellt/dockerfiles/pkgs/container/openstack-client&#34;&gt;ghcr&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;&lt;code&gt;docker pull ghcr.io/hellt/openstack-client:6.4.0&lt;/code&gt;&lt;/p&gt;&lt;p&gt;To use this image you first need to source the env vars from your openrc file:&lt;/p&gt;&lt;p&gt;&lt;code&gt;source myopenrc.sh&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Then I prefer to install the alias &lt;code&gt;openstack&lt;/code&gt; to my shell so that it feels like I have the client installed locally:&lt;/p&gt;&lt;p&gt;&lt;code&gt;bashalias openstack=&#34;docker run --rm -it \ -e OS_AUTH_URL=${OS_AUTH_URL} -e OS_PROJECT_ID=${OS_PROJECT_ID} \ -e OS_USER_DOMAIN_NAME=${OS_USER_DOMAIN_NAME} \ -e OS_PROJECT_NAME=${OS_PROJECT_NAME} \ -e OS_USERNAME=${OS_USERNAME} -e OS_PASSWORD=${OS_PASSWORD} \ ghcr.io/hellt/openstack-client:6.4.0 openstack $@&#34;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Then you can use the client as usual:&lt;/p&gt;&lt;p&gt;&lt;code&gt;❯ openstack server list+-----------------------------+----------------+--------+-----------------------------+------------------------------+---------------------+| ID | Name | Status | Networks | Image | Flavor |+-----------------------------+----------------+--------+-----------------------------+------------------------------+---------------------+| 0fa75185-0f76-482f-8cc3- | k8s-w3-411e6d7 | ACTIVE | k8s-net-304e6df=10.10.0.11 | nesc-baseimages- | ea.008-0024 || 38e4d60212c8 | | | | debian-11-latest | |-- snip --&lt;/code&gt;&lt;/p&gt;</description><link>https://netdevops.me/2024/openstack-client-container-image/</link> <pubDate>Thu, 11 Jan 2024 00:00:00 +0000</pubDate><source url="https://netdevops.me/feed_rss_created.xml">Applying DevOps to networks</source><comments>https://netdevops.me/2024/openstack-client-container-image/#__comments</comments><guid isPermaLink="true">https://netdevops.me/2024/openstack-client-container-image/</guid> </item> <item> <title>Test coverage for Go integration tests</title> <author>rdodin</author> <category>containerlab</category> <category>go</category> <category>testing</category> <description>&lt;h1&gt;Test coverage for Go integration tests&lt;/h1&gt;&lt;p&gt;I have been working on &lt;a href=&#34;https://containerlab.dev&#34;&gt;containerlab&lt;/a&gt; for a while now; a project that once started as a simple idea of a tool that would create and wire up SR Linux containers grew into a full-blown network emulation tool loved by the community and used in labs by many.&lt;/p&gt;&lt;p&gt;As it became evident that many more users started to rely on containerlab for their daily work, the looming feeling of responsibility for the quality of the tool started to creep in. At the same time, the growing user base exposed us to many more feature requests and integrations, making it harder to find time to address technical debt and improve testing.&lt;/p&gt;&lt;p&gt;Given the nature of the project, it was clear that integration tests offer a quick way to validate the functionality, as we could replicate the user&#39;s workflow and verify the outcome. However, the integration tests are not without their own challenges, and one of them is the test coverage which is not as easy to get as with unit tests.&lt;/p&gt;&lt;p&gt;In this post, I will share how coverage enhancements introduced in Go 1.20 helped us to get the coverage for our integration tests and jump from a miserable 20% to a (less sad) 50%.&lt;/p&gt;</description><link>https://netdevops.me/2023/test-coverage-for-go-integration-tests/</link> <pubDate>Mon, 14 Aug 2023 00:00:00 +0000</pubDate><source url="https://netdevops.me/feed_rss_created.xml">Applying DevOps to networks</source><comments>https://netdevops.me/2023/test-coverage-for-go-integration-tests/#__comments</comments><guid isPermaLink="true">https://netdevops.me/2023/test-coverage-for-go-integration-tests/</guid> </item> <item> <title>gNMIc talks at DKNOG and NANOG</title> <author>rdodin</author> <category>dknog</category> <category>gnmi</category> <category>gnmic</category> <category>nanog</category> <description>&lt;h1&gt;gNMIc talks at DKNOG and NANOG&lt;/h1&gt;&lt;p&gt;If you have never heard of gNMI and/or &lt;a href=&#34;https://gnmic.openconfig.net&#34;&gt;gNMIc&lt;/a&gt; project, you can start with my last week&#39;s talk DKNOG&lt;/p&gt;&lt;p&gt;&lt;center&gt;&lt;/p&gt;&lt;iframe type=&#34;text/html&#34; width=&#34;80%&#34; height=&#34;465&#34; src=&#34;https://www.youtube.com/embed/mWjiIx4vMvg&#34; frameborder=&#34;0&#34;&gt;&lt;/iframe&gt;&lt;p&gt;&lt;/center&gt;&lt;/p&gt;&lt;p&gt;Thirty minutes introduction to gNMI and gNMIc to get you started.&lt;/p&gt;&lt;p&gt;After this taster, you will likely want to know more, and Karim Radhouani has you covered. A 1-hour gNMIc tutorial has recently been published directly from NANOG 87 stage.&lt;/p&gt;&lt;p&gt;&lt;center&gt;&lt;/p&gt;&lt;iframe type=&#34;text/html&#34; width=&#34;80%&#34; height=&#34;465&#34; src=&#34;https://www.youtube.com/embed/v3CL2vrGD_8&#34; frameborder=&#34;0&#34;&gt;&lt;/iframe&gt;&lt;p&gt;&lt;/center&gt;&lt;/p&gt;&lt;p&gt;After this one you&#39;ll never wanna see OIDs again.&lt;/p&gt;</description><link>https://netdevops.me/2023/gnmic-talks-at-dknog-and-nanog/</link> <pubDate>Tue, 21 Mar 2023 00:00:00 +0000</pubDate><source url="https://netdevops.me/feed_rss_created.xml">Applying DevOps to networks</source><comments>https://netdevops.me/2023/gnmic-talks-at-dknog-and-nanog/#__comments</comments><guid isPermaLink="true">https://netdevops.me/2023/gnmic-talks-at-dknog-and-nanog/</guid> </item> <item> <title>Refreshing Go package index for your package</title> <author>rdodin</author> <category>go</category> <description>&lt;h1&gt;Refreshing Go package index for your package&lt;/h1&gt;&lt;p&gt;It is quite frustrating to wait for pkg.go.dev to refresh your index, and I always forget how give it a &lt;a href=&#34;https://go.dev/doc/modules/publishing&#34;&gt;slight push&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;&lt;code&gt;bashGOPROXY=proxy.golang.org go list -m example.com/mymodule@v0.1.0&lt;/code&gt;&lt;/p&gt;&lt;p&gt;The new version won&#39;t appear immediately, but at least it seems it will be quicker to show up.&lt;/p&gt;</description><link>https://netdevops.me/2023/refreshing-go-package-index-for-your-package/</link> <pubDate>Wed, 15 Feb 2023 00:00:00 +0000</pubDate><source url="https://netdevops.me/feed_rss_created.xml">Applying DevOps to networks</source><comments>https://netdevops.me/2023/refreshing-go-package-index-for-your-package/#__comments</comments><guid isPermaLink="true">https://netdevops.me/2023/refreshing-go-package-index-for-your-package/</guid> </item> <item> <title>SR Linux logging with ELK</title> <author>rdodin</author> <category>elk</category> <category>logging</category> <category>srlinux</category> <description>&lt;h1&gt;SR Linux logging with ELK&lt;/h1&gt;&lt;p&gt;Implementing centralized logging using modern log collectors is an interesting task even before you start solving scaling problems.&lt;/p&gt;&lt;p&gt;My colleague and I opened up a series of posts dedicated to logging in the context of datacenter networks. We started with the basics of SR Linux logging and used the famous ELK stack as our log storage/processing solution.&lt;/p&gt;&lt;p&gt;Integrating SR Linux logging with ELK via Syslog was fun, and we tried to capture every step of the way. Plus, we create a containerlab-based lab that anyone can use to test the solution themselves.&lt;/p&gt;&lt;p&gt;Dig into &lt;a href=&#34;https://learn.srlinux.dev/blog/2023/sr-linux-logging-with-elk/&#34;&gt;&lt;strong&gt;&#34;SR Linux logging with ELK&#34;&lt;/strong&gt;&lt;/a&gt; and open up the world of modern logging.&lt;/p&gt;</description><link>https://netdevops.me/2023/sr-linux-logging-with-elk/</link> <pubDate>Sun, 12 Feb 2023 00:00:00 +0000</pubDate><source url="https://netdevops.me/feed_rss_created.xml">Applying DevOps to networks</source><comments>https://netdevops.me/2023/sr-linux-logging-with-elk/#__comments</comments><guid isPermaLink="true">https://netdevops.me/2023/sr-linux-logging-with-elk/</guid> </item> <item> <title>Creating a syntax highlighter for SR Linux CLI snippets</title> <author>rdodin</author> <category>pygments</category> <category>srlinux</category> <description>&lt;h1&gt;Creating a syntax highlighter for SR Linux CLI snippets&lt;/h1&gt;&lt;p&gt;How to write a custom syntax highligher for your favorite Network OS CLI and integrate it the doc engine?&lt;/p&gt;&lt;p&gt;=== &#34;Raw text CLI snippet&#34; &lt;code&gt;--{ * candidate shared default }--[ network-instance black ]-- A:leaf1# info static-routes static-routes { route 192.168.18.0/24 { admin-state enable metric 1 preference 5 next-hop-group static-ipv4-grp } route 2001:1::192:168:18:0/64 { admin-state enable metric 1 preference 6 next-hop-group static-ipv6-grp } }&lt;/code&gt;=== &#34;With &lt;code&gt;srl&lt;/code&gt; syntax applied&#34; &lt;code&gt;srl --{ * candidate shared default }--[ network-instance black ]-- A:leaf1# info static-routes static-routes { route 192.168.18.0/24 { admin-state enable metric 1 preference 5 next-hop-group static-ipv4-grp } route 2001:1::192:168:18:0/64 { admin-state enable metric 1 preference 6 next-hop-group static-ipv6-grp } }&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Read in my post &lt;a href=&#34;https://learn.srlinux.dev/blog/2023/sr-linux-syntax-highlighting-with-pygments/&#34;&gt;&lt;strong&gt;&#34;SR Linux Syntax Highlighting with Pygments&#34;&lt;/strong&gt;&lt;/a&gt; at learn.srlinux.dev portal.&lt;/p&gt;</description><link>https://netdevops.me/2023/creating-a-syntax-highlighter-for-sr-linux-cli-snippets/</link> <pubDate>Sun, 08 Jan 2023 00:00:00 +0000</pubDate><source url="https://netdevops.me/feed_rss_created.xml">Applying DevOps to networks</source><comments>https://netdevops.me/2023/creating-a-syntax-highlighter-for-sr-linux-cli-snippets/#__comments</comments><guid isPermaLink="true">https://netdevops.me/2023/creating-a-syntax-highlighter-for-sr-linux-cli-snippets/</guid> </item> <item> <title>SR Linux, JSON-RPC and Ansible</title> <author>rdodin</author> <category>ansible</category> <category>json-rpc</category> <category>srlinux</category> <description>&lt;h1&gt;SR Linux, JSON-RPC and Ansible&lt;/h1&gt;&lt;p&gt;This week I have authored two tutorials for our &lt;a href=&#34;https://learn.srlinux.dev&#34;&gt;https://learn.srlinux.dev&lt;/a&gt; portal.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#34;https://learn.srlinux.dev/tutorials/programmability/json-rpc/basics/&#34;&gt;JSON-RPC Basics&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&#34;https://learn.srlinux.dev/tutorials/programmability/json-rpc/ansible/&#34;&gt;Using Ansible with SR Linux&#39;s JSON-RPC Interface&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The prime reason for this deep dive was to help our customers marry Ansible automation platform with network operations on SR Linux NOS. While I am personally not in the camp &#34;Ansible for network automation&#34; users, the reality is that it is still used by many small/mid teams who by now have large collections of playbooks and trained engineers.&lt;/p&gt;</description><link>https://netdevops.me/2022/sr-linux-json-rpc-and-ansible/</link> <pubDate>Fri, 09 Dec 2022 00:00:00 +0000</pubDate><source url="https://netdevops.me/feed_rss_created.xml">Applying DevOps to networks</source><comments>https://netdevops.me/2022/sr-linux-json-rpc-and-ansible/#__comments</comments><guid isPermaLink="true">https://netdevops.me/2022/sr-linux-json-rpc-and-ansible/</guid> </item> <item> <title>gNMIc joins Openconfig 🚀</title> <author>rdodin</author> <category>gnmi</category> <category>gnmic</category> <category>openconfig</category> <description>&lt;h1&gt;gNMIc joins Openconfig 🚀&lt;/h1&gt;&lt;p&gt;Two years ago, a dozen contributors less, 400 Pull Requests, and 2000 commits behind, another pet project appeared on a vast GitHub landscape. It was a learning exercise by [Karim Radhouani][karim-github] to sharpen his skills in [gNMI][gnmi-ref] - a niche network management protocol promoted by the [Openconfig][oc] group.&lt;/p&gt;&lt;p&gt;Initially named &lt;code&gt;gnmi_client&lt;/code&gt;, it had a noble but narrow scope of providing a feature-rich, complete, yet intuitive CLI for gNMI-enabled routers. Fast forward two years, and we have the [&lt;strong&gt;gNMIc&lt;/strong&gt;][gnmic-main-site] software suite that &lt;strong&gt;is much more than just a CLI&lt;/strong&gt; for gNMI.&lt;/p&gt;&lt;div class=&#34;img-shadow&#34;&gt;&lt;video width=&#34;100%&#34; autoplay muted loop controls&gt;&lt;source src=&#34;https://gitlab.com/rdodin/pics/-/wikis/uploads/d3a08c2f03c2d15db2074967e4ef268f/gnmic-oc.mp4&#34; type=&#34;video/mp4&#34;&gt;&lt;/video&gt;&lt;/div&gt;&lt;p&gt;Today, Nokia donates the gNMIc project to Openconfig, and with that move, we expect to see gNMIc adopted by even more companies and organizations :partying_face:&lt;/p&gt;&lt;div class=&#34;grid cards&#34; markdown&gt;- :material-home:{ .lg .middle } **gNMIc new address** --- :material-github: [openconfig/gnmic][gnmic-repo] :material-book: [https://gnmic.openconfig.net][gnmic-main-site]&lt;/div&gt;&lt;p&gt;In this post I&#39;d like to give you a brief overview of gNMIc&#39;s core features and share my thoughts on what we expect to happen with gNMIc moving under the Openconfig&#39;s wing.&lt;/p&gt;</description><link>https://netdevops.me/2022/gnmic-joins-openconfig-/</link> <pubDate>Tue, 04 Oct 2022 00:00:00 +0000</pubDate><source url="https://netdevops.me/feed_rss_created.xml">Applying DevOps to networks</source><comments>https://netdevops.me/2022/gnmic-joins-openconfig-/#__comments</comments><guid isPermaLink="true">https://netdevops.me/2022/gnmic-joins-openconfig-/</guid> </item> <item> <title>Using guestfish container image</title> <author>rdodin</author> <category>guestfish</category> <description>&lt;h1&gt;Using guestfish container image&lt;/h1&gt;&lt;p&gt;Once in a while, one still needs to get down to a VM-land and dust off some guestfish skills.&lt;/p&gt;&lt;p&gt;Like today I got the IPInfusion OcNOS &lt;code&gt;qcow2&lt;/code&gt; image whose devs decided it is best to use VNC console by default. VNC console for a text-based terminal...&lt;/p&gt;&lt;p&gt;So along come guestfish commands.&lt;/p&gt;</description><link>https://netdevops.me/2022/using-guestfish-container-image/</link> <pubDate>Tue, 22 Feb 2022 00:00:00 +0000</pubDate><source url="https://netdevops.me/feed_rss_created.xml">Applying DevOps to networks</source><comments>https://netdevops.me/2022/using-guestfish-container-image/#__comments</comments><guid isPermaLink="true">https://netdevops.me/2022/using-guestfish-container-image/</guid> </item> <item> <title>DIY YANG Browser</title> <author>rdodin</author> <category>netrel</category> <category>yang</category> <description>&lt;h1&gt;DIY YANG Browser&lt;/h1&gt;&lt;p&gt;Here comes the second episode of the NetRel show: &lt;strong&gt;NetRel episode 002 - DIY YANG Browser&lt;/strong&gt;. Be ready to dive into the paths we took to create a &lt;a href=&#34;https://yang.srlinux.dev&#34;&gt;YANG Browser for Nokia SR Linux platform&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;center&gt;&lt;/p&gt;&lt;iframe type=&#34;text/html&#34; width=&#34;80%&#34; height=&#34;465&#34; src=&#34;https://www.youtube.com/embed/_d4hL7I2h1w&#34; frameborder=&#34;0&#34;&gt;&lt;/iframe&gt;&lt;p&gt;&lt;/center&gt;&lt;/p&gt;&lt;p&gt;YANG data models are the map one should use when looking for their way to configure or retrieve any data on SR Linux system. A central role that is given to YANG in SR Linux demands a convenient interface to browse, search through, and process these data models.&lt;/p&gt;&lt;p&gt;To answer these demands, we created a web portal - &lt;a href=&#34;https://yang.srlinux.dev&#34;&gt;https://yang.srlinux.dev&lt;/a&gt; - it offers:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Fast Path Browser to effectively search through thousands of available YANG paths&lt;/li&gt;&lt;li&gt;Beautiful Tree Browser to navigate the tree representation of the entire YANG data model of SR Linux&lt;/li&gt;&lt;li&gt;Source &lt;code&gt;.yang&lt;/code&gt; files neatly stored in nokia/srlinux-yang-models repository for programmatic access and code generation&lt;/li&gt;&lt;/ul&gt;</description><link>https://netdevops.me/2022/diy-yang-browser/</link> <pubDate>Wed, 26 Jan 2022 00:00:00 +0000</pubDate><source url="https://netdevops.me/feed_rss_created.xml">Applying DevOps to networks</source><comments>https://netdevops.me/2022/diy-yang-browser/#__comments</comments><guid isPermaLink="true">https://netdevops.me/2022/diy-yang-browser/</guid> </item> <item> <title>Decoding gNMI with Wireshark</title> <author>rdodin</author> <category>gnmi</category> <category>gnmic</category> <category>netrel</category> <description>&lt;h1&gt;Decoding gNMI with Wireshark&lt;/h1&gt;&lt;p&gt;Okay, here goes my first attempt fitting the shoes of a content creator.&lt;/p&gt;&lt;p&gt;Please welcome the &lt;strong&gt;NetRel episode 001 - Decoding gNMI with Wireshark&lt;/strong&gt;, it is a 35min journey of using Wireshark to parse the gNMI traffic (both non-secured and secured).&lt;/p&gt;&lt;p&gt;&lt;center&gt;&lt;/p&gt;&lt;iframe type=&#34;text/html&#34; width=&#34;80%&#34; height=&#34;465&#34; src=&#34;https://www.youtube.com/embed/gRqBMTRKDfE&#34; frameborder=&#34;0&#34;&gt;&lt;/iframe&gt;&lt;p&gt;&lt;/center&gt;&lt;/p&gt;&lt;p&gt;I won&#39;t spend your time explaining the first episode; instead, let me tell you what I want the NetRel series to be about. I am interested in covering the aspects of network automation that are not widely covered.&lt;/p&gt;</description><link>https://netdevops.me/2022/decoding-gnmi-with-wireshark/</link> <pubDate>Tue, 18 Jan 2022 00:00:00 +0000</pubDate><source url="https://netdevops.me/feed_rss_created.xml">Applying DevOps to networks</source><comments>https://netdevops.me/2022/decoding-gnmi-with-wireshark/#__comments</comments><guid isPermaLink="true">https://netdevops.me/2022/decoding-gnmi-with-wireshark/</guid> </item> <item> <title>Using scrapligo with kubectl exec</title> <author>rdodin</author> <category>docker</category> <category>go</category> <category>kubernetes</category> <category>scrapli</category> <description>&lt;h1&gt;Using scrapligo with kubectl exec&lt;/h1&gt;&lt;script type=&#34;text/javascript&#34; src=&#34;https://viewer.diagrams.net/js/viewer-static.min.js&#34; async&gt;&lt;/script&gt;&lt;p&gt;As the networking industry is (slowly) moving towards forklifting networking functions to the cloud-native space we often become the witnesses of mixing decade old tools with cloud-native approaches and architectures.&lt;/p&gt;&lt;p&gt;This post is about one such crazy mixture of using screen scraping library &lt;a href=&#34;https://github.com/scrapli/scrapligo&#34;&gt;scrapligo&lt;/a&gt; with &lt;code&gt;kubectl exec&lt;/code&gt; and &lt;code&gt;docker exec&lt;/code&gt; commands.&lt;/p&gt;</description><link>https://netdevops.me/2021/using-scrapligo-with-kubectl-exec/</link> <pubDate>Tue, 17 Aug 2021 00:00:00 +0000</pubDate><source url="https://netdevops.me/feed_rss_created.xml">Applying DevOps to networks</source><comments>https://netdevops.me/2021/using-scrapligo-with-kubectl-exec/#__comments</comments><guid isPermaLink="true">https://netdevops.me/2021/using-scrapligo-with-kubectl-exec/</guid> </item> <item> <title>Nokia SR Linux goes public</title> <author>rdodin</author> <category>containerlab</category> <category>nokia</category> <category>srlinux</category> <description>&lt;h1&gt;Nokia SR Linux goes public&lt;/h1&gt;&lt;p&gt;It&#39;s been almost two years since Nokia announced its &lt;a href=&#34;https://www.nokia.com/networks/solutions/data-center-switching-fabric/&#34;&gt;Data Center Fabric solution&lt;/a&gt;. The three-layered solution ranged from hardware platforms all the way up in the stack to the DC fabric lifecycle management suite - &lt;a href=&#34;https://www.nokia.com/networks/products/fabric-services-system/&#34;&gt;Fabric Services System (FSS)&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;pic1&#34; src=&#34;https://gitlab.com/rdodin/pics/-/wikis/uploads/25f1ebe301b17296975c165fc2889d2a/image.png&#34;&gt;&lt;/p&gt;&lt;p&gt;At the very heart of the DC Fabric solution lies a purpose-built, modern Network OS - &lt;a href=&#34;https://www.nokia.com/networks/products/service-router-linux-NOS/&#34;&gt;SR Linux&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href=&#34;https://gitlab.com/rdodin/pics/-/wikis/uploads/96e2a0b880aede62dbaf1152608d6119/image.png&#34;&gt;&lt;img alt=&#34;pic2&#34; src=&#34;https://gitlab.com/rdodin/pics/-/wikis/uploads/96e2a0b880aede62dbaf1152608d6119/image.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;SR Linux comes with quite some interesting and innovative ideas. By being able to design the NOS from the ground up, the product team was freed from the legacy burdens which will be there have they decided to built the NOS on top of the existing one. Features like:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;YANG-first APIs&lt;/li&gt;&lt;li&gt;Protobuf based SDK&lt;/li&gt;&lt;li&gt;Disaggregated application stack&lt;/li&gt;&lt;li&gt;Programmable CLI&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;are the result of taking a fresh look at the modern data center networks and building the NOS for the Netdevops era.&lt;/p&gt;&lt;p&gt;No wonders engineers around the world wanted to play with SR Linux and take those features for a spin first hand. And today it is finally possible!&lt;/p&gt;</description><link>https://netdevops.me/2021/nokia-sr-linux-goes-public/</link> <pubDate>Wed, 21 Jul 2021 00:00:00 +0000</pubDate><source url="https://netdevops.me/feed_rss_created.xml">Applying DevOps to networks</source><comments>https://netdevops.me/2021/nokia-sr-linux-goes-public/#__comments</comments><guid isPermaLink="true">https://netdevops.me/2021/nokia-sr-linux-goes-public/</guid> </item> <item> <title>Network automation options in Go with scrapligo</title> <author>rdodin</author> <category>netconf</category> <category>scrapli</category> <category>textfsm</category> <description>&lt;h1&gt;Network automation options in Go with scrapligo&lt;/h1&gt;&lt;p&gt;Just recently the network automation folks witnessed a great library to be ported from Python to Go - &lt;a href=&#34;https://github.com/scrapli/scrapligo&#34;&gt;scrapligo&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;center&gt;&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;Been working on learning go a bit and have published scrapligo &lt;a href=&#34;https://t.co/NDXQ6khxCr&#34;&gt;https://t.co/NDXQ6khxCr&lt;/a&gt; -- still a work in progress, but has been a fun learning experience! Check it out and let me know what ya think! 🤠&lt;/p&gt;&amp;mdash; Carl Montanari (@carlrmontanari) &lt;a href=&#34;https://twitter.com/carlrmontanari/status/1395048837656367105?ref_src=twsrc%5Etfw&#34;&gt;May 19, 2021&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;&lt;/center&gt;&lt;/p&gt;&lt;p&gt;For me personally this was a pivotal point because with scrapligo the Go-minded netengs can now automate their networks with a solid and performant library.&lt;/p&gt;&lt;p&gt;One of the things that scrapligo packs is, of course, the ability to reliably &lt;em&gt;talk&lt;/em&gt; to the network devices using the same command line interface as a human would normally do. That means that scrapligo would send and receive the pieces of data that an operator would send/receive if they were connected with a terminal over SSH.&lt;/p&gt;</description><link>https://netdevops.me/2021/network-automation-options-in-go-with-scrapligo/</link> <pubDate>Wed, 09 Jun 2021 00:00:00 +0000</pubDate><source url="https://netdevops.me/feed_rss_created.xml">Applying DevOps to networks</source><comments>https://netdevops.me/2021/network-automation-options-in-go-with-scrapligo/#__comments</comments><guid isPermaLink="true">https://netdevops.me/2021/network-automation-options-in-go-with-scrapligo/</guid> </item> </channel></rss>