<?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>DEV Community: Tia Zanella</title>
    <description>The latest articles on DEV Community by Tia Zanella (@skhell).</description>
    <link>https://dev.clauneck.workers.dev/skhell</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3076164%2F55201fb8-4c97-4431-b85c-746f5f7c3036.jpg</url>
      <title>DEV Community: Tia Zanella</title>
      <link>https://dev.clauneck.workers.dev/skhell</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.clauneck.workers.dev/feed/skhell"/>
    <language>en</language>
    <item>
      <title>When Go meets simplicity over Python or Ansible</title>
      <dc:creator>Tia Zanella</dc:creator>
      <pubDate>Fri, 19 Jun 2026 18:21:32 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/skhell/when-automation-meets-simplicity-over-python-or-ansible-2ilp</link>
      <guid>https://dev.clauneck.workers.dev/skhell/when-automation-meets-simplicity-over-python-or-ansible-2ilp</guid>
      <description>&lt;p&gt;We constantly hear that Ansible and Python are apparently the only ways to automate networks, today I even listen in a conversation "Python is the industry standard" probably I missed the RFC document or probably the guy was referring to a sales standard, but back to us what happens when the framework, the platform or the software we are using becomes heavier than the problem to solve?&lt;/p&gt;

&lt;p&gt;There is a moment where automation becomes necessary, not because we want to look modern, not because every task deserves a framework and not simply because adding automation automatically means we are doing things better. It becomes necessary because repeating the same command collection manually across many devices is slow, risky, boring and almost impossible to diff and validate properly especially under pressure.&lt;/p&gt;

&lt;p&gt;For this reason I built the &lt;a href="https://github.com/skhell/cisco-go-collector" rel="noopener noreferrer"&gt;Cisco Go Collector&lt;/a&gt; during a real migration activity with a very practical goal: collect configuration and command outputs from Cisco devices in an easily repeatable way, without forcing every colleague involved in the process to become developers or to install an automation stack just to run a super simple flow.&lt;/p&gt;

&lt;p&gt;The idea was simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;define the devices in a CSV which is the comfort zone for everyone&lt;/li&gt;
&lt;li&gt;define the commands in the same CSV file, super simple and organized to manage one row per device&lt;/li&gt;
&lt;li&gt;run a portable Go binary against that CSV file&lt;/li&gt;
&lt;li&gt;collect the outputs in organized text files&lt;/li&gt;
&lt;li&gt;archive the result as operational evidence that can be easily diff&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is it!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;super lightweight to run&lt;/li&gt;
&lt;li&gt;no Python virtual environment&lt;/li&gt;
&lt;li&gt;no Ansible playbook structure&lt;/li&gt;
&lt;li&gt;no inventory hierarchy&lt;/li&gt;
&lt;li&gt;no framework onboarding&lt;/li&gt;
&lt;li&gt;no additional runtime or software on corporate managed workstations&lt;/li&gt;
&lt;li&gt;just a CSV file and a compiled binary&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The automation and AI trap when the solution is heavier than the problem to solve
&lt;/h2&gt;

&lt;p&gt;I love automation and I fully support AI if used the proper way, but we have to find a balance and recognize when to choose one tool over the other and specially one programming language over the other.&lt;/p&gt;

&lt;p&gt;In this specific case, I wanted something very fast, lightweight, portable and executable freely in a managed environment.&lt;br&gt;
The immediate thought for many would be: let's write a Python script, it would work, but then you introduce dependencies overhead of security risks, you have to ask users to install the environment, manage virtual environments and deal with pip we all know the story nearly impossible to obtain in managed environments and indeed quite useless to run a simple collector.&lt;/p&gt;

&lt;p&gt;Using Ansible for a simple collection task is like using a bazooka to kill a mosquito, frameworks like Netmiko, Nornir, pyATS, and similar ecosystems are excellent when the problem requires state management, reusable workflows, validation logic, abstraction layers, structured inventory, compliance, CI/CD integration, or large-scale governance.&lt;/p&gt;

&lt;p&gt;But I think not every operational task requires that level of machinery and complexity overhead, sometimes the real problem is much smaller: I need to simply connect to many devices, run a known list of commands, save the outputs and make the result easy to review among my colleagues as simply as that!&lt;br&gt;
In that scenario, the complexity of the automation environment can become bigger than the task itself and in my opinion team balance matters most then the technology used to achieve the result. &lt;/p&gt;

&lt;p&gt;Developing Python scripts or Ansible YAML requires a specific level of knowledge of what we do, whereas using a CSV file is straightforward for everyone, this is especially true in managed corporate environments, where engineers often work on locked-down laptops, jump servers, or controlled workstations, installing Python packages or external dependencies may require approvals. Even when installation is possible, supportability becomes part of the problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;who owns the runtime?&lt;/li&gt;
&lt;li&gt;who updates the dependencies?&lt;/li&gt;
&lt;li&gt;who validates the Python version?&lt;/li&gt;
&lt;li&gt;who explains the playbook structure to non-developers?&lt;/li&gt;
&lt;li&gt;who supports the colleague who only needs to run some migration checks at 02:00 during a change window?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those questions matter.&lt;br&gt;
Automation is not only about what is technically possible, automation is also about what is operationally usable and make life easy!&lt;/p&gt;
&lt;h2&gt;
  
  
  So why not just use Ansible?
&lt;/h2&gt;

&lt;p&gt;Ansible is a great tool, for many network automation use cases, it is the graal.&lt;/p&gt;

&lt;p&gt;It gives you inventories, variables, modules, playbooks, idempotency, roles, collections and a broad ecosystem. If the goal is configuration management, desired state, multi-step orchestration or repeatable infrastructure workflows, Ansible is a serious candidate.&lt;/p&gt;

&lt;p&gt;But for this project, I was not trying to model the network state.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I was not trying to push configuration&lt;/li&gt;
&lt;li&gt;I was not trying to build a source-of-truth-driven workflow&lt;/li&gt;
&lt;li&gt;I was not trying to create a full orchestration layer&lt;/li&gt;
&lt;li&gt;I was not trying to introduce a new automation culture during a migration window&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal was more direct: let network engineers declare what they want to collect in a CSV, then execute it consistently.&lt;br&gt;
That may sound too simple to be truth, but simplicity is exactly the strength here.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a CSV file can be opened by everyone&lt;/li&gt;
&lt;li&gt;it can be reviewed before execution&lt;/li&gt;
&lt;li&gt;it can be attached to a change request&lt;/li&gt;
&lt;li&gt;it can be versioned in Git&lt;/li&gt;
&lt;li&gt;it can be edited by people who do not write code&lt;/li&gt;
&lt;li&gt;it can be validated by another engineer before the migration starts and edit super fast in case of need&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this use case, the CSV is not a limitation, it became the operational contract.&lt;/p&gt;
&lt;h2&gt;
  
  
  The CSV as the human interface
&lt;/h2&gt;

&lt;p&gt;The design starts from a very basic assumption as the input should be understandable by the whole team.&lt;br&gt;
A typical CSV file describes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;datacenter&lt;/th&gt;
&lt;th&gt;room&lt;/th&gt;
&lt;th&gt;rack&lt;/th&gt;
&lt;th&gt;hostname&lt;/th&gt;
&lt;th&gt;ip&lt;/th&gt;
&lt;th&gt;platform&lt;/th&gt;
&lt;th&gt;category&lt;/th&gt;
&lt;th&gt;command&lt;/th&gt;
&lt;th&gt;target_ip&lt;/th&gt;
&lt;th&gt;vrf&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DC1&lt;/td&gt;
&lt;td&gt;ROOM-A&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;MPX01&lt;/td&gt;
&lt;td&gt;10.10.10.100&lt;/td&gt;
&lt;td&gt;nx-os&lt;/td&gt;
&lt;td&gt;common&lt;/td&gt;
&lt;td&gt;show clock&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DC1&lt;/td&gt;
&lt;td&gt;ROOM-A&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;MPX01&lt;/td&gt;
&lt;td&gt;10.10.10.100&lt;/td&gt;
&lt;td&gt;nx-os&lt;/td&gt;
&lt;td&gt;common&lt;/td&gt;
&lt;td&gt;show vlan brief&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DC1&lt;/td&gt;
&lt;td&gt;ROOM-A&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;MPX01&lt;/td&gt;
&lt;td&gt;10.10.10.100&lt;/td&gt;
&lt;td&gt;nx-os&lt;/td&gt;
&lt;td&gt;common&lt;/td&gt;
&lt;td&gt;show pbr static summary&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DC1&lt;/td&gt;
&lt;td&gt;ROOM-A&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;MPX01&lt;/td&gt;
&lt;td&gt;10.10.10.100&lt;/td&gt;
&lt;td&gt;nx-os&lt;/td&gt;
&lt;td&gt;specialized&lt;/td&gt;
&lt;td&gt;show ip route ospf-xxx vrf all&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DC1&lt;/td&gt;
&lt;td&gt;ROOM-A&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;MPX01&lt;/td&gt;
&lt;td&gt;10.10.10.100&lt;/td&gt;
&lt;td&gt;nx-os&lt;/td&gt;
&lt;td&gt;specialized&lt;/td&gt;
&lt;td&gt;show ip ospf neighbor vrf all&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DC1&lt;/td&gt;
&lt;td&gt;ROOM-B&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;MPX02&lt;/td&gt;
&lt;td&gt;10.10.30.100&lt;/td&gt;
&lt;td&gt;ios-xe&lt;/td&gt;
&lt;td&gt;connectivity&lt;/td&gt;
&lt;td&gt;traceroute&lt;/td&gt;
&lt;td&gt;10.0.0.1&lt;/td&gt;
&lt;td&gt;VRFNAME&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DC1&lt;/td&gt;
&lt;td&gt;ROOM-B&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;MPX02&lt;/td&gt;
&lt;td&gt;10.10.30.100&lt;/td&gt;
&lt;td&gt;ios-xe&lt;/td&gt;
&lt;td&gt;connectivity&lt;/td&gt;
&lt;td&gt;ping&lt;/td&gt;
&lt;td&gt;10.0.0.1&lt;/td&gt;
&lt;td&gt;VRFNAME&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DC1&lt;/td&gt;
&lt;td&gt;ROOM-B&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;MPX03&lt;/td&gt;
&lt;td&gt;10.10.20.100&lt;/td&gt;
&lt;td&gt;nx-os&lt;/td&gt;
&lt;td&gt;connectivity&lt;/td&gt;
&lt;td&gt;traceroute&lt;/td&gt;
&lt;td&gt;1.1.1.1&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DC1&lt;/td&gt;
&lt;td&gt;ROOM-B&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;MPX03&lt;/td&gt;
&lt;td&gt;10.10.20.100&lt;/td&gt;
&lt;td&gt;nx-os&lt;/td&gt;
&lt;td&gt;connectivity&lt;/td&gt;
&lt;td&gt;ping&lt;/td&gt;
&lt;td&gt;1.1.1.1&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This gives the team a simple way to answer three important questions before execution and act fast on changes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;which devices are involved?&lt;/li&gt;
&lt;li&gt;which commands will be executed?&lt;/li&gt;
&lt;li&gt;where will the evidence be stored?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That transparency is extremely important during migrations when pressure is high, ambiguity is expensive as like ask someone to develop a solution to achieve this simple result. A deterministic CSV file viceversa is easier to review than a conversation in a chat, easier to validate than a copy-paste checklist and easier to archive than manual terminal history.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Go?
&lt;/h2&gt;

&lt;p&gt;Go was a very practical choice. Its value is not that it's fashionable, but that it allows the tool to be distributed as a single compiled executable and it is blazing fast when handling parallel requests.&lt;/p&gt;

&lt;p&gt;For this specific use case, that matters more than language elegance, compiled binary is easier to distribute in a locked-down environment. It reduces the need for local runtime preparation and avoids asking every operator to install Python packages, manage virtual environments or align dependency versions.&lt;/p&gt;

&lt;p&gt;The operational model becomes simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;prepare CSV -&amp;gt; run binary -&amp;gt; collect output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the whole workflow, for a migration team, this is powerful because the tool becomes almost invisible. People do not need to understand the internal code to use it they only need to understand the CSV and wait for the expected output.&lt;/p&gt;

&lt;p&gt;That is the kind of automation I like: not impressive from the outside, but extremely useful when the team is under pressure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Internal architecture
&lt;/h2&gt;

&lt;p&gt;The project is intentionally small, but not random and available to welcome additional scenarios, the internal logic can be seen as four layers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CSV input -&amp;gt; Device and command model -&amp;gt; SSH execution engine -&amp;gt; Structured output writer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. CSV loader
&lt;/h3&gt;

&lt;p&gt;The loader reads the CSV header, validates the required columns and creates a list of devices.&lt;/p&gt;

&lt;p&gt;Required fields include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;datacenter, room, zone, hostname, ip, platform, category, command
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Optional fields include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;target_ip, vrf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Commands are grouped by hostname, so each device can have multiple commands attached to it this avoids treating every CSV row as an isolated connection task and gives the execution layer a cleaner device-centric model.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Platform-aware command builder
&lt;/h3&gt;

&lt;p&gt;Most commands are executed exactly as written if the command is a normal CLI command such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;show version
show interface status
show ip route
show running-config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the collector sends the command directly to the device, for commands such as &lt;code&gt;ping&lt;/code&gt; and &lt;code&gt;traceroute&lt;/code&gt;, the tool can generate the correct Cisco syntax using the optional &lt;code&gt;target_ip&lt;/code&gt; and &lt;code&gt;vrf&lt;/code&gt; fields, this matters because syntax differs between platforms.&lt;/p&gt;

&lt;p&gt;For NX-OS, the structure is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ping 10.10.10.10 vrf management
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For IOS-XE, the structure is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ping vrf management 10.10.10.10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CSV remains simple, while the tool handles the platform-specific command construction.&lt;br&gt;
That is a small detail, but it is exactly the kind of detail that becomes annoying during operational work the more devices and VRFs involved, the more valuable this becomes.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. SSH execution engine
&lt;/h3&gt;

&lt;p&gt;The SSH layer opens an interactive shell, requests a pseudo-terminal and disables terminal paging with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;terminal length 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is important because command output must be collected completely, without pagination prompts interrupting the stream, the runner then sends each command and reads the output until the device prompt returns.&lt;br&gt;
This approach is simple, but it also requires care, Cisco CLI output is not a clean API response it is terminal text and the collector needs to detect when the command has finished, strip the echoed command, remove the trailing prompt and write only the meaningful output.&lt;/p&gt;

&lt;p&gt;The prompt detection logic is intentionally conservative, it looks for Cisco-like prompts ending in &lt;code&gt;&amp;gt;&lt;/code&gt; or &lt;code&gt;#&lt;/code&gt; at the end of the output, avoiding premature matches in the middle of command text.&lt;/p&gt;

&lt;p&gt;Timeout handling is also important if a command hangs or takes too long, the session tries to recover by sending an interrupt, if recovery fails, the session is considered unhealthy and the caller should stop sending more commands to that device.&lt;br&gt;
This is not glamorous code, but it is the kind of defensive logic that makes a small operational tool usable.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Structured output writer
&lt;/h3&gt;

&lt;p&gt;The output writer creates a deterministic evidence tree.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;output/
└── 2026-06-19T12-30-00Z/
    └── DC1/
        └── ROOM-A/
            └── CORE/
                └── leaf01/
                    ├── show_version.txt
                    ├── show_interface_status.txt
                    └── specialized/
                        └── ping_vrf_management_10_10_10_10.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is more than cosmetic.&lt;br&gt;
A structured folder tree makes it easier to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;compare pre-check and post-check outputs&lt;/li&gt;
&lt;li&gt;share results with colleagues&lt;/li&gt;
&lt;li&gt;archive migration data&lt;/li&gt;
&lt;li&gt;support troubleshooting and RCA activities&lt;/li&gt;
&lt;li&gt;understand which device produced which output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The filenames are sanitized so commands become filesystem-safe text files, again, simple detail, big operational value.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where AI fits and where it should not
&lt;/h2&gt;

&lt;p&gt;This project also raises an interesting question, in the AI era, why write a deterministic command collector at all can we ask AI to connect directly to the devices?&lt;/p&gt;

&lt;p&gt;Answer is NO, AI and automations solve different problems.&lt;/p&gt;

&lt;p&gt;AI is excellent for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;helping design the tool&lt;/li&gt;
&lt;li&gt;reviewing code&lt;/li&gt;
&lt;li&gt;explaining trade-offs&lt;/li&gt;
&lt;li&gt;generating documentation&lt;/li&gt;
&lt;li&gt;creating test cases&lt;/li&gt;
&lt;li&gt;suggesting edge cases&lt;/li&gt;
&lt;li&gt;helping non-developers understand the workflow&lt;/li&gt;
&lt;li&gt;converting operational notes into structured CSV drafts&lt;/li&gt;
&lt;li&gt;summarizing collected outputs after execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I would be very careful about using AI as the direct execution layer for network changes or production command collection without strict boundaries.&lt;/p&gt;

&lt;p&gt;During a migration, I do not want a probabilistic system deciding what to execute on a device and potentially drift or reprocess with the risk of altering the data output.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I want deterministic input&lt;/li&gt;
&lt;li&gt;I want human review&lt;/li&gt;
&lt;li&gt;I want predictable execution&lt;/li&gt;
&lt;li&gt;I want repeatable output that happen blazing fast at &lt;strong&gt;zero cost&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;I want an artifact that can be stored and audited later&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where a simple program has play a strategic role, the CSV file defines intent in a deterministic way, the Go binary executes exactly what was declared, the output folder stores the evidence.&lt;br&gt;
AI can help around the workflow or to answer quickly some question or clarify doubts later, but it should not blur the execution contract.&lt;/p&gt;

&lt;p&gt;In other words AI is useful as an assistant, the automation engine must remain deterministic, this distinction is very important for me.&lt;br&gt;
AI can help us move faster, but it should not make operational execution less explainable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Simplicity is not the opposite of engineering
&lt;/h2&gt;

&lt;p&gt;There is a common mistake in technical environments: assuming that simple tools are less serious. I believe the opposite is true, a simple tool can be the result of very deliberate engineering decisions.&lt;/p&gt;

&lt;p&gt;In this case, the decisions were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use CSV because the team can review it&lt;/li&gt;
&lt;li&gt;use Go because the result can be distributed as a binary&lt;/li&gt;
&lt;li&gt;use SSH because the devices already expose CLI access&lt;/li&gt;
&lt;li&gt;write text files because they are easy to archive and compare&lt;/li&gt;
&lt;li&gt;keep the scope narrow because the goal is operational reliability&lt;/li&gt;
&lt;li&gt;avoid framework dependency because the environment is managed&lt;/li&gt;
&lt;li&gt;avoid AI-driven execution because the task requires determinism&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach is not anti-framework, anti-AI, or anti-Python. It is simply about choosing the right level of abstraction for the specific problem at hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  When I would still choose Ansible, Python or a framework
&lt;/h2&gt;

&lt;p&gt;I would not use Cisco Go Collector for everything. I would still choose Ansible, Python, Nornir, pyATS, or a comprehensive framework when I need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;complex workflows&lt;/li&gt;
&lt;li&gt;configuration deployment&lt;/li&gt;
&lt;li&gt;idempotency&lt;/li&gt;
&lt;li&gt;reusable automation roles&lt;/li&gt;
&lt;li&gt;source-of-truth integration&lt;/li&gt;
&lt;li&gt;structured parsing&lt;/li&gt;
&lt;li&gt;compliance checks&lt;/li&gt;
&lt;li&gt;CI/CD pipelines&lt;/li&gt;
&lt;li&gt;test-driven network validation&lt;/li&gt;
&lt;li&gt;multi-vendor abstraction&lt;/li&gt;
&lt;li&gt;API-first automation&lt;/li&gt;
&lt;li&gt;long-term automation platform governance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are valid, essential use cases. But for quick, repeatable, human-reviewable command collection during a migration window, a small deterministic collector is a much better operational fit.&lt;/p&gt;

&lt;h2&gt;
  
  
  A simple decision model
&lt;/h2&gt;

&lt;p&gt;The conversation should not be "framework vs. no framework." the real question is: what is the smallest reliable automation model that solves the operational problem without creating unnecessary friction?&lt;/p&gt;

&lt;p&gt;Here is a practical decision matrix:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Better fit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One-time or repeated command collection&lt;/td&gt;
&lt;td&gt;Small collector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Migration pre/post checks&lt;/td&gt;
&lt;td&gt;Small collector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evidence capture for RCA&lt;/td&gt;
&lt;td&gt;Small collector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-developer operators involved&lt;/td&gt;
&lt;td&gt;Small collector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locked-down workstation environment&lt;/td&gt;
&lt;td&gt;Small collector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Desired-state configuration management&lt;/td&gt;
&lt;td&gt;Ansible / framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complex orchestration&lt;/td&gt;
&lt;td&gt;Ansible / Nornir / Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structured validation and parsing&lt;/td&gt;
&lt;td&gt;pyATS / Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platform governance and reusable roles&lt;/td&gt;
&lt;td&gt;Automation platform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Natural language explanation and documentation&lt;/td&gt;
&lt;td&gt;AI assistant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production execution decisions&lt;/td&gt;
&lt;td&gt;Deterministic automation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is not a competition between tools, it is a matter of operational fit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The strategic role of boring automation
&lt;/h2&gt;

&lt;p&gt;The more I work in complex infrastructure environments, the more I appreciate boring automation.&lt;/p&gt;

&lt;p&gt;Boring automation is predictable, it is reviewable, it is easy to explain, it survives change windows and it does not require everyone on the team to learn a new ecosystem. Sometimes, boring automation is exactly what allows a team to move faster.&lt;/p&gt;

&lt;p&gt;Cisco Go Collector is intentionally small. It does not try to become a super big project, it simply solves a real operational problem: run declared Cisco CLI commands in an easy way and collect the outputs in an organized way.&lt;/p&gt;

&lt;p&gt;That simplicity is not a weakness, it is the core feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Love to hear from your experience
&lt;/h2&gt;

&lt;p&gt;I believe the future of infrastructure automation will not only be about bigger platforms, AI agents, or higher abstraction. Those things will matter, but there will also be an increasing need for small, deterministic, portable tools that solve specific operational problems with zero friction.&lt;/p&gt;

&lt;p&gt;Especially in large corporate environments, the best technical solution is not always the most sophisticated one. The best automation is the one your colleagues can actually run, understand, review, and trust.&lt;/p&gt;

&lt;p&gt;That is where simplicity becomes strategic.&lt;br&gt;
What is your favorite piece of "boring automation"? Let me know in the comments!&lt;/p&gt;

&lt;p&gt;Ciao from Italy&lt;br&gt;
Tia&lt;/p&gt;

</description>
      <category>go</category>
      <category>cli</category>
      <category>cisco</category>
      <category>automation</category>
    </item>
    <item>
      <title>I got tired of copying ping, traceroute, MTR and port checks so I built pingtrace</title>
      <dc:creator>Tia Zanella</dc:creator>
      <pubDate>Tue, 16 Jun 2026 10:07:31 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/skhell/i-got-tired-of-copying-ping-traceroute-mtr-and-port-checks-so-i-built-pingtrace-277p</link>
      <guid>https://dev.clauneck.workers.dev/skhell/i-got-tired-of-copying-ping-traceroute-mtr-and-port-checks-so-i-built-pingtrace-277p</guid>
      <description>&lt;p&gt;I built &lt;a href="https://github.com/skhell/pingtrace" rel="noopener noreferrer"&gt;https://github.com/skhell/pingtrace&lt;/a&gt; because network troubleshooting is rarely about one single command.&lt;/p&gt;

&lt;p&gt;It usually starts simple, someone says &lt;strong&gt;the service XYZ is not reachable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then the real work begins.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You ping the target.
&lt;/li&gt;
&lt;li&gt;You run traceroute or tracert.
&lt;/li&gt;
&lt;li&gt;You maybe run MTR.
&lt;/li&gt;
&lt;li&gt;You check DNS.
&lt;/li&gt;
&lt;li&gt;You check whether the service port is reachable.
&lt;/li&gt;
&lt;li&gt;You copy outputs into notes.
&lt;/li&gt;
&lt;li&gt;You repeat the same thing for another host, then another subnet, then another environment.
&lt;/li&gt;
&lt;li&gt;Finally, you try to turn all of that into evidence for a ticket, incident report, handover or RCA.&lt;/li&gt;
&lt;li&gt;And for public IPs? I let you imagine.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The problem is not that &lt;code&gt;ping&lt;/code&gt; or &lt;code&gt;traceroute&lt;/code&gt; are hard.&lt;br&gt;
The problem is the context switching.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/skhell/pingtrace" rel="noopener noreferrer"&gt;https://github.com/skhell/pingtrace&lt;/a&gt; is my attempt to reduce that friction.&lt;/p&gt;


&lt;h2&gt;
  
  
  What pingtrace is
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/skhell/pingtrace" rel="noopener noreferrer"&gt;https://github.com/skhell/pingtrace&lt;/a&gt; is a terminal-first CLI for rapid network troubleshooting.&lt;/p&gt;

&lt;p&gt;It combines several common checks into one workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ping&lt;/li&gt;
&lt;li&gt;traceroute / tracert depending on the operating system&lt;/li&gt;
&lt;li&gt;MTR-style probing&lt;/li&gt;
&lt;li&gt;TCP service reachability checks without nmap or root access&lt;/li&gt;
&lt;li&gt;reverse DNS enrichment&lt;/li&gt;
&lt;li&gt;optional &lt;a href="https://ipinfo.io/" rel="noopener noreferrer"&gt;ipinfo.io&lt;/a&gt; enrichment&lt;/li&gt;
&lt;li&gt;optional &lt;a href="https://www.peeringdb.com/" rel="noopener noreferrer"&gt;PeeringDB&lt;/a&gt; enrichment&lt;/li&gt;
&lt;li&gt;CSV export&lt;/li&gt;
&lt;li&gt;JSON export&lt;/li&gt;
&lt;li&gt;multiple targets&lt;/li&gt;
&lt;li&gt;CIDR ranges&lt;/li&gt;
&lt;li&gt;input from file&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  The idea is very simple
&lt;/h3&gt;

&lt;p&gt;get a clean, readable and exportable view of reachability, path and service availability in one run.&lt;/p&gt;

&lt;p&gt;It is not meant to replace the standard tools.&lt;/p&gt;

&lt;p&gt;I still trust &lt;code&gt;ping&lt;/code&gt;, &lt;code&gt;traceroute&lt;/code&gt;, &lt;code&gt;mtr&lt;/code&gt; and still use specialized tools when I need them.&lt;br&gt;
&lt;a href="https://github.com/skhell/pingtrace" rel="noopener noreferrer"&gt;https://github.com/skhell/pingtrace&lt;/a&gt; sits in the middle: a practical wrapper for the troubleshooting workflow I see repeat constantly.&lt;/p&gt;


&lt;h2&gt;
  
  
  The workflow problem
&lt;/h2&gt;

&lt;p&gt;During incidents, the technical check is only half of the job, the other half is communication.&lt;br&gt;
You need to explain what you tested, from where, against which target, with what result.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Was ICMP reachable if not blocked by firewall?&lt;/li&gt;
&lt;li&gt;Did the path complete?&lt;/li&gt;
&lt;li&gt;Where did the trace stop?&lt;/li&gt;
&lt;li&gt;Did DNS resolve?&lt;/li&gt;
&lt;li&gt;Was TCP/443 reachable?&lt;/li&gt;
&lt;li&gt;Was TCP/22 reachable?&lt;/li&gt;
&lt;li&gt;Was the issue isolated to one host or a range?&lt;/li&gt;
&lt;li&gt;Can I attach the output to a ticket?&lt;/li&gt;
&lt;li&gt;Can someone else read the result without guessing what I did?&lt;/li&gt;
&lt;li&gt;Can you handoff to the night shift to follow troubleshooting?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is where raw terminal output becomes messy, one command is fine, while twenty terminal windows during a live incident are not.&lt;/p&gt;

&lt;p&gt;This type of workflow is very similar when you want a "before and after" that preceed and succeed a migration.&lt;/p&gt;


&lt;h2&gt;
  
  
  pingtrace basic examples
&lt;/h2&gt;

&lt;p&gt;Run ping and trace against one target:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pingtrace 1.1.1.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run MTR mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pingtrace 1.1.1.1 &lt;span class="nt"&gt;--mtr&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run bounded MTR and export the result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pingtrace 1.1.1.1 &lt;span class="nt"&gt;--mtr&lt;/span&gt; &lt;span class="nt"&gt;--cycles&lt;/span&gt; 10 &lt;span class="nt"&gt;--interval&lt;/span&gt; 2 &lt;span class="nt"&gt;--export&lt;/span&gt; ./reports
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run against multiple targets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pingtrace 1.1.1.1,8.8.8.8,example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run against a CIDR:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pingtrace 10.0.0.0/30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run from a file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pingtrace &lt;span class="nt"&gt;--file&lt;/span&gt; ./targets.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Export CSV and JSON evidence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pingtrace 1.1.1.1 &lt;span class="nt"&gt;--export&lt;/span&gt; ./reports &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  TCP service reachability without nmap and root/admin
&lt;/h2&gt;

&lt;p&gt;The latest improvement adds TCP service reachability checks.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pingtrace 10.0.0.1 &lt;span class="nt"&gt;--ports&lt;/span&gt; 22,80,443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Against a small CIDR:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pingtrace 10.0.0.0/28 &lt;span class="nt"&gt;--ports&lt;/span&gt; 22,80,443 &lt;span class="nt"&gt;--export&lt;/span&gt; ./reports
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or all ports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pingtrace 10.0.0.1 &lt;span class="nt"&gt;--ports&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This uses TCP connect behavior and that matters because it does not require root/admin privileges.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No raw sockets.
&lt;/li&gt;
&lt;li&gt;No privileged execution.
&lt;/li&gt;
&lt;li&gt;No special setup for the common troubleshooting case.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also enriches known ports with IANA service names where possible.&lt;br&gt;
This is not intended to replace &lt;code&gt;nmap&lt;/code&gt; or &lt;code&gt;masscan&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Those tools are excellent and much deeper, my purpose here is again different and simple.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pingtrace --ports&lt;/code&gt; is for fast operational reachability checks:&lt;/p&gt;
&lt;h3&gt;
  
  
  Can this client reach this TCP service from here?
&lt;/h3&gt;

&lt;p&gt;That question appears constantly in real infrastructure work.&lt;/p&gt;


&lt;h2&gt;
  
  
  Enrichment with DNS ipinfo.io and PeeringDB
&lt;/h2&gt;

&lt;p&gt;Troubleshooting is easier when the output gives context, an IP address alone is not always enough and &lt;a href="https://github.com/skhell/pingtrace" rel="noopener noreferrer"&gt;https://github.com/skhell/pingtrace&lt;/a&gt; can enrich results with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reverse DNS&lt;/li&gt;
&lt;li&gt;private DNS for internal environments&lt;/li&gt;
&lt;li&gt;public DNS&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ipinfo.io/" rel="noopener noreferrer"&gt;ipinfo.io&lt;/a&gt; data&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.peeringdb.com/" rel="noopener noreferrer"&gt;PeeringDB&lt;/a&gt; context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is useful when looking at public paths, carrier hops, cloud networks, content networks or peering-related information.&lt;br&gt;
Private and public addresses are handled differently, because internal infrastructure should not be treated like Internet routing data.&lt;/p&gt;

&lt;p&gt;The goal is not to make assumptions, the goal is to give the engineer more context in the same output.&lt;/p&gt;


&lt;h2&gt;
  
  
  Export matters
&lt;/h2&gt;

&lt;p&gt;I care a lot about export quality and standardization because troubleshooting does not end in the terminal.&lt;/p&gt;

&lt;p&gt;Sooner or later, someone asks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you send me the evidence?&lt;/strong&gt; or &lt;strong&gt;Can you attach the result to the incident?&lt;/strong&gt; or &lt;strong&gt;Can we use this in the RCA?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/skhell/pingtrace" rel="noopener noreferrer"&gt;https://github.com/skhell/pingtrace&lt;/a&gt; can export CSV and JSON reports.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pingtrace app.example.com &lt;span class="nt"&gt;--export&lt;/span&gt; ./incident-123 &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a TCP reachability check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pingtrace app.example.com &lt;span class="nt"&gt;--ports&lt;/span&gt; 80,443 &lt;span class="nt"&gt;--export&lt;/span&gt; ./incident-123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a small subnet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pingtrace 10.0.12.0/28 &lt;span class="nt"&gt;--ports&lt;/span&gt; 22,80,443 &lt;span class="nt"&gt;--export&lt;/span&gt; ./incident-123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes the tool useful not only for interactive troubleshooting, but also for documentation and team handover.&lt;/p&gt;




&lt;h2&gt;
  
  
  What pingtrace is not
&lt;/h2&gt;

&lt;p&gt;I want to keep the scope honest.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/skhell/pingtrace" rel="noopener noreferrer"&gt;https://github.com/skhell/pingtrace&lt;/a&gt; is not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a replacement for &lt;code&gt;nmap&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;a replacement for full observability&lt;/li&gt;
&lt;li&gt;a packet analyzer&lt;/li&gt;
&lt;li&gt;a vulnerability scanner&lt;/li&gt;
&lt;li&gt;a network monitoring platform&lt;/li&gt;
&lt;li&gt;a magic root cause engine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is a focused CLI for reachability, path visibility, TCP service checks, enrichment and export, that focus matters.&lt;br&gt;
Many tools become less useful when they try to become everything.&lt;/p&gt;

&lt;p&gt;I want &lt;a href="https://github.com/skhell/pingtrace" rel="noopener noreferrer"&gt;https://github.com/skhell/pingtrace&lt;/a&gt; to stay clean and practical.&lt;/p&gt;


&lt;h2&gt;
  
  
  Who it is for
&lt;/h2&gt;

&lt;p&gt;I am building &lt;a href="https://github.com/skhell/pingtrace" rel="noopener noreferrer"&gt;https://github.com/skhell/pingtrace&lt;/a&gt; for people who actually troubleshoot and plan infrastructure changes or migration:&lt;br&gt;
The best use case is when you need a fast answer and a clean repeatable artifacts.&lt;/p&gt;

&lt;p&gt;Not just:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it reachable?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But also:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I show what I tested in a clean standardized format?&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Example incident flow
&lt;/h2&gt;

&lt;p&gt;A simple workflow could look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;incident-456

pingtrace app.example.com &lt;span class="nt"&gt;--mtr&lt;/span&gt; &lt;span class="nt"&gt;--cycles&lt;/span&gt; 10 &lt;span class="nt"&gt;--interval&lt;/span&gt; 2 &lt;span class="nt"&gt;--export&lt;/span&gt; ./incident-456 &lt;span class="nt"&gt;--json&lt;/span&gt;

pingtrace app.example.com &lt;span class="nt"&gt;--ports&lt;/span&gt; 80,443 &lt;span class="nt"&gt;--export&lt;/span&gt; ./incident-456

pingtrace 10.0.12.0/28 &lt;span class="nt"&gt;--ports&lt;/span&gt; 22,80,443 &lt;span class="nt"&gt;--export&lt;/span&gt; ./incident-456
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the end, I have a directory with evidence I can reuse and help team understanding the scope to later go deeper with Wireshark or specialized software/tools. That is the kind of boring operational detail that matters during real incidents addressing fast answers.&lt;/p&gt;




&lt;h2&gt;
  
  
  What comes next
&lt;/h2&gt;

&lt;p&gt;The direction I want for &lt;a href="https://github.com/skhell/pingtrace" rel="noopener noreferrer"&gt;https://github.com/skhell/pingtrace&lt;/a&gt; is clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;better troubleshooting evidence&lt;/li&gt;
&lt;li&gt;better exports with IEEE oui integration&lt;/li&gt;
&lt;li&gt;cleaner output&lt;/li&gt;
&lt;li&gt;standardization improvements&lt;/li&gt;
&lt;li&gt;no unnecessary privileges great in enterprise environments&lt;/li&gt;
&lt;li&gt;practical workflows for real infrastructure teams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am not trying to build a flashy tool, I am trying to build something I would actually use under pressure.&lt;/p&gt;




&lt;h2&gt;
  
  
  Feedback wanted
&lt;/h2&gt;

&lt;p&gt;If you work in networking, cloud, SRE, infrastructure support or incident response, I would really appreciate feedback.&lt;br&gt;
The most useful feedback is not only "nice project", the most useful feedback is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;this output field is missing&lt;/li&gt;
&lt;li&gt;this flag is confusing&lt;/li&gt;
&lt;li&gt;this workflow does not match reality&lt;/li&gt;
&lt;li&gt;this would help during RCA&lt;/li&gt;
&lt;li&gt;this should stay out of scope&lt;/li&gt;
&lt;li&gt;this would make it easier for a team to adopt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/skhell/pingtrace" rel="noopener noreferrer"&gt;https://github.com/skhell/pingtrace&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If it saves time in one troubleshooting session, it was worth building.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>go</category>
      <category>cli</category>
      <category>opensource</category>
    </item>
    <item>
      <title>OSIRIS JSON Producer for Cisco</title>
      <dc:creator>Tia Zanella</dc:creator>
      <pubDate>Fri, 10 Apr 2026 12:00:00 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/skhell/osiris-json-producer-for-cisco-45jd</link>
      <guid>https://dev.clauneck.workers.dev/skhell/osiris-json-producer-for-cisco-45jd</guid>
      <description>&lt;p&gt;The OSIRIS JSON Cisco producer connects to Cisco infrastructure platforms (APIC, NX-OS, IOS-XE) and generates OSIRIS JSON snapshots of your network topology, devices, interfaces, and connections.&lt;/p&gt;

&lt;p&gt;Install the core dispatcher and the Cisco producer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;go.osirisjson.org/producers/cmd/osirisjson-producer@latest
go &lt;span class="nb"&gt;install &lt;/span&gt;go.osirisjson.org/producers/cmd/osirisjson-producer-cisco@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The core dispatcher lets you run &lt;code&gt;osirisjson-producer cisco ...&lt;/code&gt;. Without it, invoke the vendor binary directly as &lt;code&gt;osirisjson-producer-cisco ...&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Make sure &lt;code&gt;$GOPATH/bin&lt;/code&gt; (or &lt;code&gt;$HOME/go/bin&lt;/code&gt;) is in your &lt;code&gt;PATH&lt;/code&gt;. See the &lt;a href="https://dev.clauneck.workers.dev/en/docs/producers/getting-started#install"&gt;getting started&lt;/a&gt; page for more install options.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supported platforms
&lt;/h2&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    ACI / APIC

    available

  Application Policy Infrastructure Controller

  Transport: REST API




    NX-OS

    available

  Nexus data center switches

  Transport: NX-API CLI




    IOS-XE

    available

  Enterprise routers and switches

  Transport: NETCONF/YANG over SSH
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  CLI usage
&lt;/h2&gt;

&lt;p&gt;The Cisco producer uses a dispatcher-style CLI with sub-producers:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;osirisjson-producer cisco &amp;lt;subcommand&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;flags]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Single mode
&lt;/h3&gt;

&lt;p&gt;Connect to one device and save an OSIRIS JSON document as &lt;code&gt;cisco-&amp;lt;type&amp;gt;-&amp;lt;timestamp&amp;gt;-&amp;lt;hostname&amp;gt;.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ACI fabric snapshot via APIC&lt;/span&gt;
osirisjson-producer cisco apic &lt;span class="nt"&gt;-h&lt;/span&gt; 10.0.0.1 &lt;span class="nt"&gt;-u&lt;/span&gt; admin &lt;span class="nt"&gt;-p&lt;/span&gt; secret

&lt;span class="c"&gt;# NX-OS device snapshot&lt;/span&gt;
osirisjson-producer cisco nxos &lt;span class="nt"&gt;-h&lt;/span&gt; switch01.example.com &lt;span class="nt"&gt;-u&lt;/span&gt; admin &lt;span class="nt"&gt;-p&lt;/span&gt; secret

&lt;span class="c"&gt;# IOS-XE device snapshot&lt;/span&gt;
osirisjson-producer cisco iosxe &lt;span class="nt"&gt;-h&lt;/span&gt; router01.example.com &lt;span class="nt"&gt;-u&lt;/span&gt; admin &lt;span class="nt"&gt;--insecure&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;-p&lt;/code&gt; / &lt;code&gt;--password&lt;/code&gt; is omitted, the CLI prompts interactively.&lt;/p&gt;

&lt;h3&gt;
  
  
  Batch mode
&lt;/h3&gt;

&lt;p&gt;Collect from multiple devices listed in a CSV file. Output is organized as a hierarchical directory structure: &lt;code&gt;DC/Floor/Room/Zone/Hostname.json&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;osirisjson-producer cisco apic &lt;span class="nt"&gt;-s&lt;/span&gt; datacenter.csv &lt;span class="nt"&gt;-o&lt;/span&gt; ./output &lt;span class="nt"&gt;-u&lt;/span&gt; admin &lt;span class="nt"&gt;-p&lt;/span&gt; secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generate a CSV template to get started:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;osirisjson-producer cisco template &lt;span class="nt"&gt;--generate&lt;/span&gt; apic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CSV template uses these columns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Column&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Datacenter name (used for output folder hierarchy)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;floor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Floor identifier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;room&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Room identifier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zone&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Zone or pod identifier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hostname&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Device label used as output filename&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Producer type: &lt;code&gt;apic&lt;/code&gt;, &lt;code&gt;nxos&lt;/code&gt;, &lt;code&gt;iosxe&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ip&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;IP address or FQDN of the target device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;port&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Override port (default: producer-specific)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;owner&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;self&lt;/code&gt; (default), &lt;code&gt;isp&lt;/code&gt;, or &lt;code&gt;colo&lt;/code&gt; - operator metadata only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;notes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Free-text notes (ignored by producer)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Credentials are provided via &lt;code&gt;-u&lt;/code&gt;/&lt;code&gt;-p&lt;/code&gt; flags and apply to all targets in the batch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Flags reference
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Single mode flags
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Flag&lt;/th&gt;
&lt;th&gt;Short&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--host&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-h&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Target host (IP or FQDN, optionally with &lt;code&gt;:port&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--username&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Username for authentication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--password&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Password (omit for interactive prompt)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--port&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-P&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Override port (default: producer-specific)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--detail&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Detail level: &lt;code&gt;minimal&lt;/code&gt; (default) or &lt;code&gt;detailed&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--insecure&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Skip TLS certificate verification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--safe-failure-mode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Secret handling: &lt;code&gt;fail-closed&lt;/code&gt; (default), &lt;code&gt;log-and-redact&lt;/code&gt;, &lt;code&gt;off&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Batch mode flags
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Flag&lt;/th&gt;
&lt;th&gt;Short&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--source&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CSV file with targets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--output&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-o&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Output directory (hierarchical: &lt;code&gt;DC/Floor/Room/Zone/Hostname.json&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--username&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default username for all targets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--password&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default password for all targets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Global flags
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Flag&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--version&lt;/code&gt; / &lt;code&gt;-v&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Display version and exit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--help&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Display help and exit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What each platform collects
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ACI / APIC
&lt;/h3&gt;

&lt;p&gt;The APIC producer queries the following MO classes via the REST API:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minimal mode:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;MO Class&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fabricNode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fabric nodes (controllers, spines, leafs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;topSystem&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;System attributes (uptime, state, fabric MAC, control plane MTU)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;firmwareRunning&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Running firmware versions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fvTenant&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tenant definitions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fvCtx&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;VRF contexts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fvBD&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bridge domains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fvSubnet&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Subnets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fvAEPg&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Application endpoint groups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;l3extOut&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;L3 external connectivity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;faultInst&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Active fault instances&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Detailed mode adds:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;MO Class&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fvCEp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Client endpoints (MAC, VLAN encap, leaf attachment)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  NX-OS
&lt;/h3&gt;

&lt;p&gt;The NX-OS producer sends NX-API CLI commands in batched requests:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minimal mode:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;show version&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Device model, serial number, OS version, uptime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;show inventory&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hardware inventory (modules, power supplies, fans)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;show interface brief&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Interface names, states, speeds, VLANs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;show vlan brief&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;VLAN IDs, names, and member interfaces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;show vrf all detail&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;VRF definitions and member interfaces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;show lldp neighbors detail&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LLDP neighbor discovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;show vpc brief&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;vPC domain, peer status, keepalive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;show port-channel summary&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Port-channel configurations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Detailed mode adds:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;show interface&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full interface stats (MTU, bandwidth, duplex, counters)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;show system resources&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CPU idle %, memory usage, load averages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;show environment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Power supplies, fan status, temperatures&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  IOS-XE
&lt;/h3&gt;

&lt;p&gt;The IOS-XE producer uses NETCONF/YANG RPCs over SSH (default port 830):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minimal mode:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;YANG Model&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cisco-IOS-XE-native&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Device version and hostname&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ietf-interfaces&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Interface details&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cisco-IOS-XE-device-hardware-oper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hardware inventory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cisco-IOS-XE-cdp-oper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CDP neighbor discovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cisco-IOS-XE-native (vrf)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;VRF definitions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Detailed mode adds:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;YANG Model&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cisco-IOS-XE-bgp-oper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BGP neighbor details&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cisco-IOS-XE-ospf-oper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OSPF process and neighbor state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cisco-IOS-XE-process-cpu-oper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CPU utilization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cisco-IOS-XE-memory-oper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Memory statistics&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  OSIRIS JSON output structure
&lt;/h2&gt;

&lt;p&gt;All three producers emit the same OSIRIS JSON envelope:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://osirisjson.org/schema/v1.0/osiris.schema.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"generator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"osirisjson-producer-cisco-&amp;lt;platform&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"scope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"providers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"cisco"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"topology"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"resources"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"connections"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"groups"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Resource types by platform
&lt;/h3&gt;

&lt;p&gt;Resource types follow the OSIRIS JSON v1.0 specification. Standard types are used where defined; vendor-specific types use the &lt;code&gt;osiris.cisco.*&lt;/code&gt; namespace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IOS-XE:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;network.router&lt;/code&gt; - Primary device (standard)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;network.interface&lt;/code&gt; - Physical and logical interfaces (standard)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;osiris.cisco.interface.lag&lt;/code&gt; - Port-channel / LAG interfaces&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;NX-OS:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;osiris.cisco.switch.spine&lt;/code&gt; / &lt;code&gt;osiris.cisco.switch.leaf&lt;/code&gt; - Device (role-classified)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;network.interface&lt;/code&gt; - Physical and logical interfaces (standard)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;osiris.cisco.interface.lag&lt;/code&gt; - Port-channels&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;APIC:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;osiris.cisco.controller&lt;/code&gt; - APIC controllers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;osiris.cisco.switch.spine&lt;/code&gt; / &lt;code&gt;osiris.cisco.switch.leaf&lt;/code&gt; - Fabric switches&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;osiris.cisco.domain.bridge&lt;/code&gt; - Bridge domains&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;network.subnet&lt;/code&gt; - Subnets (standard)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;osiris.cisco.l3out&lt;/code&gt; - L3 external networks&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;osiris.cisco.endpoint&lt;/code&gt; - Client endpoints (detailed mode only)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Connection types
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;IOS-XE / NX-OS:&lt;/strong&gt; &lt;code&gt;physical.ethernet&lt;/code&gt; for CDP/LLDP-discovered links between interfaces&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;APIC:&lt;/strong&gt; &lt;code&gt;contains&lt;/code&gt; for tenant hierarchy containment, &lt;code&gt;network&lt;/code&gt; for bridge domain associations&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Group types by platform
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;IOS-XE:&lt;/strong&gt; &lt;code&gt;logical.vrf&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NX-OS:&lt;/strong&gt; &lt;code&gt;logical.vrf&lt;/code&gt;, &lt;code&gt;network.vlan&lt;/code&gt;, &lt;code&gt;network.vpc&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;APIC:&lt;/strong&gt; &lt;code&gt;logical.tenant&lt;/code&gt;, &lt;code&gt;logical.vrf&lt;/code&gt;, &lt;code&gt;osiris.cisco.epg&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Connection discovery
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;IOS-XE&lt;/strong&gt; discovers neighbors via &lt;strong&gt;CDP&lt;/strong&gt; (Cisco Discovery Protocol)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;NX-OS&lt;/strong&gt; discovers neighbors via &lt;strong&gt;LLDP&lt;/strong&gt; (Link Layer Discovery Protocol)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;APIC&lt;/strong&gt; uses containment hierarchy (tenants -&amp;gt; BDs -&amp;gt; subnets -&amp;gt; EPGs) rather than point-to-point links&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Remote devices discovered via CDP/LLDP are added as stub resources with &lt;code&gt;status: unknown&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  IOS-XE - single device, minimal mode
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;osirisjson-producer cisco iosxe &lt;span class="nt"&gt;-h&lt;/span&gt; 10.99.0.1 &lt;span class="nt"&gt;-u&lt;/span&gt; admin &lt;span class="nt"&gt;-p&lt;/span&gt; secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output (trimmed):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://osirisjson.org/schema/v1.0/osiris.schema.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"generator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"osirisjson-producer-cisco-iosxe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"scope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"providers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"cisco"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"topology"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"resources"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco-iosxe-LAB-RTR01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"network.router"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"LAB-RTR01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ISR4451-X/K9"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"16.9"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"extensions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"osiris.cisco"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"inventory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Chassis"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ISR4451-X/K9"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"serial"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FDO12345678"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco-iosxe-LAB-RTR01-GigabitEthernet0/0/0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"network.interface"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GigabitEthernet0/0/0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"speed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1000000000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WAN uplink"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"connections"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco-iosxe-LAB-RTR01-GigabitEthernet0/0/0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco-iosxe-stub-REMOTE-SW01-GigabitEthernet1/0/1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"physical.ethernet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"groups"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco-iosxe-LAB-RTR01-vrf-CORP"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"logical.vrf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CORP"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"members"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"cisco-iosxe-LAB-RTR01-GigabitEthernet0/0/0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"cisco-iosxe-LAB-RTR01-Loopback0"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  NX-OS - single device, detailed mode
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;osirisjson-producer cisco nxos &lt;span class="nt"&gt;-h&lt;/span&gt; switch01.lab &lt;span class="nt"&gt;-u&lt;/span&gt; admin &lt;span class="nt"&gt;-p&lt;/span&gt; secret &lt;span class="nt"&gt;--detail&lt;/span&gt; detailed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output (trimmed):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://osirisjson.org/schema/v1.0/osiris.schema.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"generator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"osirisjson-producer-cisco-nxos"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"scope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"providers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"cisco"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"topology"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"resources"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco-nxos-LAB-SW01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"osiris.cisco.switch.leaf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"LAB-SW01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Nexus9000 C9508"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10.3(4a)"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"extensions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"osiris.cisco"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"bios_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"08.40"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"kernel_uptime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"15d 3h 22m 10s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"cpu_idle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;85.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"load_avg_1min"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"memory_used"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8192&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"memory_free"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;24576&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"power_supplies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NXA-PAC-1100W"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"watts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"fans"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Fan1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"temperatures"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"sensor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SUP slot 1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"celsius"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;35.5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco-nxos-LAB-SW01-Ethernet1/1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"network.interface"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ethernet1/1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"speed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10000000000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Server-facing"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"connections"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco-nxos-LAB-SW01-Ethernet1/1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco-nxos-stub-REMOTE-SW01-Ethernet1/49"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"physical.ethernet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"groups"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco-nxos-LAB-SW01-vlan-100"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"network.vlan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PROD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"members"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"cisco-nxos-LAB-SW01-Ethernet1/1"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco-nxos-LAB-SW01-vpc-10"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"network.vpc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vPC domain 10"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"extensions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"osiris.cisco"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"primary"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"peer_status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"peer-ok"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"keepalive_status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"peer-alive"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  APIC - ACI fabric snapshot
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;osirisjson-producer cisco apic &lt;span class="nt"&gt;-h&lt;/span&gt; 10.0.0.1 &lt;span class="nt"&gt;-u&lt;/span&gt; admin &lt;span class="nt"&gt;-p&lt;/span&gt; secret &lt;span class="nt"&gt;--detail&lt;/span&gt; detailed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output (trimmed):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://osirisjson.org/schema/v1.0/osiris.schema.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"generator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"osirisjson-producer-cisco-apic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"scope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"providers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"cisco"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"topology"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"resources"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco-apic-apic1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"osiris.cisco.controller"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"apic1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"APIC-SERVER-M3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"6.0(2h)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"site"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pod-1"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco-apic-spine1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"osiris.cisco.switch.spine"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"spine1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"N9K-C9336C-FX2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"n9000-16.0(2h)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"site"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pod-1"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"extensions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"osiris.cisco"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"fabric_mac"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AA:BB:CC:DD:EE:01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"control_plane_mtu"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"faults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"F1527"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"warning"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"storage full"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco-apic-bd-bd_App"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"osiris.cisco.domain.bridge"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bd_App"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco-apic-subnet-10.0.0.1/24"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"network.subnet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10.0.0.1/24"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco-apic-ep-AA:BB:CC:DD:EE:FF"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"osiris.cisco.endpoint"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AA:BB:CC:DD:EE:FF"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"encap"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vlan-100"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"leaf"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"leaf1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"interface"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eth1/1"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"groups"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco-apic-tenant-tn_Example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"logical.tenant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tn_Example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"children"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"cisco-apic-vrf-tn_Example-vrf_Main"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"cisco-apic-epg-tn_Example-epg_WEB"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco-apic-vrf-tn_Example-vrf_Main"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"logical.vrf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vrf_Main"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cisco-apic-epg-tn_Example-epg_WEB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"osiris.cisco.epg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"epg_WEB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"members"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"cisco-apic-ep-AA:BB:CC:DD:EE:FF"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Batch mode - multi-device collection
&lt;/h3&gt;

&lt;p&gt;Create a CSV inventory file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csvs"&gt;&lt;code&gt;&lt;span class="k"&gt;dc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;room&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;zone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;notes&lt;/span&gt;
&lt;span class="k"&gt;AMS&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;F&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;R&lt;/span&gt;&lt;span class="mf"&gt;301&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;POD&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;apic&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;apic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;10.10.1.1&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Primary&lt;/span&gt; &lt;span class="k"&gt;controller&lt;/span&gt;
&lt;span class="k"&gt;AMS&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;F&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;R&lt;/span&gt;&lt;span class="mf"&gt;301&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;POD&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;nx&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;spine&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;nxos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;10.10.1.10&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Spine&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt;
&lt;span class="k"&gt;AMS&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;F&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;R&lt;/span&gt;&lt;span class="mf"&gt;302&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;POD&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;xe&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;router&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;iosxe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;172.16.0.1&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="k"&gt;isp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;PE&lt;/span&gt; &lt;span class="k"&gt;router&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the batch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;osirisjson-producer cisco apic &lt;span class="nt"&gt;-s&lt;/span&gt; inventory.csv &lt;span class="nt"&gt;-o&lt;/span&gt; ./output &lt;span class="nt"&gt;-u&lt;/span&gt; admin &lt;span class="nt"&gt;-p&lt;/span&gt; secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The resulting output directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;output/
  AMS-01/
    F3/
      R301/
        POD-A/
          apic-01.json
          nx-spine-01.json
      R302/
        POD-B/
          xe-router-01.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Source: &lt;a href="https://osirisjson.org/en/docs/producers/network/cisco" rel="noopener noreferrer"&gt;https://osirisjson.org/en/docs/producers/network/cisco&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cisco</category>
      <category>opensource</category>
      <category>solutionarchitects</category>
      <category>topology</category>
    </item>
    <item>
      <title>OSIRIS JSON Producer for Microsoft Azure</title>
      <dc:creator>Tia Zanella</dc:creator>
      <pubDate>Wed, 08 Apr 2026 07:54:58 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/skhell/osiris-json-producer-for-microsoft-azure-3in6</link>
      <guid>https://dev.clauneck.workers.dev/skhell/osiris-json-producer-for-microsoft-azure-3in6</guid>
      <description>&lt;p&gt;The OSIRIS JSON Azure producer connects to Microsoft Azure via the Azure CLI (&lt;code&gt;az&lt;/code&gt;) and generates OSIRIS JSON snapshots of your subscription topology - virtual networks, subnets, NICs, NSGs, load balancers, firewalls, VMs, and more.&lt;/p&gt;

&lt;p&gt;To begin using OSIRIS JSON for Microsoft Azure, install the core dispatcher and the Azure producer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;go.osirisjson.org/producers/cmd/osirisjson-producer@latest
go &lt;span class="nb"&gt;install &lt;/span&gt;go.osirisjson.org/producers/cmd/osirisjson-producer-azure@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The core dispatcher lets you run &lt;code&gt;osirisjson-producer azure ...&lt;/code&gt;. Without it, invoke the vendor binary directly as &lt;code&gt;osirisjson-producer-azure ...&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Make sure &lt;code&gt;$GOPATH/bin&lt;/code&gt; (or &lt;code&gt;$HOME/go/bin&lt;/code&gt;) is in your &lt;code&gt;PATH&lt;/code&gt;. See the &lt;a href="https://dev.clauneck.workers.dev/en/docs/producers/getting-started#install"&gt;getting started&lt;/a&gt; page for more install options.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Install the &lt;a href="https://learn.microsoft.com/en-us/cli/azure/install-azure-cli" rel="noopener noreferrer"&gt;Azure CLI&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Authenticate: &lt;code&gt;az login&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The authenticate user must have a &lt;strong&gt;read permission&lt;/strong&gt; to one or multiple target subscriptions, you can execute the producer on your local machine or decide to invoke the producer using a scheduled job using a service account with your favourite software or platform.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  CLI usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;osirisjson-producer azure &lt;span class="o"&gt;[&lt;/span&gt;flags]
osirisjson-producer azure template &lt;span class="nt"&gt;--generate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Single mode
&lt;/h3&gt;

&lt;p&gt;Start by collecting one subscription that will be automatically saved as &lt;code&gt;microsoft-azure-&amp;lt;timestamp&amp;gt;-&amp;lt;name&amp;gt;.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;osirisjson-producer azure &lt;span class="nt"&gt;-S&lt;/span&gt; a1b2c3d4-e5f6-7890-abcd-ef1234567890
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Interactive mode
&lt;/h3&gt;

&lt;p&gt;Run without flags to get an interactive subscription picker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;osirisjson-producer azure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The producer discovers all accessible subscriptions and presents a numbered list. Select one or more (comma-separated) or type &lt;code&gt;all&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-subscription mode
&lt;/h3&gt;

&lt;p&gt;Collect multiple subscriptions to an output directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Specific subscriptions&lt;/span&gt;
osirisjson-producer azure &lt;span class="nt"&gt;-S&lt;/span&gt; sub-id-1,sub-id-2,sub-id-3 &lt;span class="nt"&gt;-o&lt;/span&gt; ./output

&lt;span class="c"&gt;# All accessible subscriptions (auto-discover)&lt;/span&gt;
osirisjson-producer azure &lt;span class="nt"&gt;--all&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; ./output

&lt;span class="c"&gt;# All subscriptions in a specific tenant&lt;/span&gt;
osirisjson-producer azure &lt;span class="nt"&gt;--all&lt;/span&gt; &lt;span class="nt"&gt;--tenant&lt;/span&gt; f1e2d3c4-b5a6-9078-fedc-ba9876543210 &lt;span class="nt"&gt;-o&lt;/span&gt; ./output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Batch mode (CSV)
&lt;/h3&gt;

&lt;p&gt;Generate a CSV template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;osirisjson-producer azure template &lt;span class="nt"&gt;--generate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Collect from a CSV file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;osirisjson-producer azure &lt;span class="nt"&gt;-s&lt;/span&gt; subscriptions.csv &lt;span class="nt"&gt;-o&lt;/span&gt; ./output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CSV template uses these columns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Column&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;subscription_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Azure subscription UUID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;subscription_name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Human-readable label (used as output filename)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tenant_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Azure AD / Entra ID tenant UUID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;environment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Deployment stage: &lt;code&gt;dv&lt;/code&gt;, &lt;code&gt;np&lt;/code&gt;, &lt;code&gt;pr&lt;/code&gt; (development, non-production, production)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;region&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Filter to Azure region (empty = all regions)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;notes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Free-text notes (ignored by producer)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Output hierarchy
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Single mode:&lt;/strong&gt; saves to &lt;code&gt;microsoft-azure-&amp;lt;timestamp&amp;gt;-&amp;lt;name&amp;gt;.json&lt;/code&gt; in the current directory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi/batch/all modes:&lt;/strong&gt; organized by tenant and timestamp:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;output/
  &amp;lt;TenantID&amp;gt;/
    &amp;lt;timestamp&amp;gt;/
      &amp;lt;SubscriptionName&amp;gt;.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each subscription produces a self-contained OSIRIS document. Cross-subscription references (e.g. VNet peerings to remote subscriptions) use deterministic resource IDs that consumers can correlate across documents.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-tenant environments
&lt;/h3&gt;

&lt;p&gt;Run the producer once per tenant. Each &lt;code&gt;az login&lt;/code&gt; authenticates to one tenant. Use &lt;code&gt;az login --tenant &amp;lt;tenant-id&amp;gt;&lt;/code&gt; to switch. The output hierarchy groups documents by tenant automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Flags reference
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Flag&lt;/th&gt;
&lt;th&gt;Short&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--subscription&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-S&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Azure subscription ID(s), comma-separated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Auto-discover all accessible subscriptions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--source&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CSV file with subscription targets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--output&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-o&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Output directory (required for multi/all/CSV mode)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--tenant&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Azure AD / Entra ID tenant ID (optional)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--region&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Filter to a specific Azure region (optional)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--detail&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Detail level: &lt;code&gt;minimal&lt;/code&gt; (default) or &lt;code&gt;detailed&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--safe-failure-mode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Secret handling: &lt;code&gt;fail-closed&lt;/code&gt; (default), &lt;code&gt;log-and-redact&lt;/code&gt;, &lt;code&gt;off&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--version&lt;/code&gt; / &lt;code&gt;-v&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Display version and exit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--help&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Display help and exit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What it collects
&lt;/h2&gt;

&lt;p&gt;The Azure producer queries the following resource types via the Azure CLI:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minimal mode:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Azure Resource Type&lt;/th&gt;
&lt;th&gt;OSIRIS Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Virtual Networks&lt;/td&gt;
&lt;td&gt;&lt;code&gt;network.vpc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;VNets with address space, DNS, peerings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subnets&lt;/td&gt;
&lt;td&gt;&lt;code&gt;network.subnet&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Subnets with address prefixes, service endpoints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network Interfaces&lt;/td&gt;
&lt;td&gt;&lt;code&gt;network.interface&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;NICs with IP configurations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network Security Groups&lt;/td&gt;
&lt;td&gt;&lt;code&gt;network.security.group&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;NSGs with rule summaries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Route Tables&lt;/td&gt;
&lt;td&gt;&lt;code&gt;osiris.azure.routetable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;UDRs with route counts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public IP Addresses&lt;/td&gt;
&lt;td&gt;&lt;code&gt;osiris.azure.publicip&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Public IPs with allocation method&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Load Balancers&lt;/td&gt;
&lt;td&gt;&lt;code&gt;network.loadbalancer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;L4 load balancers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application Gateways&lt;/td&gt;
&lt;td&gt;&lt;code&gt;network.loadbalancer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;L7 load balancers (app gateways)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Private Endpoints&lt;/td&gt;
&lt;td&gt;&lt;code&gt;osiris.azure.privateendpoint&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Private link endpoints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VNet Gateways&lt;/td&gt;
&lt;td&gt;&lt;code&gt;osiris.azure.gateway.vnet&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ExpressRoute / VPN gateways&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NAT Gateways&lt;/td&gt;
&lt;td&gt;&lt;code&gt;osiris.azure.gateway.nat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Outbound NAT gateways&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure Firewalls&lt;/td&gt;
&lt;td&gt;&lt;code&gt;network.firewall&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Azure Firewall instances&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNS Zones&lt;/td&gt;
&lt;td&gt;&lt;code&gt;osiris.azure.dns.zone&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Public DNS zones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Private DNS Zones&lt;/td&gt;
&lt;td&gt;&lt;code&gt;osiris.azure.dns.privatezone&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Private DNS zones with VNet links&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ExpressRoute Circuits&lt;/td&gt;
&lt;td&gt;&lt;code&gt;osiris.azure.expressroute&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ExpressRoute circuits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Virtual Machines&lt;/td&gt;
&lt;td&gt;&lt;code&gt;compute.vm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;VMs with size, power state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource Groups&lt;/td&gt;
&lt;td&gt;&lt;code&gt;container.resourcegroup&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Resource groups as container resources&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Detailed mode&lt;/strong&gt; adds route table route details, load balancer rules, and extended properties.&lt;/p&gt;

&lt;h2&gt;
  
  
  OSIRIS JSON output structure for Microsoft Azure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://osirisjson.org/schema/v1.0/osiris.schema.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"generator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"osirisjson-producer-azure"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"scope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"providers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"azure"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"accounts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;tenant-id&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"subscriptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;subscription-id&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"regions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"westeurope"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eastus"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"topology"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"resources"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"connections"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"groups"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Resource types
&lt;/h3&gt;

&lt;p&gt;Resource types follow the &lt;a href="https://dev.clauneck.workers.dev/en/docs/spec/v10/07-resourcetypetaxonomy"&gt;OSIRIS JSON v1.0 specification&lt;/a&gt;. Standard types are used where defined; Azure-specific types use the &lt;code&gt;osiris.azure.*&lt;/code&gt; namespace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Standard types:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;container.resourcegroup&lt;/code&gt; - Resource groups&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;network.vpc&lt;/code&gt; - Virtual networks&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;network.subnet&lt;/code&gt; - Subnets&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;network.interface&lt;/code&gt; - Network interfaces&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;network.security.group&lt;/code&gt; - Network security groups&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;network.loadbalancer&lt;/code&gt; - Load balancers (L4 and L7)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;network.firewall&lt;/code&gt; - Azure Firewalls&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;compute.vm&lt;/code&gt; - Virtual machines&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Custom types (&lt;code&gt;osiris.azure.*&lt;/code&gt;):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;osiris.azure.routetable&lt;/code&gt; - Route tables&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;osiris.azure.publicip&lt;/code&gt; - Public IP addresses&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;osiris.azure.privateendpoint&lt;/code&gt; - Private endpoints&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;osiris.azure.gateway.vnet&lt;/code&gt; - VNet gateways (VPN/ExpressRoute)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;osiris.azure.gateway.nat&lt;/code&gt; - NAT gateways&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;osiris.azure.dns.zone&lt;/code&gt; - DNS zones&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;osiris.azure.dns.privatezone&lt;/code&gt; - Private DNS zones&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;osiris.azure.expressroute&lt;/code&gt; - ExpressRoute circuits&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Connection types
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;network&lt;/code&gt; - Network connectivity (VNet peerings, NIC-to-subnet, NSG associations, DNS links, gateway connections)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;contains&lt;/code&gt; - Containment (subnet-to-VNet membership)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Group types
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;logical.subscription&lt;/code&gt; - Top-level subscription group&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;logical.resourcegroup&lt;/code&gt; - Resource group groups (children of subscription)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Provider metadata
&lt;/h3&gt;

&lt;p&gt;Every resource includes &lt;code&gt;provider.type&lt;/code&gt; with the native ARM resource type (e.g. &lt;code&gt;Microsoft.Network/virtualNetworks&lt;/code&gt;, &lt;code&gt;Microsoft.Compute/virtualMachines&lt;/code&gt;). Cross-subscription peering stubs include &lt;code&gt;provider.subscription&lt;/code&gt; with the remote subscription ID.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resource IDs
&lt;/h3&gt;

&lt;p&gt;Azure resource IDs follow the pattern &lt;code&gt;azure::&amp;lt;ARM-resource-id&amp;gt;&lt;/code&gt;, using the full ARM resource ID as the native identifier. This ensures globally unique, deterministic IDs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Single subscription
&lt;/h3&gt;

&lt;p&gt;We are going to explore a single subscription in our tenant and generate from Microsoft Azure an OSIRIS JSON document.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;osirisjson-producer azure &lt;span class="nt"&gt;-S&lt;/span&gt; a1b2c3d4-e5f6-7890-abcd-ef1234567890
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OSIRIS JSON output document (trimmed):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://osirisjson.org/schema/v1.0/osiris.schema.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"generator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"osirisjson-producer-azure"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"scope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"providers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"azure"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"accounts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"f1e2d3c4-b5a6-9078-fedc-ba9876543210"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"subscriptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"a1b2c3d4-e5f6-7890-abcd-ef1234567890"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"regions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"westeurope"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"topology"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"resources"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"azure::/subscriptions/a1b2c3d4/resourceGroups/network-rg/providers/Microsoft.Network/virtualNetworks/hub-vnet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"network.vpc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hub-vnet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"azure"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"native_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/subscriptions/a1b2c3d4/resourceGroups/network-rg/providers/Microsoft.Network/virtualNetworks/hub-vnet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Microsoft.Network/virtualNetworks"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"westeurope"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"subscription"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"a1b2c3d4-e5f6-7890-abcd-ef1234567890"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"tenant"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"f1e2d3c4-b5a6-9078-fedc-ba9876543210"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"resource_group"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"network-rg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"address_space"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.0.0.0/16"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"dns_servers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.0.0.4"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"azure::/subscriptions/a1b2c3d4/resourceGroups/compute-rg/providers/Microsoft.Compute/virtualMachines/web-vm-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"compute.vm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"web-vm-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"azure"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"native_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/subscriptions/a1b2c3d4/resourceGroups/compute-rg/providers/Microsoft.Compute/virtualMachines/web-vm-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Microsoft.Compute/virtualMachines"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"westeurope"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"subscription"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"a1b2c3d4-e5f6-7890-abcd-ef1234567890"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"tenant"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"f1e2d3c4-b5a6-9078-fedc-ba9876543210"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"resource_group"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"compute-rg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"vm_size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Standard_D2s_v3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"power_state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"VM running"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"connections"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"azure::/subscriptions/a1b2c3d4/.../subnets/default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"azure::/subscriptions/a1b2c3d4/.../virtualNetworks/hub-vnet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"contains"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"direction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"forward"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"groups"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"azure::subscription::a1b2c3d4-e5f6-7890-abcd-ef1234567890"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"logical.subscription"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-nonprod-subscription"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"children"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"azure::resourcegroup::network-rg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"azure::resourcegroup::compute-rg"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"azure::resourcegroup::network-rg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"logical.resourcegroup"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"network-rg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"members"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"azure::/subscriptions/a1b2c3d4/.../virtualNetworks/hub-vnet"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Source: &lt;a href="https://osirisjson.org/en/docs/producers/hyperscalers/microsoft-azure" rel="noopener noreferrer"&gt;https://osirisjson.org/en/docs/producers/hyperscalers/microsoft-azure&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>solutionarchitect</category>
      <category>opensource</category>
      <category>tooling</category>
    </item>
    <item>
      <title>OSIRIS JSON a new journey beyond silos and tribal knowledge</title>
      <dc:creator>Tia Zanella</dc:creator>
      <pubDate>Mon, 06 Apr 2026 15:23:44 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/skhell/osiris-json-a-new-journey-beyond-silos-and-tribal-knowledge-2p2m</link>
      <guid>https://dev.clauneck.workers.dev/skhell/osiris-json-a-new-journey-beyond-silos-and-tribal-knowledge-2p2m</guid>
      <description>&lt;h2&gt;
  
  
  Beyond the silos: The soul behind OSIRIS JSON
&lt;/h2&gt;

&lt;p&gt;For twenty years, my mission has been to bridge the gap between siloed tribal knowledge and operational clarity. I’ve evolved from the manual era of painstakingly mapping fragmented topologies to building a solution that delivers a comprehensive, end-to-end snapshot of the infrastructure landscape. My goal building OSIRIS JSON is simple: &lt;em&gt;to provide the big-picture visibility that empowers IT and OT professionals to make the right decisions with confidence&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In the world of infrastructure, we often settle for fragments. We see a server here, a cloud instance there, a facility sensor somewhere else. But my goal, no matter with who and for who I have been working for, has always been to achieve an end-to-end view of the entire infrastructure, seeing how every piece breathes together in one interconnected map, this for a very simple reason to achieve multiple goals:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;eradicate silos, feudal thinking and critical context living in people heads embracing &lt;strong&gt;open standard Documentation as Code (Docs as Code)&lt;/strong&gt; culture&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;providing an easy way for architects and IT/OT professionals to understand end-to-end the infrastructure in a fast &lt;strong&gt;up-to-date&lt;/strong&gt; state in time&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;allowing fast troubleshooting maintaining &lt;strong&gt;a clear up-to-date&lt;/strong&gt; infrastructure documentation and topology&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;allowing fast snapshot in time end-to-end of the infrastructure without complications or third-party scanning softwares making OSIRIS JSON a great allies under audit sessions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;provide an accurate standardized baseline for LLMs allowing to understand the infrastructure landscape providing enhanced reasoning and automation&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The human side of the infrastructure struggle
&lt;/h2&gt;

&lt;p&gt;In December 2025 with a big ambition and a bit of crazyness I began writing the &lt;a href="https://osirisjson.org/en/docs/spec/v10/00-preface" rel="noopener noreferrer"&gt;OSIRIS JSON Specification&lt;/a&gt;. It is the result of the experience gained by travelling, exploring, entertaining conversations to Senior Managers, IT/OT professionals, but also by getting closer and work with factory workers and their managers with whom I had a great opportunity to learn about different contexts that enriched me personally and helped shape the original idea by having the opportunity to see and understand that also this type of organization and visibility was lacking not just in the Information Technology area but also in the OT side under facility systems or in cross-scenarios and even in designing, maintaining, and sometimes failing within heterogeneous stacksfrom hyperscale public clouds to the complex, gritty intersections of IT and Facility OT.&lt;/p&gt;

&lt;p&gt;Throughout this journey, I’ve encountered a recurring, deeply human problem: The impassable mountain of tribal knowledge. Some phrases everyone of us have been listening: &lt;strong&gt;Oh don’t touch that please we are aware it’s outdated but Karl made it and he left the company! Documentation is not important let’s focus on business needs&lt;/strong&gt; or the false believe everything is fine &lt;strong&gt;All services are perfectly configured in Microsoft Azure nothing to be worried about.&lt;/strong&gt; or you are called in an ARM or SBB approval meeting and somebody draw some lines in Microsoft Paint to represent the topology seeking for immediate approval because the stakeholders are in rush! Some weeks after when you are called to analyze with operations a major outage you discovered someone have misconfigured thing in the system architecture and you don’t know where to start troubleshoot because there is not accurate documentation or topology. &lt;strong&gt;All of us had or have a Karl in the organization.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We struggle against corporate silos that make a unified view feel nearly impossible!&lt;br&gt;
We build bespoke, fragile integrations that break the moment a vendor changes their mind, and we know specially in IT this happen on a regular basis.&lt;/p&gt;

&lt;p&gt;Even in scenarios where I produced rigorous documentation, the presence of team silos often meant that the “truth” of the infrastructure remained hidden or fragmented. &lt;strong&gt;I realized that if we can’t see our world, we can’t truly care for it making the right decisions with confidence.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I firmly believe that the clarity of systems infrastructure MUST NOT depend on who you are, who you know or which department you sit in. It is and MUST be &lt;strong&gt;a shared truth&lt;/strong&gt; that belongs to everyone. - &lt;a href="https://osirisjson.org/en/docs/introduction/maintainers" rel="noopener noreferrer"&gt;Tia Zanella - Founder and Lead Maintainer of OSIRIS JSON&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is OSIRIS JSON?
&lt;/h2&gt;

&lt;p&gt;OSIRIS JSON is a vendor-neutral JSON interchange schema designed to be a universal language for infrastructure topology designed to include IT and OT environments.&lt;/p&gt;

&lt;p&gt;Rather than wasting time and money developing every software integrations from scratch to learn a hundred different vendor-specific dialects, OSIRIS JSON separates the responsibilities:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The OSIRIS JSON producers&lt;/strong&gt; translate the messy, fragmented data of the real world into a clean OSIRIS JSON document.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The OSIRIS JSON consumers&lt;/strong&gt; read that document to provide a clear, point-in-time view of what exists and how it all relates. With the OSIRIS JSON document the consumers can produce topologies, diff, high quality automated documents and more.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  A humble first step
&lt;/h2&gt;

&lt;p&gt;In this first release, OSIRIS JSON is intentionally a static snapshot format. &lt;strong&gt;It is a “digital polaroid” of your infrastructure a moment in time. You can run directly from your notebook or in complex scenario demand it to an automation to produce scheduled results.&lt;/strong&gt; It doesn’t try to do everything at once, but it provides something essential: a consistent foundation. By defining how resources and their relationships are documented regardless of team boundaries or vendor lock-in. In an open community culture we take the first step toward that end-to-end dream.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;OSIRIS JSON is more than code; it is a perseverance commitment to transparency, high quality documentation and the firmly belief that even the most complex systems can be understood if we wear the right glasses. - &lt;a href="https://osirisjson.org/en/docs/introduction/maintainers" rel="noopener noreferrer"&gt;Tia Zanella - Founder and Lead Maintainer of OSIRIS JSON&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Visit: &lt;a href="https://osirisjson.org/" rel="noopener noreferrer"&gt;https://osirisjson.org/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>devops</category>
      <category>architecture</category>
      <category>infrastructure</category>
    </item>
    <item>
      <title>Azure Boards CLI</title>
      <dc:creator>Tia Zanella</dc:creator>
      <pubDate>Sat, 14 Mar 2026 09:21:35 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/skhell/azure-boards-cli-4pc</link>
      <guid>https://dev.clauneck.workers.dev/skhell/azure-boards-cli-4pc</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhr2zvpodbqkjmnip7mgy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhr2zvpodbqkjmnip7mgy.gif" alt=" " width="350" height="263"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i adoboards
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you feel like Homer Simpson backing into bushes right before sprint review, you are in the right place.&lt;/p&gt;

&lt;p&gt;We've all been there. You're very busy into actual work and then someone reminds you that your user stories need descriptions, acceptance criteria, t-shirt sizes, and business value fields filled in before tomorrow's ceremony. The first time I heard "ceremony" I genuinely thought it was some kind of cult initiation.&lt;/p&gt;

&lt;p&gt;Don't get me wrong Scrum and the job of Scam Masters are genuinely good when used properly. But let's be honest: most of us have seen it applied in ways that create more overhead than value, especially for architecture and infrastructure work where the real complexity lives in the system design, not in a Jira ticket template.&lt;/p&gt;

&lt;p&gt;After nearly 20 years in the industry, I noticed something: the time spent writing and grooming work items is often disproportionate to the value they deliver. So inspired by git cli commands I built a tool to fix that.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/adoboards" rel="noopener noreferrer"&gt;adoboards&lt;/a&gt; is a CLI that pulls your Epics, Features, and User Stories from Azure DevOps Boards, organizes them locally as markdown files, and optionally lets AI handle the tedious writing for you.&lt;/p&gt;

&lt;p&gt;If it saves you from one more sprint planning nightmare, it was worth building. &lt;a href="https://github.com/skhell/adoboards" rel="noopener noreferrer"&gt;Star the project on GitHub&lt;/a&gt; and feel free to leave a feedback.&lt;/p&gt;

</description>
      <category>scrum</category>
      <category>azuredevops</category>
      <category>azureboards</category>
      <category>ai</category>
    </item>
    <item>
      <title>pingtrace</title>
      <dc:creator>Tia Zanella</dc:creator>
      <pubDate>Sat, 14 Mar 2026 09:16:56 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/skhell/pingtrace-2nia</link>
      <guid>https://dev.clauneck.workers.dev/skhell/pingtrace-2nia</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i pingtrace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.npmjs.com/package/pingtrace" rel="noopener noreferrer"&gt;pingtrace&lt;/a&gt; is a terminal-first CLI designed for rapid network troubleshooting, combining ping and traceroute with a clear, intuitive output enriched by DNS and &lt;a href="https://ipinfo.io/" rel="noopener noreferrer"&gt;ipinfo.io&lt;/a&gt; data.&lt;/p&gt;

&lt;p&gt;It runs ping and traceroute in a single command against:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Single target: Quick check for a single host.&lt;/li&gt;
&lt;li&gt;Multi-target: Separate multiple targets with commas for simultaneous checks.&lt;/li&gt;
&lt;li&gt;Bulk loading: Import target lists directly from CSV files.&lt;/li&gt;
&lt;li&gt;CIDR blocks: Automatically check against IPv4 CIDR blocks.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The focus is simple: fast input, clear output, and optional CSV export.&lt;/p&gt;

&lt;p&gt;If it saves you time from a troubleshooting session, it was worth building. &lt;a href="https://github.com/skhell/pingtrace" rel="noopener noreferrer"&gt;Star the project on GitHub&lt;/a&gt; and feel free to leave feedbacks &lt;/p&gt;

</description>
      <category>cli</category>
      <category>npm</category>
      <category>networking</category>
    </item>
    <item>
      <title>OSIRIS a vendor-neutral JSON format for infrastructure snapshots (IT/OT)</title>
      <dc:creator>Tia Zanella</dc:creator>
      <pubDate>Fri, 06 Feb 2026 08:02:51 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/skhell/osiris-a-vendor-neutral-json-format-for-infrastructure-snapshots-itot-42e9</link>
      <guid>https://dev.clauneck.workers.dev/skhell/osiris-a-vendor-neutral-json-format-for-infrastructure-snapshots-itot-42e9</guid>
      <description>&lt;p&gt;After years of dealing with incompatible infra exports I created and published &lt;strong&gt;OSIRIS v1.0.0&lt;/strong&gt; a vendor-neutral JSON interchange format for &lt;strong&gt;point-in-time infrastructure snapshots and documentation&lt;/strong&gt;: highlighting resources and their relationships (topology diagram), with an extension mechanism that can cover &lt;strong&gt;OT&lt;/strong&gt; environments as well.&lt;/p&gt;

&lt;p&gt;Project: &lt;a href="https://osirisjson.org/" rel="noopener noreferrer"&gt;https://osirisjson.org/&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Schema: &lt;a href="https://osirisjson.org/schema/v1.0/osiris.schema.json" rel="noopener noreferrer"&gt;https://osirisjson.org/schema/v1.0/osiris.schema.json&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Examples: &lt;a href="https://osirisjson.org/docs/en/osiris-examples/01-it-infrastructure" rel="noopener noreferrer"&gt;https://osirisjson.org/docs/en/osiris-examples/01-it-infrastructure&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The recurring problem
&lt;/h2&gt;

&lt;p&gt;If you’ve ever tried to build tooling around infrastructure data (diagramming, inventory, audit, drift/diff, documentation), you’ve likely seen the same issue:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every vendor exports data differently (even when it’s JSON).&lt;/li&gt;
&lt;li&gt;Every tool ends up writing its own parsers and mappings, most of them if not all are closed source.&lt;/li&gt;
&lt;li&gt;Relationships (what is connected to what, where it lives, how it depends) are the first thing that becomes inconsistent or implicit.&lt;/li&gt;
&lt;li&gt;Over time, you either rebuild integrations repeatedly, or you rely on undocumented tribal knowledge that lives in people heads and most of time not so well organized so you receive vague answers to your infinite questions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is fragmented, tool-specific pipelines that are expensive to maintain and cause you lot of pain to have a single point of view of the infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What OSIRIS is
&lt;/h2&gt;

&lt;p&gt;OSIRIS is a vendor-neutral JSON format for describing infrastructure resources and their topological relationships across heterogeneous IT and OT environments. OSIRIS generate a &lt;strong&gt;static snapshot interchange format&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A snapshot describes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;what exists&lt;/strong&gt; (resources)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;how it relates&lt;/strong&gt; (connections / relationships)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;at a specific time&lt;/strong&gt; (point-in-time)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is designed to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;vendor-neutral&lt;/strong&gt; (the schema is the contract)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tool-friendly&lt;/strong&gt; (consumers don’t need vendor-specific parsers)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;extensible&lt;/strong&gt; (namespaced extensions for vendor or domain-specific fields, including OT)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What OSIRIS is not (in v1.0.0)
&lt;/h2&gt;

&lt;p&gt;OSIRIS is &lt;strong&gt;not&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;infrastructure-as-Code&lt;/li&gt;
&lt;li&gt;configuration management&lt;/li&gt;
&lt;li&gt;telemetry/metrics/streaming events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s a format you can export, validate, store, diff and consume.&lt;/p&gt;

&lt;h2&gt;
  
  
  Producer/Consumer split (the key idea)
&lt;/h2&gt;

&lt;p&gt;Instead of every tool implementing every vendor format, OSIRIS separates responsibilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Producers&lt;/strong&gt; translate source data into OSIRIS documents
(hyperscalers or public cloud providers inventory APIs, network device outputs, OT gateways, CMDB exports, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consumers&lt;/strong&gt; read OSIRIS documents
(diagram generators, inventory platforms, auditors, diff tools, documentation systems)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps vendor-specific logic in one place and allows multiple tools to share the same snapshot format.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s included today
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Specification &amp;amp; documentation:&lt;/strong&gt; &lt;a href="https://osirisjson.org/" rel="noopener noreferrer"&gt;https://osirisjson.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canonical core JSON Schema (v1.0):&lt;/strong&gt; &lt;a href="https://osirisjson.org/schema/v1.0/osiris.schema.json" rel="noopener noreferrer"&gt;https://osirisjson.org/schema/v1.0/osiris.schema.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Examples:&lt;/strong&gt; &lt;a href="https://osirisjson.org/docs/en/osiris-examples/01-it-infrastructure" rel="noopener noreferrer"&gt;https://osirisjson.org/docs/en/osiris-examples/01-it-infrastructure&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A validation approach that starts with schema-level validation, leaving room for richer semantic validation later.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I’d love feedback on
&lt;/h2&gt;

&lt;p&gt;If you work with infra data, I’d appreciate critiques on:&lt;/p&gt;

&lt;p&gt;1) &lt;strong&gt;Core model:&lt;/strong&gt; Are “resources + relationships” sufficient and ergonomic for real topologies?&lt;br&gt;&lt;br&gt;
2) &lt;strong&gt;Extensibility:&lt;/strong&gt; Is the extension/namespacing approach practical and future-proof?&lt;br&gt;&lt;br&gt;
3) &lt;strong&gt;Adoption path:&lt;/strong&gt; Which first producer would be most useful to you (cloud inventory, device CLI, Terraform state, etc.)?&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s next
&lt;/h2&gt;

&lt;p&gt;I’m working on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;development guidelines for contributors&lt;/li&gt;
&lt;li&gt;initial core/SDK work to make producers and consumers easier to build&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to review the spec/schema or suggest a first producer target, comments are welcome.&lt;/p&gt;

&lt;p&gt;OSIRIS: &lt;a href="https://osirisjson.org/" rel="noopener noreferrer"&gt;https://osirisjson.org/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>json</category>
      <category>infrastructure</category>
      <category>documentation</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Net Commander: A Free Visual Studio Code Toolkit for Network Engineers</title>
      <dc:creator>Tia Zanella</dc:creator>
      <pubDate>Mon, 26 May 2025 17:17:09 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/skhell/net-commander-a-free-visual-studio-code-toolkit-for-network-engineers-2hoe</link>
      <guid>https://dev.clauneck.workers.dev/skhell/net-commander-a-free-visual-studio-code-toolkit-for-network-engineers-2hoe</guid>
      <description>&lt;p&gt;Hey network engineers and infrastructure enthusiasts! 👋&lt;/p&gt;

&lt;p&gt;I’m excited to introduce Net Commander, an open-source project designed to simplify and supercharge your network troubleshooting and automation workflows—right from Visual Studio Code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=elelabdev.net-commander" rel="noopener noreferrer"&gt;Visual Studio Code Marketplace&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Net Commander?
&lt;/h2&gt;

&lt;p&gt;Net Commander is a lightweight, modular Visual Studio Code extension that brings practical, day-to-day network tools right into your development and troubleshooting environment.&lt;/p&gt;

&lt;p&gt;It’s built by a network engineer for network engineers and focuses on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Guided Rootcause Analysis&lt;/li&gt;
&lt;li&gt;WiFi analyzer (and more coming soon!)&lt;/li&gt;
&lt;li&gt;CIDR calculations for quick subnetting&lt;/li&gt;
&lt;li&gt;Ping utility with live response tracking&lt;/li&gt;
&lt;li&gt;Traceroute topology visualization&lt;/li&gt;
&lt;li&gt;PeeringDB integration for ASN and IX lookups&lt;/li&gt;
&lt;li&gt;IANA port reference for fast port checks&lt;/li&gt;
&lt;li&gt;RFC search with instant summaries&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why use Net Commander?
&lt;/h2&gt;

&lt;p&gt;No more context-switching! Use network tools directly in your code editor&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Export reports as CSV for compliance and documentation&lt;/li&gt;
&lt;li&gt;Modular architecture for easy contributions and extensions&lt;/li&gt;
&lt;li&gt;Open-source, MIT licensed—free to use and adapt for your needs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Get Started
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Install the extension from &lt;a href="https://marketplace.visualstudio.com/items?itemName=elelabdev.net-commander" rel="noopener noreferrer"&gt;Visual Studio Code Marketplace&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Share feedback, ideas, or feature requests on GitHub Issues&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Let’s Build It Together
&lt;/h2&gt;

&lt;p&gt;Net Commander is evolving, and I’d love your input! 🚀 Whether you’re a network pro, a student, or someone curious about automation and troubleshooting, your contributions and feedback can make a difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Join the Community
&lt;/h2&gt;

&lt;p&gt;If you find Net Commander useful, please consider &lt;a href="https://github.com/elelabdev/net-commander" rel="noopener noreferrer"&gt;starring the repo&lt;/a&gt; ⭐, sharing it with your team, or even contributing a feature or two. Let’s make networking easier, one module at a time!&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>typescript</category>
      <category>devops</category>
      <category>networking</category>
    </item>
    <item>
      <title>Enhance Your TCP Troubleshooting: Free Wireshark Profile for Network Engineers</title>
      <dc:creator>Tia Zanella</dc:creator>
      <pubDate>Mon, 26 May 2025 17:06:04 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/skhell/enhance-your-tcp-troubleshooting-free-wireshark-profile-for-network-engineers-3fla</link>
      <guid>https://dev.clauneck.workers.dev/skhell/enhance-your-tcp-troubleshooting-free-wireshark-profile-for-network-engineers-3fla</guid>
      <description>&lt;p&gt;Hello, network engineers and packet enthusiasts! 🚀&lt;/p&gt;

&lt;p&gt;I’m excited to share a Wireshark profile I’ve created to make TCP traffic analysis faster, clearer, and more intuitive. If you’ve ever spent hours digging through packet captures looking for TCP issues, you know how vital it is to have the right filters and visual cues at your fingertips.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is this Wireshark profile?
&lt;/h2&gt;

&lt;p&gt;This profile is tailored for network engineers working with TCP. It includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom display filters for key TCP flows (SYN, ACK, RST, retransmissions, etc.)&lt;/li&gt;
&lt;li&gt;Coloring rules that visually highlight packet states and anomalies&lt;/li&gt;
&lt;li&gt;A streamlined interface that saves time when troubleshooting slow connections, resets, or retransmission storms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can preview the profile here:&lt;br&gt;
&lt;a href="https://github.com/elelabdev/wireshark-profile" rel="noopener noreferrer"&gt;https://github.com/elelabdev/wireshark-profile&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use it?
&lt;/h2&gt;

&lt;p&gt;This profile helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quickly isolate TCP session behaviors&lt;/li&gt;
&lt;li&gt;Visually differentiate normal vs. abnormal packet patterns&lt;/li&gt;
&lt;li&gt;Speed up troubleshooting for latency, drops, or packet loss&lt;/li&gt;
&lt;li&gt;Learn and teach TCP concepts through visual cues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s a small tweak with a big impact when you’re working on complex network issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to get started
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Clone or download the profile from the GitHub repo&lt;/li&gt;
&lt;li&gt;Import it into your Wireshark instance&lt;/li&gt;
&lt;li&gt;Start capturing and see the difference in your packet analysis workflow!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Future plans
&lt;/h2&gt;

&lt;p&gt;I’m always open to feedback. Have ideas for additional filters or color rules? Let’s collaborate!&lt;/p&gt;

&lt;p&gt;Feel free to comment below, share your use cases, or contribute on GitHub. Let’s make TCP analysis smoother for everyone. 🚀&lt;/p&gt;

</description>
      <category>wireshark</category>
      <category>opensource</category>
      <category>networking</category>
      <category>network</category>
    </item>
  </channel>
</rss>
