[{"categories":["Agents","Model Context Protocol","Static Sites"],"content":"Model Context Protocol (MCP) isn\u0026rsquo;t new anymore, and it isn\u0026rsquo;t just another evolving standard. It\u0026rsquo;s widely adopted and considered a critical part of agentic AI. Server-side MCP is powerful, but what happens when an AI agent needs to interact with the web?\nUntil recently, when an autonomous agent browses a website, it behaves like a human looking at a screen: it scrapes the Document Object Model (DOM), parses accessibility trees, takes screenshots, and guesses which CSS selectors to click or forms to submit. This \u0026ldquo;UI actuation\u0026rdquo; approach is slow, brittle, token-expensive, and breaks the moment a CSS class or layout shifts.\n","date":"2026-10-12","excerpt":"The Model Context Protocol isn't just for backend servers. With WebMCP, websites can expose structured JavaScript tools directly in the browser for AI agents to discover and execute. Here is how to implement WebMCP on a Hugo static site without any backend servers.","permalink":"https://ravichaganti.com/blog/adding-webmcp-support-to-hugo-static-sites/","series":"Model Context Protocol","tags":["mcp","webmcp","agents","hugo","static-sites","javascript"],"title":"Adding WebMCP Support to Hugo Static Sites"},{"categories":["Agents","Agent Harness\""],"content":"For a moment, imagine all you have is a Large Language Model (LLM) with no chat window. All you are allowed to do is send a REST API call or the client SDK a model provider offers. When you do this, the model receives the text input and generates text output. It can generate text, but it cannot act. It can think and reason, but it cannot read from or write to your local files. Then it forgets everything it ever received and its response, and waits to be called again. This isn\u0026rsquo;t enough if you want to achieve anything useful with an LLM. This is where an agent harness comes into play. The agent harness is what makes it observe, remember, and act.\n","date":"2026-08-23","excerpt":"A model is a text completion machine. It has no hands, eyes, or memory. The harness is what gives it the ability to act and remember.","permalink":"https://ravichaganti.com/blog/agent-harness-why-do-we-need-it/","series":"Agent Harness","tags":null,"title":"Agent harness - Why do we need it?"},{"categories":["Agents","Agent Skills\"","Agent Plugins","Open Source"],"content":"In the last article, I demonstrated an open-source CLI, apv, created to validate the agent plugin schema. In my articles on agent plugins and apv, I did not cover how I personally use them. In this article, I will describe how I structured my skills repository and how I began releasing the agent plugins package from it.\nSkills repository Over the weekend, I started curating all the skills I have been using and created a collection of them in a public repository. Over time, I plan to add more skills to this collection. At the moment, there are two skills available in this repository.\n","date":"2026-08-16","excerpt":"Agentic coding requires domain knowledge, and this domain knowledge is provided to the agents using skills.","permalink":"https://ravichaganti.com/blog/agent-skills-for-c4-diagram-and-web-demo-generation/","series":"Agent Skills","tags":null,"title":"Agent skills for C4 diagram and web demo generation"},{"categories":["Agents","Agent Plugins","Open Source"],"content":"In an earlier article, I introduced the Agent Plugin specification for packaging agent resources such as skills and MCP configurations. This packaging specification requires a plugin manifest (plugin.json) that agents and clients use to load the necessary agent resources. This manifest, as seen in the earlier article, has a strict schema. As I started exploring agent plugins for packaging skills and MCP configurations, I felt the need to quickly check whether the plugin manifest conforms to the schema. So, I built one!\n","date":"2026-08-09","excerpt":"The agent plugins specification defines a packaging format for agent resources such as skills and MCP configurations. apv is a plugin manifest validator.","permalink":"https://ravichaganti.com/blog/apv-a-plugin-manifest-validator-for-agent-plugins/","series":null,"tags":null,"title":"apv: A plugin manifest validator for agent plugins"},{"categories":["Agents","standards"],"content":"In my work with AI coding agents, I have created many skills that help these agents gain domain and procedural knowledge. Some of these skills are paired with scripts, tools, and MCP servers to take actions based on procedural knowledge. When working with coding agents, everyone on the team has preferences. I prefer using Codex and fall back on Devin for all my coding tasks. Other people on my team prefer using VS Code with either the Codex or Devin extension, and someone else prefers good old PyCharm for everything. But we all share the skills and the MCP configurations. Each of these agents has its own way of consuming skills and MCP configurations. AI coding agents and clients (IDEs, CLIs, platforms) each invented their own plugin packaging format. This is even when plugins contained the same underlying components. A developer who built a useful skill + MCP server combination had to:\n","date":"2026-08-08","excerpt":"AI agent clients (IDEs, CLIs, platforms) each invented their own plugin packaging format — even when plugins contained the same underlying components.","permalink":"https://ravichaganti.com/blog/agent-plugins-package-reusable-agent-components-into-portable-and-interoperable-plugins/","series":"Agentic AI Standards","tags":null,"title":"Agent Plugins: Package reusable agent components into portable and interoperable plugins"},{"categories":["Agents","standards","agntcy","aaif"],"content":"As an AI and Agentic AI practitioner and enthusiast, I have watched the agentic AI space undergo a massive structural shift over the past year. We have moved rapidly past single LLM prompt wrappers into the era of autonomous, multi-agent systems. However, with this explosive growth has come an inevitable wave of standardizations, acronyms, and governing foundations. If you look at the landscape today, you are confronted with a plethora of open-source initiatives and projects: Agentic AI Foundation, AGNTCY, Linux Foundation-hosted projects such as A2A, BeeAI, Agent Skills by Anthropic, and new entrants like Agent Plugins by Google.\n","date":"2026-08-07","excerpt":"The Agent Directory Service directories can be exposed to LLMs directly using the Model Context Protocol and deploying the entire stack into a production environment.","permalink":"https://ravichaganti.com/blog/navigating-agent-ai-standards-foundations-protocols-competition-and-path-to-convergence/","series":"Agentic AI Standards","tags":null,"title":"Navigating Agent AI Standards: Foundations, Protocols, Competition, and Path to Convergence"},{"categories":["Agents","Harness Engineering"],"content":"As the AI ecosystem transitions from conversational chatbots to Agentic AI, our core engineering challenge has fundamentally shifted. The primary bottleneck is no longer the model. It is what we provide, the knowledge, and how we provide it that generates the desired outcome. Harness engineering describes this as the the practice of designing the complete software environment around an AI model, encompassing tools, guardrails, and feedback loops to make autonomous agents reliable. An effective agent harness serves as an operational nervous system around a foundation model. The question is: how do we design production infrastructure that takes abstract, pre-trained parameters and refines them into active, context-aware, and purposeful real-world action?\n","date":"2026-07-25","excerpt":"Knowledge is an essential part of an agent harness!","permalink":"https://ravichaganti.com/blog/the-future-of-agentic-architectures-might-just-be-written-in-our-past/","series":"Harness Engineering","tags":null,"title":"The Future of Agentic Architectures Might Just Be Written in Our Past"},{"categories":["Agents"],"content":"Coding with AI agents became a de facto standard at many companies. In fact, a few are pushing for 100% AI-generated code. I recently shared my thoughts on why \u0026ldquo;Coding is cheap, but code isn\u0026rsquo;t\u0026rdquo;. I explained why an AI coding agent leads to a quantity-over-quality trap. In the same article, I also mentioned why this will hurt junior engineers the most.\nWhether you are a vibe coder or a developer following spec-driven development, it is important that you understand the rationale behind the agent\u0026rsquo;s decisions and the execution flow, and that you can comprehend and explain the code when an unexpected bug surfaces. Relying solely on AI-generated designs and code will lead to cognitive or comprehension debt. This is not limited to just junior developers.\n","date":"2026-06-06","excerpt":"AI coding agents not only increase developer velocity but also cognitive debt!","permalink":"https://ravichaganti.com/blog/fighting-cognitive-debt-in-the-age-of-ai-coding/","series":"agents","tags":null,"title":"Fighting cognitive debt in the age of AI coding"},{"categories":["Agents","OpenClaw"],"content":"In the first part of this series, we looked at what OpenClaw is, its architecture, and its features. In this hands-on part of the series, we will build and run OpenClaw as a container and verify the gateway\u0026rsquo;s health. Let us get started.\nBuilding and running the OpenClaw container I chose to run OpenClaw inside a container to ensure I can freely experiment with different features, including file system access. Before you can run OpenClaw in a container, you need to build the image from source. Let us start by preparing a few directories.\n","date":"2026-05-09","excerpt":"The best way to understand OpenClaw is to try it. The safest way to do that is to run it inside a container.","permalink":"https://ravichaganti.com/blog/openclaw-installation-and-gateway-bootstrap/","series":"OpenClaw","tags":null,"title":"OpenClaw installation and gateway bootstrap"},{"categories":["Agents","OpenClaw"],"content":"I have been running and experimenting with OpenClaw for a while. Unless you just returned from a trip to a cave, you will already know what OpenClaw is. The project originally emerged in late 2025 under the name Clawdbot, authored by the Austrian developer Peter Steinberger. It was renamed to Moltbot (January 2026) and then OpenClaw due to trademark considerations.\nI am starting a new series of articles for those who want to get started with OpenClaw but do not know where to start or how. This series will provide an introduction to OpenClaw, get you started with running OpenClaw, and incrementally build a multi-agent system that uses OpenClaw at its core.\n","date":"2026-05-08","excerpt":"OpenClaw is an open-source, self-hosted AI agent framework that turns your machine into a persistent, autonomous personal assistant.","permalink":"https://ravichaganti.com/blog/introduction-to-openclaw/","series":"OpenClaw","tags":null,"title":"Introduction to OpenClaw"},{"categories":["Agents","AGNTCY"],"content":"As a part of this series on AGNTCY, we have explored how the Directory acts as the backbone of our agentic networks. In the previous post, we looked at the dirctl CLI, the local daemon, and how DHT search works under the hood. Now, it is time to bridge this local capability into the broader AI ecosystem and see how we can run it at an enterprise scale. Let us look at exposing our Directory directly to Large Language Models using the Model Context Protocol (MCP) and deploying the entire stack into a production environment.\n","date":"2026-05-08","excerpt":"The Agent Directory Service directories can be exposed to LLMs directly using the Model Context Protocol and deploying the entire stack into a production environment.","permalink":"https://ravichaganti.com/blog/understanding-agntcy-exposing-agent-directories-via-mcp-and-enterprise-deployment/","series":"agntcy","tags":null,"title":"Understanding AGNTCY - Exposing agent directories via MCP and enterprise deployment"},{"categories":["Agents","AGNTCY"],"content":"As a part of this series on AGNTCY, we have explored the core components of the agent lifecycle. In Part 5, we looked at how OASF schema validation ensures that our agents are speaking the same language. After a long gap, today, we shall examine Layer 2 of the AGNTCY architecture: the Agent Directory Service (ADS).\nThe Phonebook of Agents Think of the internet without DNS. It will be a nightmare of IP addresses and static hosts files. In a multi-agent ecosystem, discovery is just as essential. If an agent needs a specific capability—say, querying a specific database or translating text—it needs a way to find another agent that can perform that task.\n","date":"2026-05-06","excerpt":"The Agent Directory Service is the phonebook for our agent ecosystem. However, it is not just mapping a name to an address like DNS does for web servers. Instead, ADS relies on capability-based matching.","permalink":"https://ravichaganti.com/blog/understanding-agntcy-the-agent-directory-service/","series":"agntcy","tags":null,"title":"Understanding AGNTCY - The agent directory service"},{"categories":["Microsoft Agent Framework","Agents","Production"],"content":"By the time an agent has tools, conversation memory, middleware, and a workflow around them, the question of what to do when the agent decides to take an irreversible action becomes practical. Canceling a customer\u0026rsquo;s order, charging a card, sending a payroll change, or deleting a record. Each of these is a decision you do not want a model making unilaterally, no matter how confident it sounds in the prose around the call.\n","date":"2026-03-20","excerpt":"Some tool calls are too consequential to let an agent run unsupervised. Function approvals pause the agent run when a destructive or sensitive tool is about to fire, surface the call to a human, and resume only after explicit approval. This article looks at how to mark a tool as approval-required, how the run pauses, and how to wire approve and reject back into the agent.","permalink":"https://ravichaganti.com/blog/human-in-the-loop-with-function-approvals-in-microsoft-agent-framework/","series":"Microsoft Agent Framework","tags":null,"title":"Human-in-the-loop with function approvals in Microsoft Agent Framework"},{"categories":["Microsoft Agent Framework","Workflows"],"content":"In the previous article, we walked through the four primitives that make a Microsoft Agent Framework (MAF) workflow tick: executors, edges, events, and the superstep-based execution model. That model has two payoffs we have not yet collected. The first is visualization: because the graph is statically defined at build time, MAF can render it for you in a couple of standard formats. The second is checkpointing: because execution proceeds in discrete supersteps, the runtime can pause cleanly between them and resume later from exactly where it left off.\n","date":"2026-03-18","excerpt":"A workflow is a graph that runs in discrete supersteps. That structure makes two things easy that are usually hard: drawing the graph, and pausing the run cleanly so you can resume it later. This article looks at WorkflowViz for visualization and the CheckpointStorage system for persistence.","permalink":"https://ravichaganti.com/blog/visualizing-and-checkpointing-workflows-in-microsoft-agent-framework/","series":"Microsoft Agent Framework","tags":null,"title":"Visualizing and checkpointing workflows in Microsoft Agent Framework"},{"categories":["Microsoft Agent Framework","Workflows"],"content":"Earlier in this series, we walked through the five orchestration patterns Microsoft Agent Framework (MAF) ships with: sequential, concurrent, handoff, group chat, and magentic. Each one came with a fluent builder (SequentialBuilder, ConcurrentBuilder, and so on) and a tidy mental model. They are the right tools for ninety percent of multi-agent work.\nThis article is about the other ten percent. The orchestration builders are convenience layers on top of a smaller, more general set of primitives: executors (units of computation), edges (the connections between them), events (the observable signals the runtime emits as it works), and a superstep execution model that decides what runs when. When you understand those four things, the builders stop being magic, and you can build the workflows that the builders do not cover.\n","date":"2026-03-16","excerpt":"Sequential, concurrent, handoff, group chat, and magentic workflows are all built on the same four primitives: executors, edges, events, and a superstep-based execution model. This article looks at those primitives directly, so you know what is happening underneath when you reach for an orchestration builder, and so you can build workflows the builders do not cover.","permalink":"https://ravichaganti.com/blog/workflow-fundamentals-in-microsoft-agent-framework/","series":"Microsoft Agent Framework","tags":null,"title":"Workflow fundamentals in Microsoft Agent Framework"},{"categories":["Microsoft Agent Framework","Agents","Memory"],"content":"In the streaming and multi-turn article, we used AgentSession to give an agent continuity across calls within a single Python process. That works for a CLI script or a one-shot evaluation, but it does not work for an agent that has to remember a returning user tomorrow morning, or for one that needs to recall a fact buried in a conversation from three weeks ago. Both cases require different abstractions: storage that lives outside the process and a way to wire it into the agent without rewriting the agent.\n","date":"2026-03-15","excerpt":"AgentSession keeps one conversation alive for as long as the Python process runs. Context providers let an agent remember things across sessions, across users, and across long timescales. This article looks at the provider abstraction, the built-in history and memory providers, and how to write your own.","permalink":"https://ravichaganti.com/blog/context-providers-and-pluggable-memory-in-microsoft-agent-framework/","series":"Microsoft Agent Framework","tags":null,"title":"Context providers and pluggable memory in Microsoft Agent Framework"},{"categories":["Agents","AGNTCY"],"content":"As a part of this series on AGNTCY, we have explored the foundational concepts of the Open Agentic Schema Framework (OASF). In Part 4, we looked closely at the OASF Record Object, dissecting how Skills, Domains, and overall capability footprints are structured. Now, let us look at the practical reality of bringing these structures into an enterprise environment. Today, in this short article, we will discuss how these schemas are enforced, extended, and integrated into production networks where failure is not an option.\n","date":"2026-03-14","excerpt":"In a multi-agent environment, relying on unvalidated metadata is a recipe for disaster.","permalink":"https://ravichaganti.com/blog/understanding-agntcy-schema-validation-and-enterprise-extensions/","series":"agntcy","tags":null,"title":"Understanding AGNTCY - Schema validation and enterprise extensions"},{"categories":["Agents","AGNTCY"],"content":"As a part of this series on AGNTCY, we have explored the high-level design and the broader context. In Part 2, we examined the architecture overview, and in Part 3, we discussed where AGNTCY sits within the larger AI ecosystem. Now, let us drill into Layer 1 of the AGNTCY stack: the Open Agentic Schema Framework (OASF).\nWhy Schemas Matter Before two systems can interact dynamically, they need a clear contract. Think of this like implementing interfaces in object-oriented programming or defining Protobuf messages for gRPC services. In the agentic world, an agent\u0026rsquo;s schema acts as a universal API specification and a capability résumé combined.\n","date":"2026-03-11","excerpt":"Without a standardized schema, orchestrators are left guessing what an agent can do, often resorting to fragile prompt parsing and heuristic-based routing. This is neither scalable nor reliable.","permalink":"https://ravichaganti.com/blog/understanding-agntcy-the-oasf-data-model-and-agent-schemas/","series":"agntcy","tags":null,"title":"Understanding AGNTCY - The OASF data model and agent schemas"},{"categories":["Microsoft Agent Framework","Tools","MCP"],"content":"So far in this series, we have used MCP in one direction. The local MCP article and the hosted MCP article both treated the agent as a client: it found tools on someone else\u0026rsquo;s server and called them. That is the more common pattern, and it is where most teams start.\nThe opposite direction is just as useful and gets less attention. A Microsoft Agent Framework (MAF) agent can also be published as an MCP server, which is how you let other agents and applications, in any framework, in any language, consume your agent\u0026rsquo;s behavior as a tool. Once you have an agent that does something useful, exposing it over MCP is often the cleanest way to share it with the rest of your organization without forcing everyone onto MAF.\n","date":"2026-03-10","excerpt":"We have spent the last two articles consuming MCP servers from a MAF agent. This one flips the picture: how to publish a MAF agent as an MCP server so that other agents and applications, in any framework, can call it as a tool.","permalink":"https://ravichaganti.com/blog/exposing-microsoft-agent-framework-agents-as-mcp-servers/","series":"Microsoft Agent Framework","tags":null,"title":"Exposing Microsoft Agent Framework agents as MCP servers"},{"categories":["Agents","AGNTCY"],"content":"As a part of this series on AGNTCY, we have explored the core components of the platform and the problems it solves. In this third and final post, we need to address the elephant in the room. The AI agent ecosystem is crowded with acronyms — MCP, A2A, ACP, LangGraph, CrewAI, ADK. It is genuinely confusing. I hear this from practitioners constantly. Everyone is building an \u0026ldquo;agent standard,\u0026rdquo; so how do we make sense of it all? Let us sort it out.\n","date":"2026-03-10","excerpt":"The AI agent ecosystem is crowded with acronyms — MCP, A2A, ACP, LangGraph, CrewAI, AutoGen. It is genuinely confusing. I hear this from practitioners constantly. Everyone is building an 'agent standard,' so how do we make sense of it all?","permalink":"https://ravichaganti.com/blog/understanding-agntcy-where-it-fits-in-the-agentic-ai-ecosystem/","series":"agntcy","tags":null,"title":"Understanding AGNTCY - Where it fits in the agentic AI ecosystem"},{"categories":["Microsoft Agent Framework","Tools","MCP","Foundry"],"content":"In the previous article, we wired a Microsoft Agent Framework (MAF) agent to a local MCP server. The agent\u0026rsquo;s process owned the connection: a subprocess for stdio servers, an HTTP client for remote ones, and either way the application code was responsible for the lifecycle, the authentication, and the network. That works when you control the deployment, but it pushes a lot of operational concerns into the application layer.\nWhen the agent runs against Microsoft Foundry, there is a second option. Foundry can hold the MCP connection on the agent\u0026rsquo;s behalf, with the credentials and lifecycle managed inside the platform. Your code declares an MCP tool and attaches it to the agent; Foundry does the actual calling. This is what MAF calls a hosted MCP tool, and the API surface for it lives on FoundryChatClient.\n","date":"2026-03-09","excerpt":"Foundry can host the MCP connection on the agent's behalf. This article looks at how a hosted MCP tool differs from the local MCP setup we built last time, where authentication moves, and how to wire one up via FoundryChatClient.get_mcp_tool.","permalink":"https://ravichaganti.com/blog/hosted-mcp-tools-in-microsoft-agent-framework/","series":"Microsoft Agent Framework","tags":null,"title":"Hosted MCP tools in Microsoft Agent Framework"},{"categories":["Agents","AGNTCY"],"content":"In the previous part of this series, we looked at the fundamental problem of agent silos. We discussed how modern AI agents are brilliant in isolation but struggle to collaborate across different platforms, and we identified the five core problems that need to be solved to build a true Internet of Agents. If you missed it, I highly recommend reading that piece first to understand the why before we dive into the how. Now, let us look at how AGNTCY actually solves these problems through its layered architecture.\n","date":"2026-03-09","excerpt":"Building a global network of agents is not a trivial undertaking. It requires a robust, standardized foundation. Much like the OSI model formalized how computers communicate across networks, AGNTCY introduces a structured stack to handle everything from discovery to secure invocation.","permalink":"https://ravichaganti.com/blog/understanding-agntcy-the-architecture-of-the-internet-of-agents/","series":"agntcy","tags":null,"title":"Understanding AGNTCY - The architecture of the internet of agents"},{"categories":["Microsoft Agent Framework","Tools","MCP"],"content":"The function tools article covered the case where you write the tool yourself: a Python function, type hints, a docstring, and Microsoft Agent Framework (MAF) takes care of the rest. That works beautifully when you control the code. It does not scale when the tool already exists somewhere else, when a vendor publishes a tool you want to use, or when your team wants to share a single tool implementation across multiple agents and frameworks.\n","date":"2026-03-08","excerpt":"Function tools cover code you write yourself. MCP servers cover tools that other people write. This article looks at how to connect a Microsoft Agent Framework agent to a local MCP server, what the agent actually sees when you do, and how MCP tools coexist with the function tools we have already used.","permalink":"https://ravichaganti.com/blog/local-mcp-tools-in-microsoft-agent-framework/","series":"Microsoft Agent Framework","tags":null,"title":"Local MCP tools in Microsoft Agent Framework"},{"categories":["Microsoft Agent Framework","Agents"],"content":"Most of the agents we have built so far have replied in prose. The user asks about the weather, and the agent responds in a single sentence. That works for a chat application, but it does not work for an application that has to do something with the answer. If your code needs to know whether the temperature is above 30°C or whether the recommendation is BUY, HOLD, or SELL, parsing prose with a regex or a second LLM call is fragile. The model phrases things differently each time, and one badly worded sentence can break the pipeline.\n","date":"2026-03-06","excerpt":"Free-text replies are fragile to parse, especially when downstream code depends on the answer's shape. This article looks at how Microsoft Agent Framework constrains an agent's reply to a Pydantic model, when to use it, and how it interacts with tool calls and streaming.","permalink":"https://ravichaganti.com/blog/structured-outputs-in-microsoft-agent-framework/","series":"Microsoft Agent Framework","tags":null,"title":"Structured outputs in Microsoft Agent Framework"},{"categories":["Microsoft Agent Framework","Middleware","Production"],"content":"By the time we have function tools, streaming, and a Foundry-backed agent in place, most of the interesting logic still lives in the agent itself: the system prompt, the tools, and the conversation. That is fine for a sample, but production agents quickly grow a second category of concerns that do not really belong in the prompt or the tools, things like logging every run, redacting PII before it leaves the process, blocking obvious abuse, timing function calls, retrying transient model errors, or rewriting the final response. Putting any of that into the agent definition makes the agent harder to read and harder to reuse.\n","date":"2026-03-05","excerpt":"MAF middleware lets you intercept agent runs, tool calls, and the underlying chat-client requests. This article looks at the three middleware types, when each one fires, and how to use them for logging, redaction, blocking, and result overrides without touching your agent code.","permalink":"https://ravichaganti.com/blog/middleware-in-microsoft-agent-framework/","series":"Microsoft Agent Framework","tags":null,"title":"Middleware in Microsoft Agent Framework"},{"categories":["Agents","AGNTCY"],"content":"As a part of this series, I want to take a step back and examine the current state of AI agents. We have all seen the explosion of powerful agentic frameworks over the last year. If you are building an AI agent today, you might use LangGraph, CrewAI, Google ADK, Microsoft Agent Framework, or any of the dozens of specialized tools out there. Individually, these agents are incredibly capable. They can analyze data, write code, interact with APIs, and summarize vast amounts of information. But there is a fundamental flaw in how we are deploying them. These agents are living in isolation. They are built on different frameworks, hosted in different environments, and speak different dialects. This is the agent silo problem. It is a challenge that, in my experience, is quickly becoming the biggest bottleneck to realizing the true potential of multi-agent systems in the enterprise.\n","date":"2026-03-05","excerpt":"Agents are living in isolation. They are built on different frameworks, hosted in different environments, and speak different dialects. This is the agent silo problem.","permalink":"https://ravichaganti.com/blog/the-agent-silos-problem-and-agntcy/","series":"agntcy","tags":null,"title":"The Agent silos problem and AGNTCY"},{"categories":["Microsoft Agent Framework","Agents"],"content":"Most of the agents we have built in this series so far have looked like this: create a client, create an agent, call agent.run(\u0026quot;a single question\u0026quot;), print the result. That works for a quick demo, but production agents almost never run that way. They hold conversations, where each turn builds on what came before, and they often stream the response as it is generated so the user sees output immediately rather than waiting for the full reply.\n","date":"2026-03-04","excerpt":"Real applications rarely call an agent once and walk away. They hold conversations, and they often stream the response as it is generated. This article looks at AgentSession, streaming responses, and how the two work together.","permalink":"https://ravichaganti.com/blog/streaming-and-multi-turn-conversations-in-microsoft-agent-framework/","series":"Microsoft Agent Framework","tags":null,"title":"Streaming and multi-turn conversations in Microsoft Agent Framework"},{"categories":["Microsoft Agent Framework","Agents","Tools"],"content":"In our first hands-on article, we gave the weather agent a small Python function called get_weather and passed it as a tool. The agent picked it up automatically, called it when the user asked about the weather, and used the result to shape its reply. We did not stop to look at what was actually happening between the function and the model. In this article, we will.\nFunction tools are the most common way to extend an agent\u0026rsquo;s capabilities in the Microsoft Agent Framework (MAF). They are also the place where small details, type hints, defaults, return types, and exceptions, end up making a real difference to how reliably the agent behaves. The goal here is to build a clear mental model of how MAF turns a Python function into something the model can call, and what your choices mean once it does.\n","date":"2026-03-02","excerpt":"Function tools turn ordinary Python functions into capabilities your agent can call. This article looks at how MAF converts type hints into schemas, what return types it accepts, how async tools work, and what happens when a tool raises an error.","permalink":"https://ravichaganti.com/blog/function-tools-in-microsoft-agent-framework/","series":"Microsoft Agent Framework","tags":null,"title":"Function tools in Microsoft Agent Framework"},{"categories":["Microsoft Agent Framework","Agents"],"content":"If you have followed this series so far, you have already seen us use a handful of different clients to create agents in Microsoft Agent Framework (MAF). The first hands-on article used FoundryAgent. The persistent agents article used FoundryChatClient and called it the recommended approach for Foundry persistence. The workflow articles switched to OpenAIChatClient. That is a lot of clients for what looks, on the surface, like the same thing — \u0026ldquo;give me an agent that talks to a model.\u0026rdquo;\n","date":"2026-03-01","excerpt":"Across this series, we have used several Microsoft Agent Framework client classes to talk to different model surfaces. This article maps them out, explains when each one fits, and shows the same simple agent built three different ways.","permalink":"https://ravichaganti.com/blog/choosing-the-right-microsoft-agent-framework-client/","series":"Microsoft Agent Framework","tags":null,"title":"Choosing the right Microsoft Agent Framework client"},{"categories":["Google","Agent Development Kit","Agents","Skills"],"content":"Every other week, we see a new framework claiming to simplify the development of AI agents. Thanks to the growing interest in agentic AI. Earlier this year, Google released its framework for developing agents, which it called the Agent Development Kit (ADK). In my previous post, we explored the basics of creating an LlmAgent and running it using ADK\u0026rsquo;s built-in tools.\nToday, we will dive into a powerful new feature in Google ADK: Agent Skills. We will explore what Agent Skills are, why they matter, and how to implement a practical use case, an Azure Infrastructure as Code (IaC) agent that generates Bicep templates while strictly adhering to organizational governance rules.\n","date":"2026-02-28","excerpt":"Dive into a powerful new feature in Google ADK: Agent Skills. We will explore what Agent Skills are, why they matter, and how to implement a practical use case.","permalink":"https://ravichaganti.com/blog/google-adk-agent-skills/","series":"Google ADK","tags":null,"title":"Google ADK - Agent Skills"},{"categories":["Microsoft Agent Framework","Workflows","Agents","Skills"],"content":"Seems like a season of Agent Skills adoption. Google ADK implemented support for skills a couple of weeks ago, and it\u0026rsquo;s Microsoft Agent Framework\u0026rsquo;s turn last week. In an earlier article in the Google ADK series, we implemented an IaC agent that leverages skills for generating Bicep templates that comply with organizational policies. In today\u0026rsquo;s article, we will explore how to implement the same in Microsoft Agent Framework (MAF).\nUnlike Google ADK, MAF has no inline skill support, so all skills must be implemented as directory skills. We will equip our agent with two skills:\n","date":"2026-02-28","excerpt":"Latest release of Microsoft Agent Framework offers support for Agent Skills. We will explore implementing a practical use case for Skills with MAF.","permalink":"https://ravichaganti.com/blog/microsoft-agent-framework-agent-skills/","series":"Microsoft Agent Framework","tags":null,"title":"Microsoft Agent Framework - Agent Skills"},{"categories":["Hugo","AI Agents","LLMs"],"content":"As AI agents and Large Language Models (LLMs) become a primary way for users (and other agents) to consume technical content, the way we serve our websites needs to evolve. While HTML is great for human readability in a browser, it\u0026rsquo;s often cluttered with navigation, sidebars, and styling that can confuse or distract an AI agent. The emerging llms.txt standard addresses this by providing a structured, Markdown-based map of your site\u0026rsquo;s content specifically for AI consumption. I recently wrote about the documentation stack for AI agents, and thought it was time to practice what I preach.\n","date":"2026-02-16","excerpt":"Learn how to extend Hugo to generate llms.txt and clean Markdown versions of your content, making your site easily consumable by AI agents and LLMs.","permalink":"https://ravichaganti.com/blog/implementing-llms.txt-and-markdown-output-in-hugo/","series":null,"tags":null,"title":"Implementing llms.txt and Markdown Output in Hugo"},{"categories":["GitHub","Agentic Workflows","Agents"],"content":"If you\u0026rsquo;ve ever written a technical book, you know the sinking feeling. Especially when the topic is an evolving technology or an area with rapid advancements. The moment the manuscript goes to print, the clock starts ticking. APIs evolve. Tools release new versions. Best practices shift. The code examples you carefully crafted six months ago? They\u0026rsquo;re already gathering dust. I faced this with a few books I\u0026rsquo;d written in the past.\n","date":"2026-02-15","excerpt":"GitHub Agentic Workflows let you write automation in natural language. Instead of stitching together YAML steps, shell scripts, and third-party Actions, you describe what you want an AI agent to accomplish and give it the tools to do it.","permalink":"https://ravichaganti.com/blog/github-agentic-workflows/","series":"GitHub Agentic Workflows","tags":null,"title":"GitHub Agentic Workflows"},{"categories":["Agents"],"content":"We are in the middle of a fundamental shift in how software gets built. LLMs are no longer used as passive autocomplete machines. AI agents reason, plan, retrieve information, and act. An agent is only as good as the knowledge it can access. An LLM\u0026rsquo;s training data is frozen in time. The Kubernetes API changed last week. Your company shipped a new SDK version this morning. The compliance rules were updated yesterday. If an agent can\u0026rsquo;t reach this knowledge at inference time, it hallucinates, generates deprecated code, or simply gives up.\n","date":"2026-02-10","excerpt":"Learn what you need to make your knowledge consumable by AI — from static files to live APIs.","permalink":"https://ravichaganti.com/blog/documentation-stack-for-ai-agents/","series":null,"tags":null,"title":"Documentation stack for AI agents"},{"categories":["Skills","MCP"],"content":"Anthropic introduced Agent Skills in October 2025, just a year after they introduced Model Context Protocol (MCP). Today, both Agent Skills and MCP are open standards. The fact that a single company produced two standards that seem to be competing has fueled heated debate on social media, Hacker News, and developer blogs. Some claim that MCP is dead, while others argue that the comparison itself is moot. The truth is more nuanced than that. You can build powerful agents with either or both. For anyone building enterprise-grade agent-powered systems, understanding where these standards genuinely overlap, where they serve fundamentally different purposes, and where each falls short is essential.\n","date":"2026-02-06","excerpt":"Agent Skills and MCP are a hot topic. Understanding these standards genuinely overlap, where they serve fundamentally different purposes, and where each falls short, is essential for anyone building agent-powered systems.","permalink":"https://ravichaganti.com/blog/agent-skills-vs-model-context-protocol-how-do-you-choose/","series":"Agents","tags":null,"title":"Agent skills vs Model Context Protocol - [How] do you choose?"},{"categories":["AI Platform"],"content":"There is a particular kind of engineering pain that comes from inheriting someone else\u0026rsquo;s model. You get a file. You get a requirements.txt that no longer resolves. And you get a number, 94% accuracy, that you have no way to reproduce, because the data that produced it lived in a notebook cell that has since been overwritten.\nFor most of the 2010s, that was the state of the art.\nIn the previous post, we established that AI platforms are not web platforms with a GPU bolted on. But that leaves an obvious objection: we already had a discipline for operationalizing machine learning. We called it MLOps, we spent years building it, and it worked. Why isn\u0026rsquo;t it enough?\n","date":"2026-02-06","excerpt":"MLOps was built on a single load-bearing assumption: that you train the model. Foundation models broke it, and the discipline had to become something else.","permalink":"https://ravichaganti.com/blog/ai-platform-engineering-how-mlops-became-platform-engineering/","series":"AI Platform Engineering","tags":null,"title":"AI Platform Engineering: How MLOps became platform engineering"},{"categories":["AI Platform"],"content":"For the last decade, building an internal developer platform meant one thing: Kubernetes, stateless microservices, and a horizontally scalable database. If things got slow, you just added more pods. If you needed more compute, you spun up more CPU instances in the cloud. It was a solved problem. Then generative AI showed up, and suddenly everyone thought they could just bolt a GPU onto their existing web platform and call it a day. I see this all the time in my work as an AI Platform Architect at Dell Technologies. A team will take their battle-tested, highly available web platform, try to run a massive LLM or a large-scale training job on it, and watch the whole thing melt down. Sometimes, literally.\n","date":"2026-02-03","excerpt":"An AI platform is not just a web platform with a GPU attached. The core assumptions that drove web architecture for the last ten years are fundamentally broken when you introduce AI workloads.","permalink":"https://ravichaganti.com/blog/ai-platform-engineering-why-ai-platforms-are-different-from-web-platforms/","series":"AI Platform Engineering","tags":null,"title":"AI Platform Engineering: Why AI Platforms are different from web platforms"},{"categories":["AI Platform"],"content":"Every AI demo I\u0026rsquo;ve ever seen works perfectly. Every AI system I\u0026rsquo;ve ever built breaks in ways no demo ever warned me about.\nIf you\u0026rsquo;ve spent any time trying to take an AI workload from a Jupyter notebook to production, you know exactly what I mean. In the notebook, the model predicts, generates, and reasons beautifully. In production, GPUs sit idle waiting for data, inference latency spikes unpredictably, memory leaks crash the system, and your cloud bill suddenly looks like a down payment on a house.\n","date":"2026-02-01","excerpt":"Every AI demo I've ever seen works perfectly. Every AI system I've ever built breaks in ways no demo ever warned me about.","permalink":"https://ravichaganti.com/blog/ai-platform-engineering-the-platform-layer/","series":"AI Platform Engineering","tags":null,"title":"AI Platform Engineering: The Platform Layer"},{"categories":["Microsoft","Agent Framework","Agents","A2A"],"content":"In the previous article, we explored how to build multi-agent systems using Google\u0026rsquo;s Agent Development Kit (ADK) and the A2A (Agent-to-Agent) protocol. We built a currency conversion agent and exposed it via A2A, then created a travel assistant that consumed it—all within the ADK ecosystem.\nBut here\u0026rsquo;s where A2A truly shines: framework interoperability. The A2A protocol isn\u0026rsquo;t tied to any specific agent framework. Any A2A-compliant agent can communicate with any other, regardless of whether it was built with Google ADK, Microsoft Agent Framework, LangChain, or a custom implementation.\n","date":"2026-01-28","excerpt":"Microsoft Agent Protocol is an open framework for building enterprise-grade agents. It offers support for using the A2A protocol for cross-agent communication.","permalink":"https://ravichaganti.com/blog/cross-framework-agent-communication-microsoft-agent-framework-meets-google-adk-via-a2a/","series":"Microsoft Agent Framework","tags":null,"title":"Cross-Framework Agent Communication: Microsoft Agent Framework meets Google ADK via A2A"},{"categories":["Google","Agent Development Kit","Agents","A2A"],"content":"The landscape of AI agents is evolving rapidly, and one of the most significant developments is the emergence of standardized protocols that enable agents to communicate with one another. Google\u0026rsquo;s Agent Development Kit (ADK) natively supports the Agent-to-Agent (A2A) protocol, enabling developers to build sophisticated multi-agent systems where specialized agents can collaborate across network boundaries. In this post, we\u0026rsquo;ll explore what A2A is, why it matters, and walk through a complete implementation that demonstrates how to expose an agent as a remote service and consume it from another agent.\n","date":"2026-01-27","excerpt":"Google Agent Development Kit (ADK) is a flexible and modular framework for developing and deploying AI agents. It offers native support to interact with other agents via the agent-to-agent protocol.","permalink":"https://ravichaganti.com/blog/building-multi-agent-systems-with-google-adk-and-the-a2a-protocol/","series":"Google ADK","tags":null,"title":"Building multi-agent systems with Google ADK and the A2A protocol"},{"categories":["Google","Agent Development Kit","Agents"],"content":"Google\u0026rsquo;s Agent Development Kit (ADK) provides workflow agents to enable more deterministic agent execution. These workflows can be combined to create more complex agentic workflows.\nIn this post, I\u0026rsquo;ll walk you through how I created an AI-powered content pipeline that:\nResearches trending topics using Google Search Writes engaging newsletter drafts Edits and quality-checks the content Publishes the final version to a local file Let\u0026rsquo;s dive in!\nThe Big Picture: A Team of Specialized Agents Instead of building one massive AI that does everything (and probably does nothing well), I went with a multi-agent architecture. Think of it like assembling a content team:\n","date":"2026-01-26","excerpt":"Automating content creation with a team of AI agents that research, write, edit, and publish","permalink":"https://ravichaganti.com/blog/building-a-multi-agent-linkedin-newsletter-system-with-google-adk/","series":"Google ADK","tags":null,"title":"Building a Multi-Agent LinkedIn Newsletter System with Google ADK"},{"categories":["teaching","courses","learning"],"content":"The beginning of 2026 also marks the start of my 26th year in the IT industry. Being an 80s kid and having joined the IT industry in the early 2000s, I have seen and experienced different waves of computing, from bare-metal systems to virtualization, to containers and Kubernetes, to generative AI. I was fortunate to participate in and contribute to each of these waves of computing. My work at Wipro and Dell Technologies enabled me in this journey. This was a great learning experience, and applying those skills at work is the most satisfying part. Outside my role at these companies, I benefited immensely from online and offline technical communities. I have learned from many experts in several areas. At the same time, I started giving back to the community. I started PowerShell Magazine back in 2011, and while it was at the top of the game, it provided the most in-depth technical content to help the PowerShell community learn. I moved on from PowerShell as a tool for automation and started focusing on Linux, containers, Kubernetes, and eventually on Artificial Intelligence.\n","date":"2026-01-19","excerpt":"An open and free learning platform for the technical community.","permalink":"https://ravichaganti.com/blog/announcing-a-self-paced-learning-platform-and-preview-of-learnctl/","series":null,"tags":null,"title":"Announcing a self-paced learning platform and preview of LearnCTL"},{"categories":["Google","Agent Development Kit","Agents"],"content":"Imagine this scenario. Your company has dozens of internal REST APIs, each with an OpenAPI specification already published. You need an agent that can query the inventory service, place orders through the fulfillment API, and check shipment tracking, all without writing individual tool functions for every single endpoint. Now layer on some more complexity. Some of those APIs require OAuth2 tokens. One task, say generating a compliance report, takes ten minutes to complete. And you want a coordinator agent that can delegate research tasks to a specialized sub-agent without losing control of the conversation.\n","date":"2025-12-23","excerpt":"Your agent needs to talk to the outside world. It needs to call REST APIs, delegate complex work to specialized agents, authenticate with protected services, and kick off operations that take minutes instead of milliseconds. Google ADK provides four powerful patterns to make all of this possible.","permalink":"https://ravichaganti.com/blog/google-adk-openapi-tools-agents-as-tools-authentication-and-long-running-operations/","series":"Google ADK","tags":null,"title":"Google ADK - OpenAPI tools, agents-as-tools, authentication, and long-running operations"},{"categories":["Google","Agent Development Kit","Agents"],"content":"Consider you are building an agent that needs to interact with a company\u0026rsquo;s database, pull data from a third-party API, and read files from a shared drive. Without a standard protocol, you would end up writing custom integration code for each backend. Every new tool means a new adapter. Every new agent that needs the same tool means duplicating that adapter. This approach does not scale. The Model Context Protocol (MCP) solves this by providing a universal standard for how agents connect to external tools and data sources. With MCP, a tool is built once, and any MCP-compatible agent can discover and use it. Google ADK has first-class support for MCP, enabling your agents to both consume tools from MCP servers and expose their own tools as MCP servers.\n","date":"2025-12-20","excerpt":"An agent that can only use the tools you hard-code into it has a ceiling. The Model Context Protocol (MCP) shatters that ceiling by giving your ADK agents a standardized way to discover and use tools hosted anywhere — local processes, remote servers, or cloud services.","permalink":"https://ravichaganti.com/blog/google-adk-mcp-tools/","series":"Google ADK","tags":null,"title":"Google ADK - MCP tools"},{"categories":["Google","Agent Development Kit","Agents"],"content":"You have defined your agents, wired up tools, set up callbacks, and configured sessions with scoped state. But when a user sends a message, what actually happens? Who calls the agent? Who persists in the state changes? Who decides when the conversation turn is over? The answer to all of these is the Runner. The Runner is the central orchestrator of the ADK runtime. It receives a user\u0026rsquo;s query, starts the agent, processes every event the agent emits, commits state changes via the SessionService, and forwards events to the caller. Without the Runner, your agents, tools, and callbacks are just definitions sitting idle. The Runner is the engine that brings them to life.\n","date":"2025-12-18","excerpt":"You have agents, tools, callbacks, and sessions. But what actually runs them? The Runner is the central orchestrator that powers every agent interaction in Google ADK, driving the event loop that connects all these pieces together.","permalink":"https://ravichaganti.com/blog/google-adk-runner-and-execution-architecture/","series":"Google ADK","tags":null,"title":"Google ADK - Runner and execution architecture"},{"categories":["Google","Agent Development Kit","Agents"],"content":"Imagine you built a customer support agent. It works well, but you then discover that the LLM occasionally leaks email addresses in its responses. You need to sanitize output before the user sees it. Or consider a flight booking agent where only admin users should be allowed to cancel reservations. You need to check permissions before a tool executes. Or maybe the same question is asked a hundred times a day, and each time you are paying for an LLM API call. You need to return cached responses and skip the model entirely. All of these share a common pattern. You need to run your code at specific points in the agent\u0026rsquo;s execution pipeline, before or after the model call, before or after a tool runs, before or after the agent itself. This is where the callbacks feature comes into play.\n","date":"2025-12-12","excerpt":"Callbacks are user-defined functions that hook into an agent's execution pipeline at predefined checkpoints. They let you observe, customize, and control agent behavior without modifying the ADK framework code.","permalink":"https://ravichaganti.com/blog/google-adk-callbacks/","series":"Google ADK","tags":null,"title":"Google ADK - Callbacks"},{"categories":["Google","Agent Development Kit","Agents"],"content":"Imagine you built a travel-booking agent. A user says, \u0026ldquo;Find flights to Paris, and the agent returns options. Then the user says, \u0026ldquo;Book the second one.\u0026rdquo; Without any memory of the previous turn, the agent has no idea what \u0026ldquo;the second one\u0026rdquo; refers to. The conversation is dead. This is the fundamental problem with LLMs. LLMs are stateless. Every API call to an LLM is independent. The model does not inherently remember what was said before. Yet meaningful conversations are inherently multi-turn, contextual, and stateful. This is where agent memory comes into play. Agent memory is the system built around the LLM to allow it to retain information, learn from past interactions, and maintain continuity within and across conversations.\n","date":"2025-12-05","excerpt":"LLMs are stateless. Every API call to an LLM is independent. The model does not inherently remember what was said before. Yet meaningful conversations are inherently multi-turn, contextual, and stateful.","permalink":"https://ravichaganti.com/blog/google-adk-sessions-state-and-memory/","series":"Google ADK","tags":null,"title":"Google ADK - Sessions, state, and memory"},{"categories":["Google","Agent Development Kit","Agents"],"content":"In the introduction to Google ADK, we looked at the basics of using ADK to create an agent, connect tools, and also learnt how to define agents using the declarative YAML configuration. The example we implemented used the Agent class. This class is an alias of the LlmAgent class. LlmAgent behavior is non-deterministic as it uses an LLM for deciding what tools to use or how to proceed toward a goal. ADK also offers workflow agents that are more deterministic, control the execution flow of their sub-agents, and operate according to predefined logic. The execution flow of workflow agents depends on their type.\n","date":"2025-12-03","excerpt":"Google Agent Development Kit (ADK) is a flexible and modular framework for developing and deploying AI agents. It offers different types agents.","permalink":"https://ravichaganti.com/blog/google-adk-types-of-agents/","series":"Google ADK","tags":null,"title":"Google ADK - types of agents"},{"categories":["Google","Agent Development Kit","Agents"],"content":"Every other week, we see a new framework claiming to simplifythe development of AI agents. Thanks to the growing interest in agentic AI. Earlier this year, Google released its framework for developing agents, which it called the Agent Development Kit (ADK).\nYouTube Video This video requires your consent to load content from YouTube, which may set tracking cookies. Enable YouTube Video ID: zgrOwow_uTQ ","date":"2025-12-01","excerpt":"Google Agent Development Kit (ADK) is a flexible and modular framework for developing and deploying AI agents.","permalink":"https://ravichaganti.com/blog/introduction-to-google-agent-development-kit/","series":"Google ADK","tags":null,"title":"Introduction to Google Agent Development Kit"},{"categories":["Microsoft Agent Framework","Workflows","Agents"],"content":"In this series on Microsoft Agent Framework (MAF), we\u0026rsquo;ve explored sequential workflows where agents process tasks in a fixed order, concurrent workflows where agents work in parallel, handoff workflows where agents transfer control based on context, and group chat workflows where agents engage in turn-based discussions. Each pattern has its strengths, but they all share one limitation: the orchestration logic is predetermined at design time.\nWhat if you need a workflow that can adapt its routing decisions based on what agents discover during execution? Enter Magentic workflows, the most sophisticated orchestration pattern in MAF, where an LLM-powered manager autonomously coordinates specialized agents, making real-time decisions about who to invoke next based on intermediate results.\n","date":"2025-10-20","excerpt":"If you need a workflow that can adapt its routing decisions based on what agents discover during execution, look no further. Magentic is for you!","permalink":"https://ravichaganti.com/blog/magentic-workflows-in-microsoft-agent-framework/","series":"Microsoft Agent Framework","tags":null,"title":"Magentic workflows in Microsoft Agent Framework"},{"categories":["Microsoft Agent Framework","Workflows","Agents"],"content":"In the previous articles of this series, we explored three powerful workflow patterns in Microsoft Agent Framework (MAF):\nSequential: Agents process in a fixed order, like a pipeline. Concurrent: Agents work in parallel, with results aggregated. Handoff: A coordinator routes requests to specialist agents. But what happens when you need agents to discuss, debate, and build on each other\u0026rsquo;s ideas, like a brainstorming session or a committee meeting? This is where the GroupChat workflow pattern shines. In this article, we\u0026rsquo;ll explore how to build dynamic multi-agent conversations using GroupChatBuilder, where a moderator (or selection function) orchestrates turn-based discussions among participant agents.\n","date":"2025-10-18","excerpt":"Building dynamic multi-agent discussions where AI agents collaborate, debate, and converge on solutions with GroupChatBuilder","permalink":"https://ravichaganti.com/blog/group-chat-workflows-in-microsoft-agent-framework/","series":"Microsoft Agent Framework","tags":null,"title":"Group chat workflows in Microsoft Agent Framework"},{"categories":["Docker","cagent","Agents"],"content":"Docker is one company that has been really taking advantage of the AI wave. True to its philosophy, it is helping developers with new tools and frameworks to simplify AI application development. Starting with Docker MCP catalog, MCP toolkit, Model Runner, MCP gateway, and cagent, Docker is certainly at the forefront of AI agent developer experience. In this article, we will get started with cagent.\nIntroduction Docker cagent is an open-source, multi-agent AI runtime that lets you build, orchestrate, and share teams of specialized AI agents defined declaratively in YAML. Instead of wiring together complex agent frameworks in code, you describe what each agent does, which tools it can access, and how agents delegate to one another. cagent handles the rest: model communication, tool orchestration, context isolation, and inter-agent coordination. It ships bundled with Docker Desktop 4.49+ and can distribute agent configurations as OCI artifacts through Docker Hub, treating agents with the same rigor as container images. Written in Go and currently labeled experimental, cagent represents Docker\u0026rsquo;s bet that the agent ecosystem needs the same standardization, portability, and trust infrastructure that containers brought to application deployment.\n","date":"2025-10-16","excerpt":"Docker cagent is an open-source, multi-agent AI runtime that lets you build, orchestrate, and share teams of specialized AI agents — all defined declaratively in YAML.","permalink":"https://ravichaganti.com/blog/docker-cagent-an-introduction/","series":"Docker cagent","tags":null,"title":"Docker cagent - An introduction"},{"categories":["Microsoft Agent Framework","Workflows","Agents"],"content":"In the previous articles, we explored Sequential and Concurrent workflow patterns in the Microsoft Agent Framework (MAF). Today, we dive into one of the most practical and widely-applicable patterns: the handoff workflow. The handoff pattern models real-world scenarios in which a conversation or task is transferred from one agent to another based on context, expertise, or role. Think of it like a customer support call center—you first speak with a frontline agent who assesses your issue and then routes you to the appropriate specialist.\n","date":"2025-10-16","excerpt":"Learn how to orchestrate AI agents in a concurrent workflow using Microsoft Agent Framework's HandoffBuilder","permalink":"https://ravichaganti.com/blog/handoff-workflows-in-microsoft-agent-framework/","series":"Microsoft Agent Framework","tags":null,"title":"Handoff workflows in Microsoft Agent Framework"},{"categories":["Microsoft Agent Framework","Workflows","Agents"],"content":"In the [previous article](Sequential workflows in Microsoft Agent Framework | Ravikanth Chaganti), we explored the sequential workflow pattern, a straightforward approach where agents process tasks one after another in a defined order. While sequential workflows are powerful for pipeline-style processing, they have a limitation: speed. When agents don\u0026rsquo;t depend on each other\u0026rsquo;s output, running them one at a time is inefficient.\nHere\u0026rsquo;s where the concurrent workflow pattern comes into play. This pattern allows multiple agents to work in parallel, dramatically reducing total execution time and enabling scenarios that require diverse perspectives to be analyzed simultaneously.\n","date":"2025-10-14","excerpt":"Learn how to orchestrate AI agents in a concurrent workflow using Microsoft Agent Framework's ConcurrentBuilder","permalink":"https://ravichaganti.com/blog/concurrent-workflows-in-microsoft-agent-framework/","series":"Microsoft Agent Framework","tags":null,"title":"Concurrent workflows in Microsoft Agent Framework"},{"categories":["Microsoft Agent Framework","Workflows","Agents"],"content":"A single AI agent is powerful and can do impressive things. But real-world applications often need multiple specialists working together, with each agent handling a specific task before passing results to the next. As with humans, in the agentic world we also need to break complex problems into manageable pieces and have specialized agents handle each task. We need one agent to review another\u0026rsquo;s work and handle complex tool invocation.\n","date":"2025-10-12","excerpt":"Learn how to orchestrate AI agents in a step-by-step pipeline using Microsoft Agent Framework's SequentialBuilder","permalink":"https://ravichaganti.com/blog/sequential-workflows-in-microsoft-agent-framework/","series":"Microsoft Agent Framework","tags":null,"title":"Sequential workflows in Microsoft Agent Framework"},{"categories":["Microsoft Agent Framework","Foundry","Agents"],"content":"In my earlier post on Getting Started with Foundry Agents, I covered the basics of creating agents using the Azure AI Foundry Agents service and the azure-ai-projects SDK. In another article in this series, we looked at creating Azure AI agents with Microsoft Agent Framework (MAF). Agents created with MAF are local only where MAF acts as the runtime. In this follow-up, we will examine how to create Foundry agents using MAF.\n","date":"2025-10-10","excerpt":"The Microsoft Agent Framework represents a significant improvement in developer experience over the raw Foundry SDK. While the native SDK gives you complete control, the Agent Framework provides less boilerplate, type-safe tools, consistent patterns, and resource safety.","permalink":"https://ravichaganti.com/blog/building-persistent-ai-agents-with-microsoft-agent-framework-and-microsoft-foundry/","series":"Microsoft Agent Framework","tags":null,"title":"Building persistent AI Agents with Microsoft Agent Framework and Microsoft Foundry"},{"categories":["Microsoft Agent Framework","Agents"],"content":"The Microsoft Agent Framework (MAF) is an open-source development kit that combines the best ideas from Semantic Kernel and AutoGen projects. It provides a flexible foundation for building AI agents that can:\nProcess user inputs using Large Language Models (LLMs) Call tools and MCP servers to perform actions. Generate intelligent, context-aware responses. Manage conversation state across interactions. In this article, we\u0026rsquo;ll explore different examples that showcase different capabilities of AI agents.\n","date":"2025-10-04","excerpt":"The world of AI agents is evolving rapidly, and Microsoft's Agent Framework provides a powerful, unified foundation for building intelligent agents that can reason, take actions, and interact with users naturally. In this blog post, I'll walk you through a series of practical examples that demonstrate how to create and use Azure AI agents using MAF and Python.","permalink":"https://ravichaganti.com/blog/building-ai-agents-with-microsoft-agent-framework/","series":"Microsoft Agent Framework","tags":null,"title":"Building AI Agents with Microsoft Agent Framework"},{"categories":["Microsoft","Foundry","Agents"],"content":"Microsoft Foundry (formerly Azure AI Foundry) is a unified system for building intelligent agents. It is a platform that provides models, tools, frameworks, and capabilities such as observability, guardrails, and enterprise-ready governance for building AI agents. With the Foundry Agent service, developers can develop agents locally and deploy them to different environments seamlessly, leveraging the building blocks provided by Microsoft Foundry. Foundry Agent service provides the runtime that manages conversations, orchestrates tool calls, and integrates with identify and observability systems. As discussed in the previous article, agents use LLMs to reason and make decisions. Agents use tools to perform actions. Agents can participate in workflows or interact with other agents to achieve a bigger goal. This is achieved by treating agents as composable units.\n","date":"2025-10-03","excerpt":"Microsoft Foundry (formerly Azure AI Foundry) is a unified system for building intelligent agents. It is a platform that provides models, tools, frameworks, and other aspects such as observability, guardrails, and enterprise-ready governance for creating AI agents.","permalink":"https://ravichaganti.com/blog/getting-started-with-foundry-agents/","series":"Microsoft Foundry","tags":null,"title":"Getting Started with Foundry Agents"},{"categories":["Microsoft","Agent Framework","Agents"],"content":"I have been following the Microsoft ecosystem for agent and agentic workflow development and have evaluated frameworks such as AutoGen and Semantic Kernel. In the past, I have written briefly about AutoGen. I used Semantic Kernel, along with Azure AI Foundry, to experiment with a few enterprise-ready agentic scenarios. Both frameworks are useful in their own ways, and Semantic Kernel, with its enterprise-deployment readiness, became the go-to framework for many. Microsoft announced plans to converge these frameworks into what it calls the Microsoft Agent Framework, which brings together the best parts of AutoGen and Semantic Kernel.\n","date":"2025-10-02","excerpt":"Microsoft Agent Framework is an open-source development kit for building AI agents and multi-agent workflows.","permalink":"https://ravichaganti.com/blog/introduction-to-microsoft-agent-framework/","series":"Microsoft Agent Framework","tags":null,"title":"Introduction to Microsoft Agent Framework"},{"categories":["Azure AI Search"],"content":"Introduction In the previous article of this series, we covered the foundational workflow: installing azure-search-documents, authenticating, creating an index, uploading documents, and running full-text queries with filters, sorting, and pagination.\nNow we move into the capabilities that make Azure AI Search genuinely powerful for modern AI applications:\nFaceted navigation — aggregate counts by field for drill-down filtering. Scoring profiles — customise relevance ranking with field weights and boosts. Semantic ranking — re-rank results using deep language understanding and return AI-generated captions and answers. Vector search — store and query dense embeddings for semantic similarity retrieval. Hybrid search — combine keyword BM25 and vector search in a single query using Reciprocal Rank Fusion (RRF). All examples use azure-search-documents against a real Azure AI Search resource.\n","date":"2025-09-13","excerpt":"Part 2 of our Azure AI Search Python SDK series goes deeper: faceted navigation, custom scoring profiles, semantic ranking with captions and answers, vector search with embeddings, and hybrid search that combines keyword and vector retrieval for maximum relevance.","permalink":"https://ravichaganti.com/blog/azure-ai-search-python-sdk-facets-scoring-profiles-semantic-ranking-and-vector-search/","series":"Azure AI Search Python SDK","tags":null,"title":"Azure AI Search Python SDK — Facets, Scoring Profiles, Semantic Ranking, and Vector Search"},{"categories":["Azure AI Search"],"content":"Introduction Azure AI Search (formerly Azure Cognitive Search) exposes a rich REST API for index management, document ingestion, and querying. The azure-search-documents Python SDK wraps that API with a clean, type-annotated interface so you can build search-powered applications without writing raw HTTP requests.\nIn this first part, we cover the foundational workflow: installing the SDK, authenticating against your Azure Search resource, defining an index schema, uploading documents, and running full-text search queries. By the end, you will have a working Python script that creates an index, loads data, and returns search results.\n","date":"2025-09-11","excerpt":"In this first part of our Azure AI Search Python SDK series, we install the azure-search-documents library, configure authentication, create and manage indexes programmatically, upload documents, and run your first full-text search queries — all from Python.","permalink":"https://ravichaganti.com/blog/azure-ai-search-python-sdk-installation-authentication-and-index-management/","series":"Azure AI Search Python SDK","tags":null,"title":"Azure AI Search Python SDK — Installation, Authentication, and Index Management"},{"categories":["Azure AI Search"],"content":"In the previous article, we built enrichment pipelines that extract structured metadata from raw content using built-in cognitive skills. Language codes, key phrases, and entity names made our documents more searchable and filterable, but they still operated in the full-text search world.\nIn this article, we cross into vector territory. We will chunk documents using the Text Split skill, generate embeddings with Azure OpenAI, store them in a vector-enabled index, and run both vector and hybrid queries. We will also build a custom skill backed by an Azure Function and close with a Python SDK teaser. By the end, you will have a working chunk-and-embed pipeline, which is the foundation for RAG with Azure AI Search.\n","date":"2025-09-08","excerpt":"In this article, we cross into vector territory. We will chunk documents using the Text Split skill, generate embeddings with Azure OpenAI, store them in a vector-enabled index, and run both vector and hybrid queries.","permalink":"https://ravichaganti.com/blog/azure-ai-search-vectorization-custom-skills-and-rag/","series":"Azure AI Search","tags":null,"title":"Azure AI Search - Vectorization, Custom Skills, and RAG"},{"categories":["Azure AI Search"],"content":"In this series so far, we provisioned an Azure AI Search service and worked with indexes, documents, and queries. Everything we loaded was structured JSON, with the fields mapping neatly to the index schema. That is the happy path, but it is not reality.\nIn the real world, your data is messy. You have PDFs with embedded images, scanned documents with no machine-readable text, and text in multiple languages. This is where AI enrichment comes in. Azure AI Search lets you attach an AI pipeline to your indexer that transforms raw content during indexing, extracting structure and meaning from your documents before they land in the index.\n","date":"2025-09-05","excerpt":"An AI enrichment pipeline extends the indexer with a skill set, an ordered collection of skills that transform content during indexing.","permalink":"https://ravichaganti.com/blog/azure-ai-search-ai-enrichment-with-skillsets/","series":"Azure AI Search","tags":null,"title":"Azure AI Search - AI Enrichment with Skillsets"},{"categories":["Azure AI Search"],"content":"In the previous article in this series, we looked at what Azure AI Search is, why it matters for AI-powered applications, and how to provision the service using Bicep and Azure CLI. With the search service up and running, the next step is to make it useful by creating an index, loading data into it, and running queries. These are the fundamental building blocks on which everything else in Azure AI Search is built.\n","date":"2025-09-04","excerpt":"To make use of the power of Azure AI Search, we need to create an index, load data into it, and run queries.","permalink":"https://ravichaganti.com/blog/azure-ai-search-creating-indexes-and-loading-data/","series":"Azure AI Search","tags":null,"title":"Azure AI Search - Creating Indexes and Loading Data"},{"categories":["Azure AI Search"],"content":"I have written about using the Azure OpenAI API and interacting with it in Python. I have been experimenting with agentic AI systems for a while now, and one thing that keeps coming up often is the need for a robust retrieval layer. Agents are nothing without a proper context. Whether you are building a RAG-based chatbot, an enterprise search application, or an AI agent that needs to ground its responses in your proprietary data, the retrieval component is what separates a prototype from a production system. Azure AI Search (formerly Azure Cognitive Search) is Microsoft\u0026rsquo;s answer to this challenge, and it has evolved significantly to become a core building block in the Microsoft AI ecosystem.\n","date":"2025-09-02","excerpt":"Creating an enterprise AI application? Does your application need access to enterprise data and web content? Azure AI Search is the answer.","permalink":"https://ravichaganti.com/blog/azure-ai-search-getting-started/","series":"Azure AI Search","tags":null,"title":"Azure AI Search - Getting Started"},{"categories":["inferencing","local serving"],"content":"In this series of articles on local model serving, we learned about using Ollama, Docker Model Runner, and LMStudio. At Build 2025, Microsoft announced Foundry Local. This is specifically designed for running AI models on resource-constrained devices, making it ideal for local AI inference on edge devices. Foundry Local features model management and deployment via a command-line interface, and offers an OpenAI API-compatible RESTful API. It also supports Python, C#, Rust, and JavaScript SDKs for local AI model management.\n","date":"2025-07-17","excerpt":"There are several options available for running Large Language Model (LLM) inference locally. Foundry Local by Microsoft is a new entrant.","permalink":"https://ravichaganti.com/blog/local-model-serving-using-foundry-local/","series":"Local LLM Serving","tags":null,"title":"Local model serving - Using Foundry Local"},{"categories":["inferencing","local serving"],"content":"In the local model serving landscape, we have already looked at Ollama and LM Studio. The other option I explored was Docker Model Runner (DMR). For any developer, Docker is a part of the workflow. The DMR makes running a local model as simple as running a container. This feature was introduced as a beta in the Docker Desktop 4.40 release. The key features of DMR include:\nServe models on OpenAI-compatible APIs Pull and push models to and from Docker Hub. Manage local models Run and interact with models both from the command line and the Docker Desktop GUI. Package model GGUF files as OCI artifacts and publish them to any container registry To get started, you can install Docker Desktop or upgrade to a version above 4.40. This installs the docker-model CLI plugin.\n","date":"2025-07-16","excerpt":"Docker Model Runner — a faster, simpler way to run and test AI models locally, right from your existing workflow. Whether you’re experimenting with the latest LLMs or deploying to production, Model Runner brings the performance and control you need, without the friction.","permalink":"https://ravichaganti.com/blog/local-model-serving-using-docker-model-runner/","series":"Local LLM Serving","tags":null,"title":"Local model serving - Using Docker model runner"},{"categories":["inferencing","local serving"],"content":"In an earlier article, we looked at Ollama for serving models locally. While searching for various options to run models on my local machine, I came across LM Studio - Local AI, which is also available on your computer. LM Studio offers a comprehensive set of features compared to Ollama. In today\u0026rsquo;s article, we will go over some of these features.\nYou can download and install LM Studio on Windows, macOS, or Linux operating systems. When you first run LM Studio, you will be prompted to choose a user profile. I chose the developer to enable all features. You can switch between these profiles using the selection available in the taskbar of LM Studio.\n","date":"2025-07-15","excerpt":"There are several options available for running Large Language Model (LLM) inference locally. LM Studio is one such option. It is more comprehensive and offers some great features.","permalink":"https://ravichaganti.com/blog/local-model-serving-using-lm-studio/","series":"Local LLM Serving","tags":null,"title":"Local model serving - Using LM Studio"},{"categories":["inferencing","local serving"],"content":"As an AI enthusiast, I always want quick access to large language models (LLMs) for experimenting with new tools and frameworks. We can always subscribe to cloud-hosted models such as OpenAI GPT or Anthropic Claude. However, these are expensive, and I prefer running a few models locally while still in the experimentation phase. Local execution also enables full customization and integration into local workflows, providing offline access and reduced latency for faster, more reliable responses. Additionally, it provides control over model updates and configurations, preventing disruptions caused by changes from cloud providers and enabling independent experimentation.\n","date":"2025-07-14","excerpt":"There are several options available for running Large Language Model (LLM) inference locally. Ollama is one such option and my favorite among all. Ollama offers access to a wide range of models and has recently enabled cloud-hosted models as well. It offers both CLI and GUI (chat interface) to interact with the loaded models.","permalink":"https://ravichaganti.com/blog/local-model-serving-using-ollama/","series":"Local LLM Serving","tags":null,"title":"Local model serving - Using Ollama"},{"categories":["autogen","azure-openai","python"],"content":"Microsoft released [version 0.5.1 of the AutoGen](Release python-v0.5.1 · microsoft/autogen) stable build last week, and I quickly reviewed the release notes to verify if there were any breaking changes to what I had been writing so far using AutoGen. There is code refactoring to change the structure of base types. This release provides enhanced support for structured output. When working directly with model clients, you can set to a Pydantic model. Here is an example from the release notes.\n","date":"2025-04-06","excerpt":"Know what went into AutoGen 0.5.1 -- the open framework for creating multi-agent systems.","permalink":"https://ravichaganti.com/blog/changes-in-autogen-release-0_5_1/","series":"AutoGen","tags":["azure","openai","python"],"title":"Changes in Autogen release 0.5.1"},{"categories":null,"content":"In today\u0026rsquo;s article, you will build upon what you learned in the earlier article about the basics of kro. To demonstrate a few more kro concepts, we will use the famous sample voting application.\nWhile not very complex, this application has enough moving parts to define dependencies. In this article, we shall look at the custom API needed to instantiate this voting application on Kubernetes. In this example, we must bring up the redis and db services as ClusterIP services before the vote and result services, which are NodePort type.\n","date":"2025-03-14","excerpt":"Extending what you learned in the previous article on the basics of kro, this article demonstrates a few more features of kro with the help of a sample voting application.","permalink":"https://ravichaganti.com/blog/kube-resource-orchestrator-kro-deploying-the-sample-voting-application/","series":"Kubernetes Resource Orchestrator","tags":["kubernetes","kro"],"title":"Kube Resource Orchestrator (KRO) - Deploying the sample voting application"},{"categories":null,"content":"Helm helps application developers and operators manage Kubernetes applications. It allows you to define, install, and upgrade Kubernetes applications. Helm uses a packaging format called charts, a collection of files describing a related set of Kubernetes resources. Other application packaging solutions, such as Kustomize, exist, but nothing comes close to the popularity Helm gained in the Cloud Native space. While Helm is certainly the most popular package manager, it comes with a few limitations. Helm does not offer an efficient dependency management solution. At deployment time, there is no way you can retrieve the dependent resource properties for subsequent resource deployment within the chart. Helm cannot handle custom resource definitions well. We must use values.yaml to supply custom values to the chart and its subcharts. This has no schema validation and, therefore, results in human errors at the time of deployment. Helm does not offer any post-deployment reconciliation support, which is important to ensure any drift in application configuration can be detected and corrected. Companies in the Cloud-native space have been looking at alternatives, and a new open-source project called kro may be that alternative.\n","date":"2025-03-09","excerpt":"Kube Resource Orchestrator (KRO) introduces a new Kubernetes-native and cloud-agnostic way to group Kubernetes resources.","permalink":"https://ravichaganti.com/blog/kube-resource-orchestrator-kro-the-basics/","series":"Kubernetes Resource Orchestrator","tags":["kubernetes","kro"],"title":"Kube Resource Orchestrator (KRO) - The Basics"},{"categories":["mcp","agents","python","azure"],"content":"The earlier article in this series introduced Anthropic\u0026rsquo;s Model Context Protocol. It presented an example of building a simple MCP server for use with the Claude desktop application. The hello-world example was a very basic implementation of an MCP server. In today\u0026rsquo;s article, we shall extend our knowledge of creating MCP servers to achieve more practical applications. We will build an MCP server to interact with Microsoft Azure resources.\nAnthropic made bootstrap MCP server development easy by providing the create-mcp-server package. To get started, you need to install this locally as a tool.\n","date":"2025-02-25","excerpt":"Extend knowledge of creating MCP servers to achieve more practical applications","permalink":"https://ravichaganti.com/blog/building-a-model-context-protocol-server-for-azure/","series":"Model Context Protocol","tags":["mcp","agents","python","azure"],"title":"Building a Model Context Protocol server for Azure"},{"categories":["autogen","azure-openai","python"],"content":"In the previous parts of this series on the Microsoft AutoGen framework, we looked at how to get started with the AutoGen framework. We examined the process of building a simple agent using the prebuilt AssistantAgent in AutoGen and explored the development of a multi-agent team.\nHowever, what is an agent in the context of AutoGen? How do agents communicate with each other? I needed answers to these questions before proceeding to the next step in using AutoGen to build larger, multi-agent applications. So, I started exploring the Core package upon which the autogen-chat is built. This article is a result of that exploration.\n","date":"2025-02-10","excerpt":"In the previous parts of this series on the Microsoft AutoGen framework, we looked at how to get started with the AutoGen framework. We examined the process of building a simple agent using the prebuilt AssistantAgent in AutoGen and explored the development of a multi-agent team.\nHowever, what is an agent in the context of AutoGen? How do agents communicate with each other? I needed answers to these questions before proceeding to the next step in using AutoGen to build larger, multi-agent applications. So, I started exploring the Core package upon which the autogen-chat is built. This article is a result of that exploration.\n","permalink":"https://ravichaganti.com/blog/understanding-agents-in-autogen-framework/","series":"AutoGen","tags":["azure","openai","python"],"title":"Understanding Agents in Microsoft AutoGen framework"},{"categories":["autogen","azure-openai","python"],"content":"In the previous article in this series on Microsoft AutoGen, we looked at how to get started with Microsoft AutoGen and create a simple agent. We built a weather agent capable of retrieving real-time weather data. Through this demonstration, we gained an understanding of the basics of implementing an agent using the AutoGen framework. In this article, we will examine the process of building a team of agents or a multi-agent team to achieve a slightly more complex goal. We will start this exploration by building a single-agent team. Yes, you read that correctly. AutoGen allows you to create a single-agent team. This is useful in running an agent in a loop until a goal is achieved.\n","date":"2025-02-05","excerpt":"In the previous article in this series on Microsoft AutoGen, we looked at how to get started with Microsoft AutoGen and create a simple agent. We built a weather agent capable of retrieving real-time weather data. Through this demonstration, we gained an understanding of the basics of implementing an agent using the AutoGen framework. In this article, we will examine the process of building a team of agents or a multi-agent team to achieve a slightly more complex goal. We will start this exploration by building a single-agent team. Yes, you read that correctly. AutoGen allows you to create a single-agent team. This is useful in running an agent in a loop until a goal is achieved.\n","permalink":"https://ravichaganti.com/blog/teams-of-agents-in-autogen/","series":"AutoGen","tags":["azure","openai","python"],"title":"Teams of agents in AutoGen"},{"categories":["mcp","agents","python"],"content":"A couple of months ago, Anthropic introduced and open-sourced the Model Context Protocol (MCP). MCP is the new standard for connecting AI models to external data sources and APIs more easily and consistently. With the advances in AI, models are becoming increasingly powerful in reasoning and quality. However, as text-completion machines, these models still lack access to real-time data. AI providers have worked around this using Retrieval Augmented Generation (RAG) and tool calling. Every data source requires custom implementation, and every provider has a way of integrating tools with AI models. MCP addresses these silos by providing a universal, open standard for connecting AI systems with data sources.\n","date":"2025-02-01","excerpt":"A couple of months ago, Anthropic introduced and open-sourced the Model Context Protocol (MCP). MCP is the new standard for connecting AI models to external data sources and APIs more easily and consistently. With the advances in AI, models are becoming increasingly powerful in reasoning and quality. However, as text-completion machines, these models still lack access to real-time data. AI providers have worked around this using Retrieval Augmented Generation (RAG) and tool calling. Every data source requires custom implementation, and every provider has a way of integrating tools with AI models. MCP addresses these silos by providing a universal, open standard for connecting AI systems with data sources.\n","permalink":"https://ravichaganti.com/blog/anthropic-model-context-protocol/","series":"Model Context Protocol","tags":["mcp","agents","python"],"title":"Model Context Protocol by Anthropic for connecting AI models to data"},{"categories":["autogen","azure-openai","python"],"content":"I have been closely following developments in the Agentic AI space. AutoGen from Microsoft Research is emerging as a powerful yet easy-to-use framework for building AI agents and applications. With their re-architected release (0.4.0), they have re-imagined building advanced AI applications. This release introduces an asynchronous, event-driven architecture.\n","date":"2025-01-30","excerpt":"I have been closely following developments in the Agentic AI space. AutoGen from Microsoft Research is emerging as a powerful yet easy-to-use framework for building AI agents and applications. With their re-architected release (0.4.0), they have re-imagined building advanced AI applications. This release introduces an asynchronous, event-driven architecture.\n","permalink":"https://ravichaganti.com/blog/getting-started-with-autogen-framework-for-building-ai-agents-and-applications/","series":"AutoGen","tags":["azure","openai","python"],"title":"Getting started with AutoGen framework for building AI agents and applications"},{"categories":["azure","openai","python"],"content":"Sometimes, you may want the LLM to perform only minimal changes to what is provided as a prompt. For example, you have a couple of paragraphs of text that you want the LLM to modify to ensure no spelling mistakes. You do not want the LLM to change the overall content, but make sure the misspellings are corrected. This usually helps in reducing the LLM response latency. This is useful in scenarios where you already know a large portion of the expected response and is well-suited for code completion and error detection scenarios. In this part of the series of articles on Azure OpenAI, we will use predicted outputs with Azure OpenAI to build AI applications.\n","date":"2025-01-10","excerpt":"Sometimes, you may want the LLM to perform only minimal changes to what is provided as a prompt. For example, you have a couple of paragraphs of text that you want the LLM to modify to ensure no spelling mistakes. You do not want the LLM to change the overall content, but make sure the misspellings are corrected. This usually helps in reducing the LLM response latency. This is useful in scenarios where you already know a large portion of the expected response and is well-suited for code completion and error detection scenarios. In this part of the series of articles on Azure OpenAI, we will use predicted outputs with Azure OpenAI to build AI applications.\n","permalink":"https://ravichaganti.com/blog/predicted-outputs-azure-openai/","series":"Azure OpenAI","tags":["azure","openai","python"],"title":"Predicted outputs in Azure OpenAI"},{"categories":["azure","openai","python"],"content":"We have learned to perform single- and multi-tool calling with the Azure OpenAI API for chat completions. This part of the series on Azure OpenAI will describe the parallel tool calling feature and how to implement it. Parallel tool calling allows you to perform multiple calls together. This enables parallel execution, result retrieval, and fewer calls to the LLM. Parallelizing tool calls improves overall performance.\nIn a previous example on retrieving weather at a given location, we examined how to iterate over the LLM response for tool calls and append it to the conversation history before making the next LLM API call.\n","date":"2024-08-20","excerpt":"We have learned to perform single- and multi-tool calling with the Azure OpenAI API for chat completions. This part of the series on Azure OpenAI will describe the parallel tool calling feature and how to implement it. Parallel tool calling allows you to perform multiple calls together. This enables parallel execution, result retrieval, and fewer calls to the LLM. Parallelizing tool calls improves overall performance.\nIn a previous example on retrieving weather at a given location, we examined how to iterate over the LLM response for tool calls and append it to the conversation history before making the next LLM API call.\n","permalink":"https://ravichaganti.com/blog/parallel-tool-calling-azure-openai/","series":"Azure OpenAI","tags":["azure","openai","python"],"title":"Parallel tool calling in Azure OpenAI"},{"categories":["azure","openai","python"],"content":"In this series, we have examined the basics of Azure Open AI, using the chat completions API, streaming responses, and finally, single and multi-tool calling. In today\u0026rsquo;s article, we will examine how to return structured output from the LLM response. We will first examine structured output without function calling and then update the earlier multi-function calling example to output JSON instead of text.\nStructured outputs tell an LLM to follow the schema represented by the response_format parameter of a request to the LLM. We can use Pydantic to build the schema.\n","date":"2024-08-18","excerpt":"In this series, we have examined the basics of Azure Open AI, using the chat completions API, streaming responses, and finally, single and multi-tool calling. In today\u0026rsquo;s article, we will examine how to return structured output from the LLM response. We will first examine structured output without function calling and then update the earlier multi-function calling example to output JSON instead of text.\nStructured outputs tell an LLM to follow the schema represented by the response_format parameter of a request to the LLM. We can use Pydantic to build the schema.\n","permalink":"https://ravichaganti.com/blog/structured-output-azure-openai/","series":"Azure OpenAI","tags":["azure","openai","python"],"title":"Structured output in Azure OpenAI"},{"categories":["azure","openai","python"],"content":"In the last article of this series, we learned about function/tool calling. Based on the prompt, the LLM indicates that we must call the get_weather tool. The LLM finally returns the answer to our prompt using the tool response. However, let us try to add a few more variables to our prompt. The updated prompt will be \u0026ldquo;What\u0026rsquo;s the weather like in Bengaluru next week?\u0026rdquo;.\n1 2 3 $ python .\\05_function_calling.py get_current_time called with location: Bengaluru The current temperature in Bengaluru is approximately 28.2°C. However, for next week\u0026#39;s weather prediction, you\u0026#39;d need a forecast service as I currently provide only current weather information. LLM uses the get_weather tool to determine the current weather but fails to determine next week\u0026rsquo;s weather. This is because we have not provided any tool for the LLM to determine what next week means. Determining the meaning of next week requires the knowledge of the current date and time. This article will demonstrate how to add multiple tool-calling capabilities to our program. With the updated script, you can receive the weather information for a specific date.\n","date":"2024-08-16","excerpt":"In the last article of this series, we learned about function/tool calling. Based on the prompt, the LLM indicates that we must call the get_weather tool. The LLM finally returns the answer to our prompt using the tool response. However, let us try to add a few more variables to our prompt. The updated prompt will be \u0026ldquo;What\u0026rsquo;s the weather like in Bengaluru next week?\u0026rdquo;.\n1 2 3 $ python .\\05_function_calling.py get_current_time called with location: Bengaluru The current temperature in Bengaluru is approximately 28.2°C. However, for next week\u0026#39;s weather prediction, you\u0026#39;d need a forecast service as I currently provide only current weather information. LLM uses the get_weather tool to determine the current weather but fails to determine next week\u0026rsquo;s weather. This is because we have not provided any tool for the LLM to determine what next week means. Determining the meaning of next week requires the knowledge of the current date and time. This article will demonstrate how to add multiple tool-calling capabilities to our program. With the updated script, you can receive the weather information for a specific date.\n","permalink":"https://ravichaganti.com/blog/azure-openai-function-calling-with-multiple-tools/","series":"Azure OpenAI","tags":["azure","openai","python"],"title":"Implementing multiple tool/function calling when using Azure OpenAI"},{"categories":["azure","openai","python"],"content":"In the last article of this series, we learned how to use the chat completion API. Towards the end, we learned that the LLMs have a knowledge cut-off date and no real-time access to information. However, this can be bridged using the tool/function calling feature of Azure OpenAI service. In this article, we shall learn how to implement tool calling.\nAzure OpenAI\u0026rsquo;s function calling capability lets you connect your language models to external tools and APIs, enabling them to perform a wider range of tasks and access real-time information. This opens up a world of possibilities, allowing your models to interact with the real world in ways never imagined.\n","date":"2024-08-12","excerpt":"In the last article of this series, we learned how to use the chat completion API. Towards the end, we learned that the LLMs have a knowledge cut-off date and no real-time access to information. However, this can be bridged using the tool/function calling feature of Azure OpenAI service. In this article, we shall learn how to implement tool calling.\nAzure OpenAI\u0026rsquo;s function calling capability lets you connect your language models to external tools and APIs, enabling them to perform a wider range of tasks and access real-time information. This opens up a world of possibilities, allowing your models to interact with the real world in ways never imagined.\n","permalink":"https://ravichaganti.com/blog/azure-openai-function-calling/","series":"Azure OpenAI","tags":["azure","openai","python"],"title":"Implementing tool/function calling when using Azure OpenAI"},{"categories":["azure","openai","python"],"content":"So far in this series, we have looked at the Azure OpenAI completion API, which generates a response for a given prompt. This is a legacy API, and using the chat completion API is recommended. We can build conversational chatbots and similar applications with the chat completion API. This article will examine how to use the Azure OpenAI chat completion API. In the earlier articles, we used the client.completions.create() function to generate a response. We need to use the client.chat.completions.create() in the openai library to build a conversation with the LLM.\n","date":"2024-08-08","excerpt":"So far in this series, we have looked at the Azure OpenAI completion API, which generates a response for a given prompt. This is a legacy API, and using the chat completion API is recommended. We can build conversational chatbots and similar applications with the chat completion API. This article will examine how to use the Azure OpenAI chat completion API. In the earlier articles, we used the client.completions.create() function to generate a response. We need to use the client.chat.completions.create() in the openai library to build a conversation with the LLM.\n","permalink":"https://ravichaganti.com/blog/using-chat-completion-api-azure-openai/","series":"Azure OpenAI","tags":["azure","openai","python"],"title":"Using chat completion API in Azure OpenAI"},{"categories":["azure","openai","python"],"content":"Responses are streamed to the user interface as they are generated using ChatGPT and similar tools. This eliminates the need for the user to wait until the complete response is generated. In today\u0026rsquo;s article, we shall look at streaming LLM-generated responses when using Azure OpenAI API in Python. In the earlier part of this series, we learned about the client.completions.create() function used to send a prompt to the LLM and retrieve one or more responses. This function supports a parameter called stream when set to True, asks LLM to stream the response as it gets generated. The way to handle this response is a bit different from a standard completion response.\n","date":"2024-08-04","excerpt":"Responses are streamed to the user interface as they are generated using ChatGPT and similar tools. This eliminates the need for the user to wait until the complete response is generated. In today\u0026rsquo;s article, we shall look at streaming LLM-generated responses when using Azure OpenAI API in Python. In the earlier part of this series, we learned about the client.completions.create() function used to send a prompt to the LLM and retrieve one or more responses. This function supports a parameter called stream when set to True, asks LLM to stream the response as it gets generated. The way to handle this response is a bit different from a standard completion response.\n","permalink":"https://ravichaganti.com/blog/streaming-completions-azure-openai/","series":"Azure OpenAI","tags":["azure","openai","python"],"title":"Streaming model responses when using Azure OpenAI"},{"categories":["azure","openai","python"],"content":"Generative AI and OpenAI should not be alien anymore. Several startups are already riding this new wave and creating stunning applications that solve several important use cases. I use GenAI regularly to learn and become more efficient in coding. GitHub Copilot has been a good friend. I experimented with creating Large Language Model (LLM) applications using different providers (OpenAI and Google Gemini) and in different programming languages. OpenAI provides client libraries that can be used with any provider that offers an OpenAI-compatible API. For example, we can use the OpenAI Python library to work with OpenAI and Azure OpenAI services.\n","date":"2024-08-01","excerpt":"Generative AI and OpenAI should not be alien anymore. Several startups are already riding this new wave and creating stunning applications that solve several important use cases. I use GenAI regularly to learn and become more efficient in coding. GitHub Copilot has been a good friend. I experimented with creating Large Language Model (LLM) applications using different providers (OpenAI and Google Gemini) and in different programming languages. OpenAI provides client libraries that can be used with any provider that offers an OpenAI-compatible API. For example, we can use the OpenAI Python library to work with OpenAI and Azure OpenAI services.\n","permalink":"https://ravichaganti.com/blog/getting-started-with-azure-openai/","series":"Azure OpenAI","tags":["azure","openai","python"],"title":"Getting started with Azure OpenAI"},{"categories":null,"content":"Containers changed the way we develop, package, and distribute applications. This helped teams accelerate development and ensure their code worked consistently across different environments and infrastructures. To a large extent, this enabled write once and run anywhere. Docker made this easy by providing tools to create, manage, and package application code and dependencies as images. We could run a container instance from that image wherever a container runtime exists. Standardizing image and runtime formats helped ensure we could take an image and run it anywhere and not worry about the underlying infrastructure. This also led to the proliferation of microservices-based application architectures, where an application comprises several services running within containers to deliver the expected functionality. Most cloud-native and modern application architectures use microservices to implement the necessary functionality. When developing an application with multiple microservice dependencies, a developer must ensure the development environment is suitably set up to handle all required dependencies.\n","date":"2024-02-03","excerpt":"Development containers are a great way to develop modern applications. Cloud-native applications usually implement more than one service to provide the application functionality. Using dev containers for microservices-based application development requires more than one container. This is where using Docker Compose with dev containers is useful. This article explores creating a multi-container development environment using VS Code dev containers and Docker Compose.","permalink":"https://ravichaganti.com/blog/devcontainers-for-cloud-native-application-development/","series":"Containers","tags":["cloud-native","containers","docker","docker-compose"],"title":"Devcontainers for cloud-native application development"},{"categories":null,"content":"Azure Red Hat OpenShift (ARO) service provides fully managed and highly available OpenShift clusters on Azure jointly operated by Microsoft and Red Hat. There are different ways to provision an ARO cluster.\nAzure Portal Azure CLI or Azure PowerShell Azure Resource Manager (ARM) / Bicep templates Red Hat Advanced Cluster Management (RHACM) This article will explore using Bicep language to provision an ARO cluster.\nExamples in this article use Azure CLI for interacting with Azure resources and deployments.\n","date":"2023-12-01","excerpt":"Bicep simplifies provisioning Azure Red Hat OpenShift clusters. This article explains how!","permalink":"https://ravichaganti.com/blog/using-bicep-to-provision-azure-red-hat-openshift-cluster/","series":"Azure Bicep","tags":["cloud-native","learning","red hat","azure"],"title":"Using Bicep to provision Azure Red Hat OpenShift cluster"},{"categories":["azure","go"],"content":"So far in this series, you learned how to use different types of credentials that the Azure SDK for Go offers. You used specific credential types to authenticate with Azure in all the examples. You use a set of credential types for the development environment and a different set for production use cases. However, what if you want to use the code unmodified between development and production? What if you must test the code that uses managed identity credentials locally where the type of credentials you must use are different? This is where credential chaining comes to the rescue.\n","date":"2023-08-16","excerpt":"So far in this series, you learned how to use different types of credentials that the Azure SDK for Go offers. You used specific credential types to authenticate with Azure in all the examples. You use a set of credential types for the development environment and a different set for production use cases. However, what if you want to use the code unmodified between development and production? What if you must test the code that uses managed identity credentials locally where the type of credentials you must use are different? This is where credential chaining comes to the rescue.\n","permalink":"https://ravichaganti.com/blog/azure-sdk-for-go-authentication-methods-chained-credentials/","series":"Azure Go","tags":["azure","go"],"title":"Azure SDK for Go - Authentication methods - Chained Credentials"},{"categories":["azure","go"],"content":"When you have applications or services that run in the Azure cloud infrastructure and require access to Azure services, the best way to authenticate to Azure is to use the managed identity. Using managed identity, you can eliminate the need to manage artifacts such as secrets, certificates, and credentials. For example, if you need to access Azure Key Vault to retrieve an API key for authentication purposes. To do this, you must first authenticate to the Key Vault service. With managed identity, you get automatically authenticated.\n","date":"2023-08-08","excerpt":"When you have applications or services that run in the Azure cloud infrastructure and require access to Azure services, the best way to authenticate to Azure is to use the managed identity. Using managed identity, you can eliminate the need to manage artifacts such as secrets, certificates, and credentials. For example, if you need to access Azure Key Vault to retrieve an API key for authentication purposes. To do this, you must first authenticate to the Key Vault service. With managed identity, you get automatically authenticated.\n","permalink":"https://ravichaganti.com/blog/azure-sdk-for-go-authentication-methods-managed-identity-credential/","series":"Azure Go","tags":["azure","go"],"title":"Azure SDK for Go - Authentication methods - Managed Identity Credential"},{"categories":["azure","go"],"content":"In the last part of this series, you learned how to use different credential types in a local development environment. Another method you can use within local development and in a hosted/deployed service is providing credentials through environment variables. This is done using the NewEnvironmentCredential() method in the azidentity package.\n1 2 3 4 5 // github.com/rchaganti/azure-go/02-auth101/envCredential.go cred, err := azidentity.NewEnvironmentCredential(nil) if err != nil { log.Fatal(err) } This credential type supports multiple types of authentication in the following order.\n","date":"2023-07-18","excerpt":"In the last part of this series, you learned how to use different credential types in a local development environment. Another method you can use within local development and in a hosted/deployed service is providing credentials through environment variables. This is done using the NewEnvironmentCredential() method in the azidentity package.\n1 2 3 4 5 // github.com/rchaganti/azure-go/02-auth101/envCredential.go cred, err := azidentity.NewEnvironmentCredential(nil) if err != nil { log.Fatal(err) } This credential type supports multiple types of authentication in the following order.\n","permalink":"https://ravichaganti.com/blog/azure-sdk-for-go-authentication-methods-environmental-credential/","series":"Azure Go","tags":["azure","go"],"title":"Azure SDK for Go - Authentication methods - Environmental credential"},{"categories":["azure","go"],"content":"The earlier article introduced you to the Azure SDK for Go. In the example towards the end of that article, you may have noticed how the NewAzureCLICredential method of the azidentity package was used to access locally available Azure CLI credentials. This is perfect for local development and is not recommended for production environments. The Azure SDK supports different types of credentials depending on where your Go code is running. In this article in the Azure SDK for Go series, you will learn about each of these credential types and when you use each of these credentials.\n","date":"2023-07-15","excerpt":"The earlier article introduced you to the Azure SDK for Go. In the example towards the end of that article, you may have noticed how the NewAzureCLICredential method of the azidentity package was used to access locally available Azure CLI credentials. This is perfect for local development and is not recommended for production environments. The Azure SDK supports different types of credentials depending on where your Go code is running. In this article in the Azure SDK for Go series, you will learn about each of these credential types and when you use each of these credentials.\n","permalink":"https://ravichaganti.com/blog/azure-sdk-for-go-authentication-methods-for-local-dev-environment/","series":"Azure Go","tags":["azure","go"],"title":"Azure SDK for Go - Authentication methods for local development environment"},{"categories":["azure","go"],"content":"Microsoft Azure provides vast services from basic computing to AI/ML. Azure Resource Manager (ARM) is our entry point to access and manage these services and provides a consistent management layer (APIs) that enables you to work with resources in Azure.\n","date":"2023-07-13","excerpt":"Microsoft Azure provides vast services from basic computing to AI/ML. Azure Resource Manager (ARM) is our entry point to access and manage these services and provides a consistent management layer (APIs) that enables you to work with resources in Azure.\n","permalink":"https://ravichaganti.com/blog/2023-07-13-getting-started-with-azure-sdk-for-go/","series":"Azure Go","tags":["azure","go"],"title":"Getting Started with Azure SDK for Go"},{"categories":["powershell"],"content":"I work on a team with members across multiple time zones. It is important to schedule meetings so that team members do not have to stay late or wake up early. Being a command line person, I quickly wrote this PowerShell script to help me determine the time differences.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 param ( [Parameter(Mandatory = $true)] [String[]] $Timezone, [Parameter()] [Datetime] $Target ) if (!$Target) { # Get the local time as the target $Target = Get-Date } $tzObject = [System.Collections.Arraylist]::new() $tzObject.Add( [PSCustomObject]@{ \u0026#39;Timezone\u0026#39; = \u0026#39;Local\u0026#39; \u0026#39;Time\u0026#39; = $Target \u0026#39;DifferenceInHours\u0026#39; = 0 } ) | Out-Null foreach ($tz in $Timezone) { # Get the timezone difference $localTz = [System.TimeZoneInfo]::Local $remoteTz = [System.TimeZoneInfo]::FindSystemTimeZoneById($tz) $tzDifference = [float]($remoteTz.BaseUtcOffset.TotalHours - $localTz.BaseUtcOffset.TotalHours) $remoteTime = [System.TimeZoneInfo]::ConvertTime($Target, $localTz, $remoteTz) $tzObject.Add( [PSCustomObject]@{ \u0026#39;Timezone\u0026#39; = $tz \u0026#39;Time\u0026#39; = $remoteTime \u0026#39;DifferenceInHours\u0026#39; = $tzDifference } ) | Out-Null } return $tzObject This one is simple to use.\n","date":"2023-03-20","excerpt":"I work on a team with members across multiple time zones. It is important to schedule meetings so that team members do not have to stay late or wake up early. Being a command line person, I quickly wrote this PowerShell script to help me determine the time differences.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 param ( [Parameter(Mandatory = $true)] [String[]] $Timezone, [Parameter()] [Datetime] $Target ) if (!$Target) { # Get the local time as the target $Target = Get-Date } $tzObject = [System.Collections.Arraylist]::new() $tzObject.Add( [PSCustomObject]@{ \u0026#39;Timezone\u0026#39; = \u0026#39;Local\u0026#39; \u0026#39;Time\u0026#39; = $Target \u0026#39;DifferenceInHours\u0026#39; = 0 } ) | Out-Null foreach ($tz in $Timezone) { # Get the timezone difference $localTz = [System.TimeZoneInfo]::Local $remoteTz = [System.TimeZoneInfo]::FindSystemTimeZoneById($tz) $tzDifference = [float]($remoteTz.BaseUtcOffset.TotalHours - $localTz.BaseUtcOffset.TotalHours) $remoteTime = [System.TimeZoneInfo]::ConvertTime($Target, $localTz, $remoteTz) $tzObject.Add( [PSCustomObject]@{ \u0026#39;Timezone\u0026#39; = $tz \u0026#39;Time\u0026#39; = $remoteTime \u0026#39;DifferenceInHours\u0026#39; = $tzDifference } ) | Out-Null } return $tzObject This one is simple to use.\n","permalink":"https://ravichaganti.com/blog/2023-03-20-determining-time-zone-differences-in-powershell-for-effective-meeting-planning/","series":"PowerShell","tags":["powershell"],"title":"Determining time zone differences in PowerShell for effective meeting planning"},{"categories":["wasm","vscode"],"content":"WebAssembly, a.k.a Wasm, defines a portable binary-code format for a stack-based virtual machine. Wasm enables developers to write code that runs in web browsers with near-native performance using languages such as C, C++, Rust, Go, and many other modern languages. Wasm is not a replacement for JavaScript but is designed to complement and run alongside JavaScript.\nI am still learning about Wasm and looking at opportunities to use Wasm in designing modern and cloud-native applications. My focus has been using the Go programming language for Wasm as well. So, when I started learning Wasm, I quickly looked for ways to create a development environment that would help me in my journey toward mastering Wasm. For this, I started looking at VS Code development containers. This resulted in a set of devcontainer features that I can use within a development container definition.\n","date":"2023-01-12","excerpt":"WebAssembly, a.k.a Wasm, defines a portable binary-code format for a stack-based virtual machine. Wasm enables developers to write code that runs in web browsers with near-native performance using languages such as C, C++, Rust, Go, and many other modern languages. Wasm is not a replacement for JavaScript but is designed to complement and run alongside JavaScript.\nI am still learning about Wasm and looking at opportunities to use Wasm in designing modern and cloud-native applications. My focus has been using the Go programming language for Wasm as well. So, when I started learning Wasm, I quickly looked for ways to create a development environment that would help me in my journey toward mastering Wasm. For this, I started looking at VS Code development containers. This resulted in a set of devcontainer features that I can use within a development container definition.\n","permalink":"https://ravichaganti.com/blog/2023-01-12-webassembly-learning-playground-in-vs-code/","series":"Wasm","tags":["wasm","vscode"],"title":"WebAssembly (wasm) learning playground in VS Code"},{"categories":["Golang","Go","Cobra"],"content":" Practice makes permanent - Bobby Robson.\nWhen learning a new programming language or any technology for that matter, we need to practice what we learn, and that is when it becomes permanent. I am starting a new series of posts to share what I have tried or built, so that what I have learned— through Go programming books, video courses, and community content—stays with me permanently.\nThe first one in this series is about using Cobra package to build a CLI application.\n","date":"2022-12-16","excerpt":" Practice makes permanent - Bobby Robson.\nWhen learning a new programming language or any technology for that matter, we need to practice what we learn, and that is when it becomes permanent. I am starting a new series of posts to share what I have tried or built, so that what I have learned— through Go programming books, video courses, and community content—stays with me permanently.\nThe first one in this series is about using Cobra package to build a CLI application.\n","permalink":"https://ravichaganti.com/blog/2022-12-16-applied-go-creating-a-cli-application/","series":"Applied Go","tags":["Golang","Go","Cobra"],"title":"Applied Go - Creating a CLI application"},{"categories":["sigstore","gitsign","containers"],"content":"Once a Sigstore fan, always a fan!\nSigstore has become a good part of my research around SBOM and supply-chain security. I wrote about a cosign VS Code devcontainer feature earlier and then stumbled upon gitsign. In the past, I tried using GPG keys to sign my git commits but could not really sustain that as I kept changing machines and using different development environments. When I first looked at cosign, my initial thought was using it also for git commit signing but as I started reading Sigstore documentation, I discovered gitsign!\n","date":"2022-12-13","excerpt":"Once a Sigstore fan, always a fan!\nSigstore has become a good part of my research around SBOM and supply-chain security. I wrote about a cosign VS Code devcontainer feature earlier and then stumbled upon gitsign. In the past, I tried using GPG keys to sign my git commits but could not really sustain that as I kept changing machines and using different development environments. When I first looked at cosign, my initial thought was using it also for git commit signing but as I started reading Sigstore documentation, I discovered gitsign!\n","permalink":"https://ravichaganti.com/blog/2022-12-13-keyless-git-commit-signing-using-sigstore-gitsign-in-a-vscode-devcontainer/","series":null,"tags":["sigstore","gitsign","containers"],"title":"Keyless git commit signing using Sigstore gitsign in a VS Code devcontainer"},{"categories":["sigstore","cosign","containers"],"content":"For those following me here or social media will know that I am a big fan of Visual Studio development containers. I wrote a bit about Visual Studio Code development containers. I have been using devcontainers for different development environments extensively. I have a sample repo on GitHub that has all devcontainer definitions that I have been using for different projects. A latest addition to this list is the Sigstore cosign devcontainer feature.\n","date":"2022-12-12","excerpt":"For those following me here or social media will know that I am a big fan of Visual Studio development containers. I wrote a bit about Visual Studio Code development containers. I have been using devcontainers for different development environments extensively. I have a sample repo on GitHub that has all devcontainer definitions that I have been using for different projects. A latest addition to this list is the Sigstore cosign devcontainer feature.\n","permalink":"https://ravichaganti.com/blog/2022-12-12-sigstore-cosign-dev-container-feature/","series":null,"tags":["sigstore","cosign","containers"],"title":"Sigstore Cosign VS Code development container feature"},{"categories":["oci","containers"],"content":"In a couple of earlier articles, we looked at Linux constructs used in building container images and the OCI image specification which standardizes the container image format. It is now time to understand how we can create container images. Knowing this is important to optimize the image size and building secure container images. And, of course, this knowledge also helps us appreciate what tools like Docker CLI or Buildah among many others help us achieve. There are many tools to build container images. We shall look at each of these methods in-depth in later parts of this series of articles on container images. For today, we will look into building container images using no tools! Actually, just using built-in OS tools.\n","date":"2022-11-28","excerpt":"In a couple of earlier articles, we looked at Linux constructs used in building container images and the OCI image specification which standardizes the container image format. It is now time to understand how we can create container images. Knowing this is important to optimize the image size and building secure container images. And, of course, this knowledge also helps us appreciate what tools like Docker CLI or Buildah among many others help us achieve. There are many tools to build container images. We shall look at each of these methods in-depth in later parts of this series of articles on container images. For today, we will look into building container images using no tools! Actually, just using built-in OS tools.\n","permalink":"https://ravichaganti.com/blog/2022-11-28-building-container-images-using-no-tools/","series":"Container Images","tags":["oci","containers"],"title":"Building container images - using no tools"},{"categories":["azure","Kubernetes","azure bicep"],"content":"In an earlier article, I wrote about provisioning a virtual Kubernetes cluster with kubeadm](https://ravichaganti.com/blog/2022-11-13-installing-and-configuring-kubernetes-cluster-using-kubeadm-on-ubuntu/). I use this method on a laptop with limited resources. This is good to a large extent but not good enough when I want to scale my experiments and learning. This is where I began planning my Kubernetes lab on Azure. I needed something I could spin quickly with no manual intervention. Given my interest in the Bicep language, I naturally wrote a Bicep template to perform this deployment.\n","date":"2022-11-26","excerpt":"In an earlier article, I wrote about provisioning a virtual Kubernetes cluster with kubeadm](https://ravichaganti.com/blog/2022-11-13-installing-and-configuring-kubernetes-cluster-using-kubeadm-on-ubuntu/). I use this method on a laptop with limited resources. This is good to a large extent but not good enough when I want to scale my experiments and learning. This is where I began planning my Kubernetes lab on Azure. I needed something I could spin quickly with no manual intervention. Given my interest in the Bicep language, I naturally wrote a Bicep template to perform this deployment.\n","permalink":"https://ravichaganti.com/blog/2022-11-26-fully-automated-kubernetes-cluster-deployment-on-azure-in-under-8-minutes/","series":"Azure Bicep","tags":["azure","Kubernetes","azure bicep"],"title":"Fully automated Kubernetes cluster deployment on Azure in under 8 minutes"},{"categories":null,"content":"In an earlier article, I had written about provisioning a virtual Kubernetes cluster using kubeadm. I use this method on a laptop with limited resources. This is good to a large extent but not good enough when I want to scale my experiments and learning. This is where I started looking at creating my Kubernetes lab on Azure. I needed something that could spin fast and without manual intervention. Given my interest in the Bicep language, I wrote a Bicep template to perform this deployment.\n","date":"2022-11-26","excerpt":"Kubeadm is the go to tool for Kubernetes administrators. Understand how to use this tool combined with Bicep to provision a virtualized K8s cluster.","permalink":"https://ravichaganti.com/blog/fully-automated-kubernetes-cluster-deployment-on-azure-in-under-8-minutes/","series":"Azure Bicep","tags":["kubernetes","azure","bicep"],"title":"Fully Automated Kubernetes Cluster Deployment on Azure in Under 8 Minutes"},{"categories":["kubernetes","cloudnative"],"content":"This article is more like a note to myself, but this may help if you are looking at configuring a Kubernetes cluster on Ubuntu.\nThere are many ways to install and configure Kubernetes cluster for learning and development purposes. You can use Docker Desktop or Rancher Desktop or https://podman-desktop.io/ or minikube or microk8s to create a single node cluster for your development work quickly. I am a big fan of Docker Desktop and use that for any quick experiments. However, I need a multi-node cluster with additional services for anything more than simple deployment. I use Ubuntu virtual machines and configure a Kubernetes cluster using kubeadm.\n","date":"2022-11-13","excerpt":"This article is more like a note to myself, but this may help if you are looking at configuring a Kubernetes cluster on Ubuntu.\nThere are many ways to install and configure Kubernetes cluster for learning and development purposes. You can use Docker Desktop or Rancher Desktop or https://podman-desktop.io/ or minikube or microk8s to create a single node cluster for your development work quickly. I am a big fan of Docker Desktop and use that for any quick experiments. However, I need a multi-node cluster with additional services for anything more than simple deployment. I use Ubuntu virtual machines and configure a Kubernetes cluster using kubeadm.\n","permalink":"https://ravichaganti.com/blog/2022-11-13-installing-and-configuring-kubernetes-cluster-using-kubeadm-on-ubuntu/","series":"Kubernetes","tags":["kubernetes","cloudnative"],"title":"Installing and Configuring Kubernetes cluster using kubeadm on Ubuntu"},{"categories":null,"content":"There are many ways to install and configure a Kubernetes cluster for learning and development purposes. We can use Docker Desktop, Rancher Desktop, Podman Desktop, minikube, or microk8s to quickly create a single-node cluster for our development work. These are good for quick development work but not so much when we need a multi-node cluster with additional services. For such a scenario, we can use virtual machines and configure a Kubernetes cluster using kubeadm.\nThis article examines the steps necessary to set up a virtual Kubernetes cluster.\n","date":"2022-11-13","excerpt":"Kubeadm is a handy tool to configure Kubernetes clusters. This article explains how to create a K8s cluster using Ubuntu VMs.","permalink":"https://ravichaganti.com/blog/installing-and-configuring-kubernetes-cluster-using-kubeadm-on-ubuntu/","series":"Kubernetes","tags":["kubernetes","ubuntu","kubeadm"],"title":"Installing and Configuring Kubernetes Cluster using Kubeadm on Ubuntu"},{"categories":["aci","containers","Azure","Bicep"],"content":"In the previous article, we looked at getting started with Azure Container Instances service, learned some basic concepts of ACI, and saw an example of provisioning a hello-world application. In this article, we shall extend this knowledge by provisioning a multi-container application to ACI using Bicep templates. You can also use a YAML method of provisioning multi-container applications to ACI. We shall look at this later.\nAs we learned earlier, a container group resembles a Kubernetes pod. The containers within the group share resources such as network and storage. The resource usage of containers can be controlled at the container group level. As a general rule of thumb, we should group containers with similar lifecycle and resource requirements into a container group. The multi-container groups are available for Linux containers only at the moment. Based on the region, there will be additional restrictions in terms of resource allocation.\n","date":"2022-11-03","excerpt":"In the previous article, we looked at getting started with Azure Container Instances service, learned some basic concepts of ACI, and saw an example of provisioning a hello-world application. In this article, we shall extend this knowledge by provisioning a multi-container application to ACI using Bicep templates. You can also use a YAML method of provisioning multi-container applications to ACI. We shall look at this later.\nAs we learned earlier, a container group resembles a Kubernetes pod. The containers within the group share resources such as network and storage. The resource usage of containers can be controlled at the container group level. As a general rule of thumb, we should group containers with similar lifecycle and resource requirements into a container group. The multi-container groups are available for Linux containers only at the moment. Based on the region, there will be additional restrictions in terms of resource allocation.\n","permalink":"https://ravichaganti.com/blog/2022-11-03-understanding-and-using-azure-container-instances-service-multi-container-apps-using-bicep/","series":"Containers","tags":["aci","containers","Azure","Bicep"],"title":"Understanding and using Azure Container Instances service - Multi-container Applications using Bicep"},{"categories":["aci","containers","Azure","Bicep"],"content":"In an earlier article, we looked at different containerization options in Microsoft Azure. In today\u0026rsquo;s article, we shall start with Azure Container Instances (ACI) and learn the fundamentals. In a later article, we will learn how to perform multi-container applications to ACI.\nAzure Container Instances Azure Container Instances (ACI) service offers a quick and easy way to run containers in the Microsoft Azure cloud. It is as simple as running a container locally using the Docker engine. ACI does not provide full container orchestration. ACI is great for applications that require faster startup times and hassle-free management. ACI runs inside Azure VMs and therefore provides isolation enabled by virtualization.\n","date":"2022-11-02","excerpt":"In an earlier article, we looked at different containerization options in Microsoft Azure. In today\u0026rsquo;s article, we shall start with Azure Container Instances (ACI) and learn the fundamentals. In a later article, we will learn how to perform multi-container applications to ACI.\nAzure Container Instances Azure Container Instances (ACI) service offers a quick and easy way to run containers in the Microsoft Azure cloud. It is as simple as running a container locally using the Docker engine. ACI does not provide full container orchestration. ACI is great for applications that require faster startup times and hassle-free management. ACI runs inside Azure VMs and therefore provides isolation enabled by virtualization.\n","permalink":"https://ravichaganti.com/blog/2022-11-02-understanding-and-using-azure-container-instances-service-the-basics/","series":"Containers","tags":["aci","containers","Azure","Bicep"],"title":"Understanding and using Azure Container Instances service - The Basics"},{"categories":["oci","containers","Azure"],"content":"Containerization is everywhere \u0026ndash; from on-premises data centers to the edge and in the cloud. We have been using containers right from development to production. I wrote about VS Code development containers and how I have standardized my development environment using devcontainers. There are several options for companies to run containerized applications in production. we can run individual application containers on a container host using engines like Docker. We can use tools like Docker Compose or Swarm for slightly complex multi-container, multi-host environments. However, it becomes complex to manage such environments. This needs us to implement a physical or virtualized server environment and handle all operational overhead associated with running our data center.\n","date":"2022-11-01","excerpt":"Containerization is everywhere \u0026ndash; from on-premises data centers to the edge and in the cloud. We have been using containers right from development to production. I wrote about VS Code development containers and how I have standardized my development environment using devcontainers. There are several options for companies to run containerized applications in production. we can run individual application containers on a container host using engines like Docker. We can use tools like Docker Compose or Swarm for slightly complex multi-container, multi-host environments. However, it becomes complex to manage such environments. This needs us to implement a physical or virtualized server environment and handle all operational overhead associated with running our data center.\n","permalink":"https://ravichaganti.com/blog/2022-11-01-containerization-in-azure/","series":"Azure","tags":["oci","containers","Azure"],"title":"Containerization in Microsoft Azure"},{"categories":["oci","containers","Azure","Azure Bicep"],"content":"In the previous articles in this series, we looked at how to build container images and understand the OCI image specification that governs how the images are built and dealt with. Once the images are built, we may want to push them to a central repository for sharing with a larger community or a private container registry such as the Azure Container Registry (ACR).\nIn today\u0026rsquo;s article, we shall learn how to create an Azure Container Registry, push an image, and consume it back in the local environment. Let\u0026rsquo;s start!\n","date":"2022-10-29","excerpt":"In the previous articles in this series, we looked at how to build container images and understand the OCI image specification that governs how the images are built and dealt with. Once the images are built, we may want to push them to a central repository for sharing with a larger community or a private container registry such as the Azure Container Registry (ACR).\nIn today\u0026rsquo;s article, we shall learn how to create an Azure Container Registry, push an image, and consume it back in the local environment. Let\u0026rsquo;s start!\n","permalink":"https://ravichaganti.com/blog/2022-10-29-publish-container-images-to-azure-container-registry/","series":"Container images","tags":["oci","containers","Azure Container Registry","Azure Bicep"],"title":"Publish container images to Azure Container Registry"},{"categories":["oci","containers"],"content":"In the previous article, we looked at how OverlayFS is used to work with container images. We learned how the image layers are associated with each other and how the copy-on-write layer gets created when a containers gets created from an image. Container registries such as Docker Hub and Quay offer container images for several popular applications and you can publish your images as well. There are different tools available to build and push images to container registries. Whatever container engine you use \u0026ndash; Docker or Podman \u0026ndash; you can simply pull the image [built using any tool] from the registry and use it. How is this interoperability made possible? The answer is the work Open Container Initiative (OCI) is doing.\n","date":"2022-10-28","excerpt":"In the previous article, we looked at how OverlayFS is used to work with container images. We learned how the image layers are associated with each other and how the copy-on-write layer gets created when a containers gets created from an image. Container registries such as Docker Hub and Quay offer container images for several popular applications and you can publish your images as well. There are different tools available to build and push images to container registries. Whatever container engine you use \u0026ndash; Docker or Podman \u0026ndash; you can simply pull the image [built using any tool] from the registry and use it. How is this interoperability made possible? The answer is the work Open Container Initiative (OCI) is doing.\n","permalink":"https://ravichaganti.com/blog/2022-10-28-understanding-container-images-oci-image-specification/","series":"Container images","tags":["oci","containers"],"title":"Understanding container images - OCI image specification"},{"categories":["oci","containers"],"content":"Containers have been around for a while. There is no need for an introduction to containers anymore but If you are still looking for some background, you can read a series of articles I have written on this blog. Docker simplified working with containers by introducing a way to package your applications and application dependencies as container images. It also provided the tooling that made running container instances from these images easy. This meant the user space tools abstracted all complex details and removed the need to know the inner workings of containers. Like every other technology, knowing the internals of how something is built becomes important when troubleshooting issues or optimizing what the technology does. And, of course, knowing / learning internals is fun too!\n","date":"2022-10-18","excerpt":"Containers have been around for a while. There is no need for an introduction to containers anymore but If you are still looking for some background, you can read a series of articles I have written on this blog. Docker simplified working with containers by introducing a way to package your applications and application dependencies as container images. It also provided the tooling that made running container instances from these images easy. This meant the user space tools abstracted all complex details and removed the need to know the inner workings of containers. Like every other technology, knowing the internals of how something is built becomes important when troubleshooting issues or optimizing what the technology does. And, of course, knowing / learning internals is fun too!\n","permalink":"https://ravichaganti.com/blog/2022-10-18-understanding-container-images-the-fundamentals/","series":"Container images","tags":["oci","containers"],"title":"Understanding container images - The fundamentals"},{"categories":["cuelang","vscode","containers"],"content":"In an earlier article, I wrote a bit about Visual Studio Code development containers. I have been using devcontainers for different development environments extensively. This is helping me keep the environment consistent and helps me rebuild an environment from scratch almost instantly. I use dev containers for all my Go language, Python, Rust, and now CUE language learning and development work. You can find all my dev container definition in a sample repository I created on GitHub.\n","date":"2022-10-10","excerpt":"In an earlier article, I wrote a bit about Visual Studio Code development containers. I have been using devcontainers for different development environments extensively. This is helping me keep the environment consistent and helps me rebuild an environment from scratch almost instantly. I use dev containers for all my Go language, Python, Rust, and now CUE language learning and development work. You can find all my dev container definition in a sample repository I created on GitHub.\n","permalink":"https://ravichaganti.com/blog/2022-10-10-cue-lang-dev-container-feature/","series":null,"tags":["cuelang","vscode","containers"],"title":"CUE language VS Code development container feature"},{"categories":["book","azure","bicep"],"content":"Finally! I published the final chapter in my book Azure Bicep - Zero to Hero today. I started this project more than a year ago with an intention that I will complete it before end of year 2021. However, a few personal life events made me shift focus to my family and that pushed the book timelines to the right. In the last few weeks, I spent good amount of my personal time to explore a few new areas within Bicep and formed the content for the last few chapters.\n","date":"2022-07-09","excerpt":"Finally! I published the final chapter in my book Azure Bicep - Zero to Hero today. I started this project more than a year ago with an intention that I will complete it before end of year 2021. However, a few personal life events made me shift focus to my family and that pushed the book timelines to the right. In the last few weeks, I spent good amount of my personal time to explore a few new areas within Bicep and formed the content for the last few chapters.\n","permalink":"https://ravichaganti.com/blog/2022-07-09-azure-bicep-zero-to-hero-s-complete/","series":"Azure Bicep","tags":["book","azure","bicep"],"title":"[Book] Azure Bicep - Zero to Hero is complete"},{"categories":["devops","azure","bicep"],"content":"One of the very important aspects of Infrastructure as Code (IaC) is automation. And, it is not just about the configuration tasks that we must automate but it is also the entire validation and deployment / delivery workflow itself. We call this a continuous integration (CI) and continuous delivery / deployment (CD) pipeline. The core idea of a CI/CD pipeline is to accelerate testing and uncover any bugs and fix those bugs before the code reaches production. There are many ways and tools to implement a CI/CD pipeline. We can use GitHub actions or Jenkins or AppVeyor to name just a few. But, as a starting point, I prefer building a local CI/CD pipeline using git hooks. In this article, I will show you how I built a simple test and deploy pipeline for my Azure Bicep experiments.\n","date":"2022-07-09","excerpt":"One of the very important aspects of Infrastructure as Code (IaC) is automation. And, it is not just about the configuration tasks that we must automate but it is also the entire validation and deployment / delivery workflow itself. We call this a continuous integration (CI) and continuous delivery / deployment (CD) pipeline. The core idea of a CI/CD pipeline is to accelerate testing and uncover any bugs and fix those bugs before the code reaches production. There are many ways and tools to implement a CI/CD pipeline. We can use GitHub actions or Jenkins or AppVeyor to name just a few. But, as a starting point, I prefer building a local CI/CD pipeline using git hooks. In this article, I will show you how I built a simple test and deploy pipeline for my Azure Bicep experiments.\n","permalink":"https://ravichaganti.com/blog/2022-07-09-local-ci-cd-for-your-bicep-templates/","series":"Azure Bicep","tags":["devops","azure","bicep"],"title":"Local CI/CD for your Bicep templates"},{"categories":["vscode","containers","azure","bicep"],"content":"Starting with Bicep version 0.5.6, Microsoft added support for consuming from a public module repository hosted on Microsoft Container Registry (MCR). To consume a module from Microsoft’s pubic registry, you need to use the following syntax.\n1 module \u0026lt;module-id\u0026gt; \u0026#39;br/public:\u0026lt;module-group\u0026gt;/\u0026lt;module-name\u0026gt;:\u0026lt;version\u0026gt;\u0026#39; = { ... } br/public indicates that you want to consume the module hosted on MCR. Here is an example of creating a Azure virtual network using the virtual-network module. The version tag is mandatory.\n","date":"2022-04-19","excerpt":"Starting with Bicep version 0.5.6, Microsoft added support for consuming from a public module repository hosted on Microsoft Container Registry (MCR). To consume a module from Microsoft’s pubic registry, you need to use the following syntax.\n1 module \u0026lt;module-id\u0026gt; \u0026#39;br/public:\u0026lt;module-group\u0026gt;/\u0026lt;module-name\u0026gt;:\u0026lt;version\u0026gt;\u0026#39; = { ... } br/public indicates that you want to consume the module hosted on MCR. Here is an example of creating a Azure virtual network using the virtual-network module. The version tag is mandatory.\n","permalink":"https://ravichaganti.com/blog/working-with-azure-bicep-public-modules-registry/","series":"Azure Bicep","tags":["vscode","containers","azure","bicep"],"title":"Working with Azure Bicep Public modules registry"},{"categories":["vscode","containers","azure","bicep"],"content":"Visual Studio Code development containers are magic! With the help of VS Code Remote - Containers extension and Docker Desktop, you can run a full-featured development environment within a container.\n","date":"2022-03-20","excerpt":"Visual Studio Code development containers are magic! With the help of VS Code Remote - Containers extension and Docker Desktop, you can run a full-featured development environment within a container.\n","permalink":"https://ravichaganti.com/blog/bicep-feature-in-vscode-devcontainer/","series":"Azure Bicep","tags":["vscode","containers","azure","bicep"],"title":"Azure Bicep as a feature in VS Code development containers"},{"categories":["Azure","Azure Policy"],"content":"In the last part of this series around Azure Policy Guest Configuration, you got an introduction to what is Guest Configuration. In this part, you will learn about assigning Guest Configuration policies and initiatives.\nAzure Policy Guest Configuration (GC) is an extension to Azure Policy and therefore use the same JSON definition structure. For example, here is the (redacted) GC definition for the policy Audit Windows machines that do not have the specified Windows PowerShell execution policy.\n","date":"2021-08-01","excerpt":"In the last part of this series around Azure Policy Guest Configuration, you got an introduction to what is Guest Configuration. In this part, you will learn about assigning Guest Configuration policies and initiatives.\nAzure Policy Guest Configuration (GC) is an extension to Azure Policy and therefore use the same JSON definition structure. For example, here is the (redacted) GC definition for the policy Audit Windows machines that do not have the specified Windows PowerShell execution policy.\n","permalink":"https://ravichaganti.com/blog/azure-policy-guest-configuration-assignments/","series":"Azure Policy Guest Configuration","tags":["azure","azure policy"],"title":"Azure Policy Guest Configuration - Assignments"},{"categories":["Azure","Bicep","book"],"content":" Many are struggling to make ends meet ever since the pandemic started. Therefore, I decided that all proceeds from this book will go to charity.\nProject Bicep is undoubtedly the best thing that happened in the Azure world, and I have been following the development and using Bicep quite often. I published a series of articles on this blog around Bicep. However, there is always more. This series gave me an idea about a complete book on Bicep. And, today, I am announcing this new book project - Azure Bicep - Zero to Hero. This book is still a work in progress and 30% complete. I will be spending a few more weekends completing the rest of the chapters. You can read it as I complete and provide your feedback. Since this is a self-published book, all updates to the book will be free forever.\n","date":"2021-06-06","excerpt":" Many are struggling to make ends meet ever since the pandemic started. Therefore, I decided that all proceeds from this book will go to charity.\nProject Bicep is undoubtedly the best thing that happened in the Azure world, and I have been following the development and using Bicep quite often. I published a series of articles on this blog around Bicep. However, there is always more. This series gave me an idea about a complete book on Bicep. And, today, I am announcing this new book project - Azure Bicep - Zero to Hero. This book is still a work in progress and 30% complete. I will be spending a few more weekends completing the rest of the chapters. You can read it as I complete and provide your feedback. Since this is a self-published book, all updates to the book will be free forever.\n","permalink":"https://ravichaganti.com/blog/book-announcing-azure-bicep-zero-to-hero/","series":"Azure Bicep","tags":["Azure","Bicep","book"],"title":"[Book] - Annoucing Azure Bicep - Zero to Hero"},{"categories":["Azure","Bicep"],"content":" Bicep v0.4.1 was released yesterday. This release includes a bunch of bug fixes, more snippets, and most importantly, a linter!\nLinters bring in a variety of capabilities to a developer toolkit. These tools can help you perform static code analysis, check compliance against a style guide, find syntax errors, and flag potential optimizations in the code.\nFor a developer, linting support in an IDE is a must. With this Bicep release, Microsoft added support for linting of Bicep files in VS Code and at the command line. To realize the benefits of linting, you must upgrade Bicep CLI and the VS Code extension to v4.0.1 or later. The current set of linter rules are minimal and taken from arm-ttk test cases. Both VS Code extension and Bicep CLI check for all available rules by default and all rules are set at warning level. Based on the level of a rule, you will see errors or warnings or informational messages within the editor.\n","date":"2021-06-02","excerpt":" Bicep v0.4.1 was released yesterday. This release includes a bunch of bug fixes, more snippets, and most importantly, a linter!\nLinters bring in a variety of capabilities to a developer toolkit. These tools can help you perform static code analysis, check compliance against a style guide, find syntax errors, and flag potential optimizations in the code.\nFor a developer, linting support in an IDE is a must. With this Bicep release, Microsoft added support for linting of Bicep files in VS Code and at the command line. To realize the benefits of linting, you must upgrade Bicep CLI and the VS Code extension to v4.0.1 or later. The current set of linter rules are minimal and taken from arm-ttk test cases. Both VS Code extension and Bicep CLI check for all available rules by default and all rules are set at warning level. Based on the level of a rule, you will see errors or warnings or informational messages within the editor.\n","permalink":"https://ravichaganti.com/blog/bicep-v0-4-and-linter/","series":"Azure Bicep","tags":["Azure","Bicep"],"title":"Bicep v0.4 and the linter"},{"categories":["Azure","Bicep","Docker","Containers"],"content":" While using the Azure CLI container image for one of my side projects, I started looking for an image that contains Bicep CLI as well. I found Mikolaj Mackowiak\u0026rsquo;s Bicep-cli image. This was what I really needed and it includes both Azure CLI and Bicep CLI. However, just as a fun side project, I wanted to publish my own image as well.\n","date":"2021-05-20","excerpt":" While using the Azure CLI container image for one of my side projects, I started looking for an image that contains Bicep CLI as well. I found Mikolaj Mackowiak\u0026rsquo;s Bicep-cli image. This was what I really needed and it includes both Azure CLI and Bicep CLI. However, just as a fun side project, I wanted to publish my own image as well.\n","permalink":"https://ravichaganti.com/blog/bicep-container-image/","series":"Azure Bicep","tags":["Azure","Bicep","Docker","Containers"],"title":"Bicep Container Image"},{"categories":["Azure","Bicep"],"content":" I wrote a series of articles to introduce Bicep language fundamentals. I really enjoyed working on these articles and learnt quite a lot in that process.\nThe Bicep team released version 0.3.539 of Bicep command line as well as the VS Code extension a few hours ago and it came with a lot of goodness \u0026ndash; bug fixes as well as new shiny things! One of the first things that caught my eye was the Bicep visualizer.\n","date":"2021-05-15","excerpt":" I wrote a series of articles to introduce Bicep language fundamentals. I really enjoyed working on these articles and learnt quite a lot in that process.\nThe Bicep team released version 0.3.539 of Bicep command line as well as the VS Code extension a few hours ago and it came with a lot of goodness \u0026ndash; bug fixes as well as new shiny things! One of the first things that caught my eye was the Bicep visualizer.\n","permalink":"https://ravichaganti.com/blog/bicep-visualizer/","series":"Azure Bicep","tags":["Azure","Bicep"],"title":"Bicep Visualizer"},{"categories":["Azure","Bicep"],"content":" When using ARM JSON templates, you can deploy to any of the four supported scopes \u0026ndash; management groups, tenants, subscriptions, and resource groups. What you can deploy using ARM JSON templates differs between these different target scopes. For example, you can create resource groups at the subscription level only. You identify the target scope for an ARM JSON template using the $schema element in the template. Each scope has a specific schema.\n","date":"2021-04-20","excerpt":" When using ARM JSON templates, you can deploy to any of the four supported scopes \u0026ndash; management groups, tenants, subscriptions, and resource groups. What you can deploy using ARM JSON templates differs between these different target scopes. For example, you can create resource groups at the subscription level only. You identify the target scope for an ARM JSON template using the $schema element in the template. Each scope has a specific schema.\n","permalink":"https://ravichaganti.com/blog/bicep-basics-beyond-basics-scoped-deployment/","series":["Azure Bicep"],"tags":["Azure","Bicep"],"title":"Bicep Language - Beyond Basics - Scoped Deployment"},{"categories":["Azure","Bicep"],"content":" When you go to the Azure portal and deploy a service, you may have seen a prompt where you are asked to select an existing resource group or create a new resource group. And, a few more service deployment scenarios might ask you to select between selecting an existing or creating a new storage account.\n","date":"2021-04-19","excerpt":" When you go to the Azure portal and deploy a service, you may have seen a prompt where you are asked to select an existing resource group or create a new resource group. And, a few more service deployment scenarios might ask you to select between selecting an existing or creating a new storage account.\n","permalink":"https://ravichaganti.com/blog/bicep-basics-beyond-basics-conditional-deployment/","series":["Azure Bicep"],"tags":["Azure","Bicep"],"title":"Bicep Language - Beyond Basics - Conditional Deployment"},{"categories":["Azure","Bicep"],"content":" Reusability and repeatability are two basics requirements when you want to implement Infrastructure as Code (IaC) practices. You looked at how parameters can be added to Bicep files to make those programs reusable. This is the first step towards modularizing your programs. With the ARM JSON templates, you might have used linked templates that are meant to provide similar functionality. Bicep has support for modularity and helps simplify complex configurations into smaller reusable modules.\n","date":"2021-04-16","excerpt":" Reusability and repeatability are two basics requirements when you want to implement Infrastructure as Code (IaC) practices. You looked at how parameters can be added to Bicep files to make those programs reusable. This is the first step towards modularizing your programs. With the ARM JSON templates, you might have used linked templates that are meant to provide similar functionality. Bicep has support for modularity and helps simplify complex configurations into smaller reusable modules.\n","permalink":"https://ravichaganti.com/blog/bicep-basics-beyond-basics-modules/","series":"Azure Bicep","tags":["Azure","Bicep"],"title":"Bicep Language - Beyond Basics - Modules"},{"categories":["Azure","Azure Bicep","Presentations"],"content":"Today I had the opportunity to present live (virtually) at the Global Azure Bootcamp 2021. My session was around Azure Bicep. I really enjoyed preparing for and delivering this session.\nIf you follow me on Twitter or this blog, you know I\u0026rsquo;ve started a new series of articles on Azure Bicep. These articles are essentially notes from my Bicep learning sessions. There are a few more pending in the next few days, but overall, I really enjoyed learning about Bicep. This series and my session at GAB 2021 helped me share my learning with the community.\n","date":"2021-04-16","excerpt":"Today I had the opportunity to present live (virtually) at the Global Azure Bootcamp 2021. My session was around Azure Bicep. I really enjoyed preparing for and delivering this session.\nIf you follow me on Twitter or this blog, you know I\u0026rsquo;ve started a new series of articles on Azure Bicep. These articles are essentially notes from my Bicep learning sessions. There are a few more pending in the next few days, but overall, I really enjoyed learning about Bicep. This series and my session at GAB 2021 helped me share my learning with the community.\n","permalink":"https://ravichaganti.com/blog/slides-and-demo-scripts-introduction-to-azure-bicep-gab-2021/","series":"Azure Bicep","tags":["Azure","Azure Bicep"],"title":"Slides and Demo Scripts: Global Azure Bootcamp 2021 - Azure Bicep"},{"categories":["Azure","Bicep"],"content":" You use outputs in ARM JSON templates to return value(s) from the deployment. Returning output from a template is not mandatory, but it is useful in scenarios such as deploying templates through a CI/CD pipeline or creating templates as reusable modules. To support this, Bicep language has an outputs element.\nOutput Syntax for adding an output element to Bicep is:\n","date":"2021-04-15","excerpt":" You use outputs in ARM JSON templates to return value(s) from the deployment. Returning output from a template is not mandatory, but it is useful in scenarios such as deploying templates through a CI/CD pipeline or creating templates as reusable modules. To support this, Bicep language has an outputs element.\nOutput Syntax for adding an output element to Bicep is:\n","permalink":"https://ravichaganti.com/blog/bicep-basics-beyond-basics-output/","series":"Azure Bicep","tags":["Azure","Bicep"],"title":"Bicep Language - Beyond Basics - Output"},{"categories":["Azure","Bicep"],"content":" When working ARM templates, you may have come across a situation where you want to provision multiple instances of a resource with similar configuration. For example, multiple storage accounts or virtual machines or multiple data disks attached to a virtual machine. In the JSON template language, the copy element is used for this purpose. Bicep language has a few different ways you can achieve this at different levels like resources, resource properties, and outputs. Variable iterations are not available yet and mostly coming as a part of 0.4 release which is due by May 25th 2021.\n","date":"2021-04-14","excerpt":" When working ARM templates, you may have come across a situation where you want to provision multiple instances of a resource with similar configuration. For example, multiple storage accounts or virtual machines or multiple data disks attached to a virtual machine. In the JSON template language, the copy element is used for this purpose. Bicep language has a few different ways you can achieve this at different levels like resources, resource properties, and outputs. Variable iterations are not available yet and mostly coming as a part of 0.4 release which is due by May 25th 2021.\n","permalink":"https://ravichaganti.com/blog/bicep-basics-beyond-basics-iterations/","series":"Azure Bicep","tags":["Azure","Bicep"],"title":"Bicep Language - Beyond Basics - Iterations"},{"categories":["Azure","Bicep"],"content":" Expressions are a critical part of any programming language. For a Domain-Specific Language (DSL) such as Bicep that transpiles to ARM template JSON, expressions add a great value in reducing the complexity in authoring templates. All built-in functions available within ARM JSON template language are available within Bicep as well. Using these functions and the supported language constructs, you can create some powerful expressions in Bicep that significantly reduces the complexity compared to JSON templates. In this article, you will learn about writing a few different ways of writing expressions.\n","date":"2021-04-13","excerpt":" Expressions are a critical part of any programming language. For a Domain-Specific Language (DSL) such as Bicep that transpiles to ARM template JSON, expressions add a great value in reducing the complexity in authoring templates. All built-in functions available within ARM JSON template language are available within Bicep as well. Using these functions and the supported language constructs, you can create some powerful expressions in Bicep that significantly reduces the complexity compared to JSON templates. In this article, you will learn about writing a few different ways of writing expressions.\n","permalink":"https://ravichaganti.com/blog/bicep-basics-beyond-basics-expressions/","series":"Azure Bicep","tags":["Azure","Bicep"],"title":"Bicep Language - Beyond Basics - Expressions"},{"categories":["Azure","Bicep"],"content":" This part of the series will take you beyond Bicep language basics by showing you how to add variables to your Bicep files. If you have worked on ARM JSON templates, you know that variables exist there as well. The primary intention of using variables in either ARM JSON templates or Bicep language is to bring in a balance between free-form vs fixed configurations.\n","date":"2021-04-12","excerpt":" This part of the series will take you beyond Bicep language basics by showing you how to add variables to your Bicep files. If you have worked on ARM JSON templates, you know that variables exist there as well. The primary intention of using variables in either ARM JSON templates or Bicep language is to bring in a balance between free-form vs fixed configurations.\n","permalink":"https://ravichaganti.com/blog/bicep-basics-beyond-basics-variables/","series":"Azure Bicep","tags":["Azure","Bicep"],"title":"Bicep Language - Beyond Basics - Variables"},{"categories":["Azure","Bicep"],"content":" In the previous part, you learned how you can get started with Bicep language to write your first Bicep file. As you learned, resource keyword along with resource declaration and resource properties are the minimum required in a Bicep file. In today\u0026rsquo;s article, you will see what is beyond those basics.\nParameters One of the goals of Infrastructure as Code (IaC) practice is to create reusable and repeatable automation for deploying your infrastructure. To make this happen, you need to parameterize your infrastructure configuration definitions. In this case, your Bicep files.\n","date":"2021-04-11","excerpt":" In the previous part, you learned how you can get started with Bicep language to write your first Bicep file. As you learned, resource keyword along with resource declaration and resource properties are the minimum required in a Bicep file. In today\u0026rsquo;s article, you will see what is beyond those basics.\nParameters One of the goals of Infrastructure as Code (IaC) practice is to create reusable and repeatable automation for deploying your infrastructure. To make this happen, you need to parameterize your infrastructure configuration definitions. In this case, your Bicep files.\n","permalink":"https://ravichaganti.com/blog/bicep-basics-beyond-basics-parameters/","series":"Azure Bicep","tags":["Azure","Bicep"],"title":"Bicep Language - Beyond Basics - Parameters"},{"categories":["Azure","Bicep"],"content":" In the first part of this new series of articles on Azure Bicep, you learnt about what is Azure Bicep and why it is needed. In this part, you will learn about how to get started with Azure Bicep.\nInstalling Bicep To start working with Bicep you will need, at a minimum, the Bicep CLI. There are multiple ways to get Bicep CLI on to your system. On Windows systems, you can use any of the following methods.\n","date":"2021-04-06","excerpt":" In the first part of this new series of articles on Azure Bicep, you learnt about what is Azure Bicep and why it is needed. In this part, you will learn about how to get started with Azure Bicep.\nInstalling Bicep To start working with Bicep you will need, at a minimum, the Bicep CLI. There are multiple ways to get Bicep CLI on to your system. On Windows systems, you can use any of the following methods.\n","permalink":"https://ravichaganti.com/blog/getting-started-with-azure-bicep/","series":"Azure Bicep","tags":["Azure","Bicep"],"title":"Getting Started With Azure Bicep"},{"categories":["Azure","Bicep"],"content":" As I started preparing slides and demos for my session on Azure Bicep at the Global Azure Bootcamp 2021, I made a bunch of notes. As a part of this new series of articles on Azure Bicep, I will start sharing those notes here.\nAzure Bicep is a new Domain-Specific Language (DSL) for declaratively deploying Azure resources. Bicep is not a general purpose programming language but a transparent abstraction for Azure Resource Manager (ARM) Templates. This ensures that the properties that are valid in ARM templates are valid in Bicep as well. Azure Bicep acts as a transpiler for generating ARM templates from Bicep files. But, what is wrong with ARM templates?\n","date":"2021-04-05","excerpt":" As I started preparing slides and demos for my session on Azure Bicep at the Global Azure Bootcamp 2021, I made a bunch of notes. As a part of this new series of articles on Azure Bicep, I will start sharing those notes here.\nAzure Bicep is a new Domain-Specific Language (DSL) for declaratively deploying Azure resources. Bicep is not a general purpose programming language but a transparent abstraction for Azure Resource Manager (ARM) Templates. This ensures that the properties that are valid in ARM templates are valid in Bicep as well. Azure Bicep acts as a transpiler for generating ARM templates from Bicep files. But, what is wrong with ARM templates?\n","permalink":"https://ravichaganti.com/blog/introduction-to-azure-bicep/","series":"Azure Bicep","tags":["Azure","Bicep"],"title":"Introduction to Azure Bicep"},{"categories":["Azure","Azure Bicep"],"content":" Project Bicep aims to simplify how you author Azure Resource Manager (ARM) templates. Bicep is a new declarative language and a transpiler. This transparent abstraction takes a bicep file and transpiles it into an ARM template JSON. The Bicep CLI provides the necessary capablities to compile bicep files to ARM templates and decompile ARM templates into bicep files.\nBicep language itself is very easy to understand and start using. However, as you start learning it may be helpful to see a few examples and draw some inspiration as you build your won bicep files. Project Bicep respository on GitHub has a good number of examples for varied level of complexity. While looking at these, I thought it may be a good idea to create scripts that can retrieve and save selected example locally.\n","date":"2021-03-25","excerpt":" Project Bicep aims to simplify how you author Azure Resource Manager (ARM) templates. Bicep is a new declarative language and a transpiler. This transparent abstraction takes a bicep file and transpiles it into an ARM template JSON. The Bicep CLI provides the necessary capablities to compile bicep files to ARM templates and decompile ARM templates into bicep files.\nBicep language itself is very easy to understand and start using. However, as you start learning it may be helpful to see a few examples and draw some inspiration as you build your won bicep files. Project Bicep respository on GitHub has a good number of examples for varied level of complexity. While looking at these, I thought it may be a good idea to create scripts that can retrieve and save selected example locally.\n","permalink":"https://ravichaganti.com/blog/retrieve-and-save-project-bicep-examples-from-github/","series":"Azure Bicep","tags":["Azure","Azure Bicep"],"title":"Retrieve and save Project Bicep examples from GitHub"},{"categories":["Azure","Azure Bicep","Speaking"],"content":" Global Azure Bootcamp is happening this year from April 15th to 17th as an online event. And, I will be speaking this year. I submitted a couple of sessions and the Azure Bicep session got accepted.\nSo, what is Azure Bicep? Azure Bicep is the Domain-Specific Language (DSL) and a transparent abstraction built on top of Azure Resource Manager (ARM). The intention behind this project is to simplify authoring ARM templates. Bicep language transpiles into an ARM template JSON which you can deploy using already well-known methods and your existing CI/CD pipelines.\n","date":"2021-03-22","excerpt":" Global Azure Bootcamp is happening this year from April 15th to 17th as an online event. And, I will be speaking this year. I submitted a couple of sessions and the Azure Bicep session got accepted.\nSo, what is Azure Bicep? Azure Bicep is the Domain-Specific Language (DSL) and a transparent abstraction built on top of Azure Resource Manager (ARM). The intention behind this project is to simplify authoring ARM templates. Bicep language transpiles into an ARM template JSON which you can deploy using already well-known methods and your existing CI/CD pipelines.\n","permalink":"https://ravichaganti.com/blog/speaking-at-global-azure-bootcamp-india-2021/","series":"Azure Bicep","tags":["Azure","Azure Bicep","Speaking"],"title":"Speaking at Global Azure Bootcamp India 2021"},{"categories":["PowerShell","AzCli"],"content":"Whenever I have to build a new development machine or VM, I usually go about installing a few development tools and command line tools that I use quite often. One such tool is the Azure CLI.\nThere are many alternatives for installing Azure CLI as a part of build process but what I use is this PowerShell script.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 [CmdletBinding()] param ( ) $InformationPreference = \u0026#39;Continue\u0026#39; # Verify that the script is running as administrator if ([bool](([System.Security.Principal.WindowsIdentity]::GetCurrent()).groups -match \u0026#39;S-1-5-32-544\u0026#39;)) { # Download Azure CLI MSI package $uri = \u0026#39;https://aka.ms/installazurecliwindows\u0026#39; $request = Invoke-WebRequest -UseBasicParsing -Uri $uri -MaximumRedirection 0 -ErrorAction Ignore if(($request.StatusCode -ge 300) -and ($request.StatusCode -lt 400)) { $location = $request.Headers.Location $fileName = Split-Path -Path $location -Leaf $cliVersion = $fileName.Split(\u0026#39;-\u0026#39;)[2].trim(\u0026#39;.msi\u0026#39;) $downloadPath = \u0026#34;${env:Temp}\\$fileName\u0026#34; Write-Information -Message (\u0026#34;Downloading Azure CLI version {0} to {1}\u0026#34; -f $cliVersion, $downloadPath) Invoke-WebRequest -UseBasicParsing -Uri $location -OutFile $downloadPath -ErrorAction SilentlyContinue -Verbose:$false if (Test-Path -Path $downloadPath) { Write-Information -Message (\u0026#34;Installing Azure CLI version {0} from {1}\u0026#34; -f $cliVersion, $downloadPath) #Start-Process -FilePath msiexec.exe -ArgumentList \u0026#34;/i $downloadPath /qb /passive\u0026#34; -Wait -ErrorAction Stop -Verbose:$false Write-Information -Message (\u0026#34;Remove Azure CLI installer file from {0}\u0026#34; -f $downloadPath) Remove-Item -Path $downloadPath -Force } } else { throw \u0026#39;Cloud not retrieve the redirected URL\u0026#39; } } else { throw \u0026#39;This must run as administrator at an elevated PowerShell prompt.\u0026#39; } This script downloads the most recent public build and installs it.\n","date":"2021-03-19","excerpt":"Whenever I have to build a new development machine or VM, I usually go about installing a few development tools and command line tools that I use quite often. One such tool is the Azure CLI.\nThere are many alternatives for installing Azure CLI as a part of build process but what I use is this PowerShell script.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 [CmdletBinding()] param ( ) $InformationPreference = \u0026#39;Continue\u0026#39; # Verify that the script is running as administrator if ([bool](([System.Security.Principal.WindowsIdentity]::GetCurrent()).groups -match \u0026#39;S-1-5-32-544\u0026#39;)) { # Download Azure CLI MSI package $uri = \u0026#39;https://aka.ms/installazurecliwindows\u0026#39; $request = Invoke-WebRequest -UseBasicParsing -Uri $uri -MaximumRedirection 0 -ErrorAction Ignore if(($request.StatusCode -ge 300) -and ($request.StatusCode -lt 400)) { $location = $request.Headers.Location $fileName = Split-Path -Path $location -Leaf $cliVersion = $fileName.Split(\u0026#39;-\u0026#39;)[2].trim(\u0026#39;.msi\u0026#39;) $downloadPath = \u0026#34;${env:Temp}\\$fileName\u0026#34; Write-Information -Message (\u0026#34;Downloading Azure CLI version {0} to {1}\u0026#34; -f $cliVersion, $downloadPath) Invoke-WebRequest -UseBasicParsing -Uri $location -OutFile $downloadPath -ErrorAction SilentlyContinue -Verbose:$false if (Test-Path -Path $downloadPath) { Write-Information -Message (\u0026#34;Installing Azure CLI version {0} from {1}\u0026#34; -f $cliVersion, $downloadPath) #Start-Process -FilePath msiexec.exe -ArgumentList \u0026#34;/i $downloadPath /qb /passive\u0026#34; -Wait -ErrorAction Stop -Verbose:$false Write-Information -Message (\u0026#34;Remove Azure CLI installer file from {0}\u0026#34; -f $downloadPath) Remove-Item -Path $downloadPath -Force } } else { throw \u0026#39;Cloud not retrieve the redirected URL\u0026#39; } } else { throw \u0026#39;This must run as administrator at an elevated PowerShell prompt.\u0026#39; } This script downloads the most recent public build and installs it.\n","permalink":"https://ravichaganti.com/blog/powershell-script-to-download-and-install-azure-cli/","series":"Azure CLI","tags":["PowerShell","Azure CLI"],"title":"PowerShell script to download and install Azure CLI"},{"categories":["PowerShell"],"content":"At the recent Ignite event, Microsoft announced the release candidate 2 update of PowerShell SecretManagement module and the SecretStore extension vault modules. Both modules have been bumped up to version 0.9.1.\nIn the updated release, the secret management module has added support for secret metadata. The extension vault module must implement support for the metadata for this to work. To this extent, the SecretStore module has been updated to support metadata as well.\n","date":"2021-03-11","excerpt":"At the recent Ignite event, Microsoft announced the release candidate 2 update of PowerShell SecretManagement module and the SecretStore extension vault modules. Both modules have been bumped up to version 0.9.1.\nIn the updated release, the secret management module has added support for secret metadata. The extension vault module must implement support for the metadata for this to work. To this extent, the SecretStore module has been updated to support metadata as well.\n","permalink":"https://ravichaganti.com/blog/powershell-and-secrets-management-updates/","series":"PowerShell Secret Management","tags":["PowerShell"],"title":"PowerShell and Secret Management - Updates"},{"categories":["PowerShell"],"content":"Update: This article has been updated to show the latest version of the secret store module.\nIn the last part, you have seen an introduction to secret management in PowerShell and towards the end you learned that they are vault extensions that provide the real functionality for storing and managing secrets. In this part of the series, you will learn more about the SecretStore vault extension for the SecretManagement PowerShell module.\nThe SecretStore extension vault is a wrapper around the .NET Crypto API. This vault stores the secrets to the local machine based on the current user account context. You can install this from the PowerShell gallery.\n","date":"2021-01-15","excerpt":"Update: This article has been updated to show the latest version of the secret store module.\nIn the last part, you have seen an introduction to secret management in PowerShell and towards the end you learned that they are vault extensions that provide the real functionality for storing and managing secrets. In this part of the series, you will learn more about the SecretStore vault extension for the SecretManagement PowerShell module.\nThe SecretStore extension vault is a wrapper around the .NET Crypto API. This vault stores the secrets to the local machine based on the current user account context. You can install this from the PowerShell gallery.\n","permalink":"https://ravichaganti.com/blog/powershell-and-secret-management-using-secret-store-extension-vault/","series":"PowerShell Secret Management","tags":["PowerShell"],"title":"PowerShell and Secret Management - Using Secret Store Extension Vault"},{"categories":["PowerShell"],"content":"Update: This article has been updated to show the latest version of the secret management module.\nWithin the infrastructure automation, you always stumble upon a need to store and retrieve credentials. For example, imagine deploying a database instance and you want the database administrator username and password to be same across based on some IT standard. For this, you either have to hardcode the values in a script or prompt the user running the automation for these values. Storing secrets such as passwords, API keys, etc is a big NO. You should never do that. And, prompting a user will hamper the automation flow and will require manual intervention. This is where secret vaults play a role. You can store all secrets in a vault (local or remote) and then on-demand you can retrieve these values from the vault and consume in your automation. This method is most preferred when delegating automation tasks, running scripts in CI / CD pipelines, and in general anything that requires unattended automation.\n","date":"2021-01-10","excerpt":"Update: This article has been updated to show the latest version of the secret management module.\nWithin the infrastructure automation, you always stumble upon a need to store and retrieve credentials. For example, imagine deploying a database instance and you want the database administrator username and password to be same across based on some IT standard. For this, you either have to hardcode the values in a script or prompt the user running the automation for these values. Storing secrets such as passwords, API keys, etc is a big NO. You should never do that. And, prompting a user will hamper the automation flow and will require manual intervention. This is where secret vaults play a role. You can store all secrets in a vault (local or remote) and then on-demand you can retrieve these values from the vault and consume in your automation. This method is most preferred when delegating automation tasks, running scripts in CI / CD pipelines, and in general anything that requires unattended automation.\n","permalink":"https://ravichaganti.com/blog/powershell-and-secret-management-introduction/","series":"PowerShell Secret Management","tags":["PowerShell"],"title":"PowerShell and Secret Management - Introduction"},{"categories":["Azure","Azure Policy"],"content":"As your Azure adoption increases and as you on-board various departments and groups within your organization to start using Azure services, it is important that you put in place some level of governance. As cloud architect, you would want control over who can create what type resources, where can they create those resources and how many. You would also want to standardize on the deployments so that the configuration of resources is in compliance with your organization standards. Among many other aspects like this you would want the ability to track your cloud cost more granularly for every service deployed in the cloud and for every business unit or group within your organization. To address this and to implement efficient governance Azure offers features and services such as Policies, Management Groups, Resource Graph, and Blueprints. Here is an excellent depiction of Azure governance architecture from the partner blog.\n","date":"2021-01-06","excerpt":"As your Azure adoption increases and as you on-board various departments and groups within your organization to start using Azure services, it is important that you put in place some level of governance. As cloud architect, you would want control over who can create what type resources, where can they create those resources and how many. You would also want to standardize on the deployments so that the configuration of resources is in compliance with your organization standards. Among many other aspects like this you would want the ability to track your cloud cost more granularly for every service deployed in the cloud and for every business unit or group within your organization. To address this and to implement efficient governance Azure offers features and services such as Policies, Management Groups, Resource Graph, and Blueprints. Here is an excellent depiction of Azure governance architecture from the partner blog.\n","permalink":"https://ravichaganti.com/blog/azure-policy-guest-configuration-introduction/","series":"Azure Policy Guest Configuration","tags":["azure","azure policy"],"title":"Azure Policy Guest Configuration - Introduction"},{"categories":["Golang","Go"],"content":" In the last two parts of this series, you looked at functions and anonymous functions. Both provide a way to create reusable blocks of code and each having its own purpose and use within Go programming. As learned earlier, Go is not a pure object oriented programming language. But, it does support some aspects of OOP. Methods in Go are one way to implement that \u0026ldquo;object-orientedness\u0026rdquo;. This is based on the concept that a type in Go language can have methods associated with it.\n","date":"2020-10-23","excerpt":" In the last two parts of this series, you looked at functions and anonymous functions. Both provide a way to create reusable blocks of code and each having its own purpose and use within Go programming. As learned earlier, Go is not a pure object oriented programming language. But, it does support some aspects of OOP. Methods in Go are one way to implement that \u0026ldquo;object-orientedness\u0026rdquo;. This is based on the concept that a type in Go language can have methods associated with it.\n","permalink":"https://ravichaganti.com/blog/get-set-go-methods-in-go-language/","series":"Get Set GO","tags":["Golang","Go"],"title":"Get set Go - Methods in Go language"},{"categories":["Golang","Go"],"content":" In the last part of the series, you learned about functions in Go language. Functions are first-class citizens in Golang. What this means is that you can not only use function declarations as just reusable code blocks but you can also assign functions to variables, use functions as parameters on other functions, and even return functions from other functions. This is achieved using function literals which are also known as anonymous functions.\n","date":"2020-10-21","excerpt":" In the last part of the series, you learned about functions in Go language. Functions are first-class citizens in Golang. What this means is that you can not only use function declarations as just reusable code blocks but you can also assign functions to variables, use functions as parameters on other functions, and even return functions from other functions. This is achieved using function literals which are also known as anonymous functions.\n","permalink":"https://ravichaganti.com/blog/get-set-go-anonymous-functions-in-go-language/","series":"Get Set GO","tags":["Golang","Go"],"title":"Get set Go - Anonymous Functions in Go language"},{"categories":["Golang","Go"],"content":" Alright. In this series so far, you learned about some basics of programming in Go language, about data types, conditions, and loops. In all the examples in the earlier parts of the series, there was just the main function which is the entry point into a Go program. All execution of a Go program starts at the main function. The idea of a function in any language is to basically group together a set of instructions and these instructions can now be used repeatedly as needed. As you learned, the main function is a bit special though. Functions promote reusability and readability of your code. In this part of the series, you shall learn about functions in Go language.\n","date":"2020-10-12","excerpt":" Alright. In this series so far, you learned about some basics of programming in Go language, about data types, conditions, and loops. In all the examples in the earlier parts of the series, there was just the main function which is the entry point into a Go program. All execution of a Go program starts at the main function. The idea of a function in any language is to basically group together a set of instructions and these instructions can now be used repeatedly as needed. As you learned, the main function is a bit special though. Functions promote reusability and readability of your code. In this part of the series, you shall learn about functions in Go language.\n","permalink":"https://ravichaganti.com/blog/get-set-go-functions-in-go-language/","series":"Get Set GO","tags":["Golang","Go"],"title":"Get set Go - Functions in Go language"},{"categories":["Golang","Go"],"content":" In the two previous parts of the series, you learned how to use if, switch, and for loop in Go language. You also learned about using break and continue statements in Go language to alter the control flow. What you have seen in the examples with these statements was an unlabeled way to break or continue the iteration. Go language supports labels that let you transfer control to the place in the (same function) code where the label is defined. There are different ways to use labeled statements.\n","date":"2020-10-09","excerpt":" In the two previous parts of the series, you learned how to use if, switch, and for loop in Go language. You also learned about using break and continue statements in Go language to alter the control flow. What you have seen in the examples with these statements was an unlabeled way to break or continue the iteration. Go language supports labels that let you transfer control to the place in the (same function) code where the label is defined. There are different ways to use labeled statements.\n","permalink":"https://ravichaganti.com/blog/get-set-go-labels-in-go-language/","series":"Get Set GO","tags":["Golang","Go"],"title":"Get set Go - Labels in Go language"},{"categories":["Golang","Go"],"content":" With what you learned about basic data types and structs in this series so far, you are now ready to look at the looping construct in Go language. Go language is simple and to that extent Go has just one looping construct \u0026ndash; For loop.\nFor loop A few programming languages that you may have used in the past may have more than one looping construct \u0026ndash; do - while, do - until, for, and foreach and so on. You use a specific construct based on what you need to achieve and type of conditions that need to be tested. However, Go language has just one looping construct \u0026ndash; the for loop. Although there is just one looping construct, go supports multiple variations of this construct for different use cases.\n","date":"2020-10-07","excerpt":" With what you learned about basic data types and structs in this series so far, you are now ready to look at the looping construct in Go language. Go language is simple and to that extent Go has just one looping construct \u0026ndash; For loop.\nFor loop A few programming languages that you may have used in the past may have more than one looping construct \u0026ndash; do - while, do - until, for, and foreach and so on. You use a specific construct based on what you need to achieve and type of conditions that need to be tested. However, Go language has just one looping construct \u0026ndash; the for loop. Although there is just one looping construct, go supports multiple variations of this construct for different use cases.\n","permalink":"https://ravichaganti.com/blog/get-set-go-loops-in-go-language/","series":"Get Set GO","tags":["Golang","Go"],"title":"Get set Go - Loops in Go language"},{"categories":["Golang","Go"],"content":" With what you learned about basic data types and structs in this series so far, you are now ready to look at the branching constructs in Go language. You may have used branching constructs such as if..else if..else and switch statements in other languages. Go language too offers these constructs.\nIf .. else if .. else If construct in any programming language is a branching construct and moves the execution from one place in the code to another based on a condition. Go language is no exception.\n","date":"2020-10-05","excerpt":" With what you learned about basic data types and structs in this series so far, you are now ready to look at the branching constructs in Go language. You may have used branching constructs such as if..else if..else and switch statements in other languages. Go language too offers these constructs.\nIf .. else if .. else If construct in any programming language is a branching construct and moves the execution from one place in the code to another based on a condition. Go language is no exception.\n","permalink":"https://ravichaganti.com/blog/get-set-go-condition-statements-in-go-language/","series":"Get Set GO","tags":["Golang","Go"],"title":"Get set Go - Condition statements in Go language"},{"categories":["Golang","Go"],"content":" So far in this series, you learned about different built-in data types such as integers, strings, floats, arrays, slices, maps, and pointers. All of these allow only one type of data. All elements in the array have to of the same time. All keys and values have to be of the same type. What if you have need to combine multiple types and create a custom type for your programs? This is where structs play a role in Go language.\n","date":"2020-10-01","excerpt":" So far in this series, you learned about different built-in data types such as integers, strings, floats, arrays, slices, maps, and pointers. All of these allow only one type of data. All elements in the array have to of the same time. All keys and values have to be of the same type. What if you have need to combine multiple types and create a custom type for your programs? This is where structs play a role in Go language.\n","permalink":"https://ravichaganti.com/blog/get-set-go-structs-in-go-language/","series":"Get Set GO","tags":["Golang","Go"],"title":"Get set Go - Structs in Go language"},{"categories":["Golang","Go"],"content":" In the previous part of this series, you learned about pointers in Go language. In this part, you will learn about maps in Go language. Maps are another built-in data type in Go and maps store key-value pairs. This is like dictionaries in other programming languages.\nMaps First, look at the below example.\n1 2 3 4 5 6 7 8 package main import \u0026#34;fmt\u0026#34; func main() { var m1 map[string]int fmt.Println(m1) } In the above example, variable m1 is of map data type and declares an empty map. When you run this, all you will see is map[]. The zero value of map keys will be nil and therefore this will be called a nil map. Maps store key-value pairs. So, if we generalize the syntax from the above example, it will be:\n","date":"2020-09-30","excerpt":" In the previous part of this series, you learned about pointers in Go language. In this part, you will learn about maps in Go language. Maps are another built-in data type in Go and maps store key-value pairs. This is like dictionaries in other programming languages.\nMaps First, look at the below example.\n1 2 3 4 5 6 7 8 package main import \u0026#34;fmt\u0026#34; func main() { var m1 map[string]int fmt.Println(m1) } In the above example, variable m1 is of map data type and declares an empty map. When you run this, all you will see is map[]. The zero value of map keys will be nil and therefore this will be called a nil map. Maps store key-value pairs. So, if we generalize the syntax from the above example, it will be:\n","permalink":"https://ravichaganti.com/blog/get-set-go-maps-in-go-language/","series":"Get Set GO","tags":["Golang","Go"],"title":"Get set Go - Maps in Go language"},{"categories":["Golang","Go"],"content":" In the previous part of this series, you learned about slices in Go language. Slices, unlike arrays, allow flexibility and certainly are the most used compared to arrays in Go language. Towards the end of the article on slices, you learned that slices are essentially references to an underlying array and any changes made to the slice will reflect in the underlying array as well. In this article, you shall learn about another reference type called pointers in Go language.\n","date":"2020-09-29","excerpt":" In the previous part of this series, you learned about slices in Go language. Slices, unlike arrays, allow flexibility and certainly are the most used compared to arrays in Go language. Towards the end of the article on slices, you learned that slices are essentially references to an underlying array and any changes made to the slice will reflect in the underlying array as well. In this article, you shall learn about another reference type called pointers in Go language.\n","permalink":"https://ravichaganti.com/blog/get-set-go-pointers-in-go-language/","series":"Get Set GO","tags":["Golang","Go"],"title":"Get set Go - Pointers in Go language"},{"categories":["Golang","Go"],"content":" In the previous part of this series, you learned about arrays in Go language. As you have learned, arrays have a fixed size and therefore you cannot resize (grow or shrink) arrays. This limitation can be overcome using slices in Go language. In this part, you will learn about slices and how to use this data type in your Go programs.\n","date":"2020-09-28","excerpt":" In the previous part of this series, you learned about arrays in Go language. As you have learned, arrays have a fixed size and therefore you cannot resize (grow or shrink) arrays. This limitation can be overcome using slices in Go language. In this part, you will learn about slices and how to use this data type in your Go programs.\n","permalink":"https://ravichaganti.com/blog/get-set-go-slices-in-go-language/","series":"Get Set GO","tags":["Golang","Go"],"title":"Get set Go - Slices in Go language"},{"categories":["Azure","Community","Speaking"],"content":" Azure Community Conference is a 3 day multi-track virtual event scheduled to go live on November 24th 2020. This event is being organized by the Bangalore Azure User Group. The target audience of this virtual event are cloud and web developers working with open source and cloud native technologies on the Microsoft stack. This event will be a free two conference days that includes a free workshop as well. Registration for this event is open.\n","date":"2020-09-21","excerpt":" Azure Community Conference is a 3 day multi-track virtual event scheduled to go live on November 24th 2020. This event is being organized by the Bangalore Azure User Group. The target audience of this virtual event are cloud and web developers working with open source and cloud native technologies on the Microsoft stack. This event will be a free two conference days that includes a free workshop as well. Registration for this event is open.\n","permalink":"https://ravichaganti.com/blog/azure-community-conference-2020/","series":null,"tags":["Azure","Community"],"title":"Azure Community Conference - 2020"},{"categories":["Golang","Go"],"content":" In the earlier part of this series, you looked at types in Go language and learned about the basic data types \u0026ndash; int, float, and strings. You also learned about other categories of data types such as aggregate types, reference types, and interface types. In the next subsequent parts, you will dive into each of these different types.\nAggregate Types Aggregate types in Go language include arrays and structs. These data types are formed by combining basic data types. Learning structs will require knowledge of a few more things about Go language and Go types. You will learn about that soon. In today\u0026rsquo;s part, you will learn about arrays.\n","date":"2020-08-31","excerpt":" In the earlier part of this series, you looked at types in Go language and learned about the basic data types \u0026ndash; int, float, and strings. You also learned about other categories of data types such as aggregate types, reference types, and interface types. In the next subsequent parts, you will dive into each of these different types.\nAggregate Types Aggregate types in Go language include arrays and structs. These data types are formed by combining basic data types. Learning structs will require knowledge of a few more things about Go language and Go types. You will learn about that soon. In today\u0026rsquo;s part, you will learn about arrays.\n","permalink":"https://ravichaganti.com/blog/get-set-go-arrays-in-go-language/","series":"Get Set GO","tags":["Golang","Go"],"title":"Get set Go - Arrays in Go language"},{"categories":["Golang","Go"],"content":"After looking at variables in the previous part of this series, you have a fair understanding of using different types of variable declarations and using the variable values in your program. Each of these variables you created and used have an associated type. The type of a variable dictates what that variable is allowed store. So, what are different data types in Go language? You will learn that today!\nData types in Golang Go language has several built-in data types and these types can be classified into three different categories \u0026ndash; basic data types, aggregate data types, reference types, and interface types.\n","date":"2020-08-13","excerpt":"After looking at variables in the previous part of this series, you have a fair understanding of using different types of variable declarations and using the variable values in your program. Each of these variables you created and used have an associated type. The type of a variable dictates what that variable is allowed store. So, what are different data types in Go language? You will learn that today!\nData types in Golang Go language has several built-in data types and these types can be classified into three different categories \u0026ndash; basic data types, aggregate data types, reference types, and interface types.\n","permalink":"https://ravichaganti.com/blog/get-set-go-types-in-go-language/","series":"Get Set GO","tags":["Golang","Go"],"title":"Get set Go - Types in Go language"},{"categories":["Golang","Go"],"content":" In the last part of this series, you looked at writing your first program and understood the program structure and understood the keywords such as package, import, and func. It was a good start. In this part, you will learn how to declare and use variables in Go programs.\nNaming convention in Go Before you start looking at variables in Golang, you must first understand some rules for naming different program entities \u0026ndash; variables, types, statements, packages, and constants \u0026ndash; in Go.\n","date":"2020-08-11","excerpt":" In the last part of this series, you looked at writing your first program and understood the program structure and understood the keywords such as package, import, and func. It was a good start. In this part, you will learn how to declare and use variables in Go programs.\nNaming convention in Go Before you start looking at variables in Golang, you must first understand some rules for naming different program entities \u0026ndash; variables, types, statements, packages, and constants \u0026ndash; in Go.\n","permalink":"https://ravichaganti.com/blog/get-set-go-variables-in-go-language/","series":"Get Set GO","tags":["Golang","Go"],"title":"Get set Go - Variables in Go language"},{"categories":["Azure Resource Manager","Azure","ARM Template","Key Vault"],"content":" In this series so far, you have seen how to get started with ARM templates, parameterize them by adding parameters, and optimize them using variables, expressions, and user-defined functions. It is now time to move on to more advanced topics and begin building the template for the remaining components of the architecture shown above. In the architecture shown above, you will implement an ARM template that provisions virtual machines, requiring the administrator and domain-join credentials as inputs. Also, the configuration scripts used to configure the guest OS may need to access an internal storage account blob, which requires the storage connection strings and access keys. Storing these secrets in plain text is not recommended. Also, as an architect, you may want to standardize on passwords for local administrator accounts and avoid sharing domain-join credentials with any user when provisioning an ARM template. This needs a more centralized credential and secret store. Azure Vault provides this capability. Today, you will learn how to handle secrets such as passwords, access keys, certificates, and more in an ARM template.\n","date":"2020-08-07","excerpt":" In this series so far, you have seen how to get started with ARM templates, parameterize them by adding parameters, and optimize them using variables, expressions, and user-defined functions. It is now time to move on to more advanced topics and begin building the template for the remaining components of the architecture shown above. In the architecture shown above, you will implement an ARM template that provisions virtual machines, requiring the administrator and domain-join credentials as inputs. Also, the configuration scripts used to configure the guest OS may need to access an internal storage account blob, which requires the storage connection strings and access keys. Storing these secrets in plain text is not recommended. Also, as an architect, you may want to standardize on passwords for local administrator accounts and avoid sharing domain-join credentials with any user when provisioning an ARM template. This needs a more centralized credential and secret store. Azure Vault provides this capability. Today, you will learn how to handle secrets such as passwords, access keys, certificates, and more in an ARM template.\n","permalink":"https://ravichaganti.com/blog/azure-resource-manager-using-secrets-in-arm-templates/","series":"Azure Resource Manager In 30 Days","tags":["Azure Resource Manager","Azure","ARM Template","Key Vault"],"title":"Azure Resource Manager - Using secrets in ARM templates"},{"categories":["Golang","Go"],"content":" With the background provided in the introduction part of this series, you must now be equipped with the necessary tools for the job \u0026ndash; learning Go! So, in this part, you will write your first program in Go language. You will not only learn about the very minimal structure needed for a Go program but you will also learn about organizing your Go programs and why it matters. Get set Go!\n","date":"2020-08-04","excerpt":" With the background provided in the introduction part of this series, you must now be equipped with the necessary tools for the job \u0026ndash; learning Go! So, in this part, you will write your first program in Go language. You will not only learn about the very minimal structure needed for a Go program but you will also learn about organizing your Go programs and why it matters. Get set Go!\n","permalink":"https://ravichaganti.com/blog/get-set-go-first-program/","series":"Get Set GO","tags":["Golang","Go"],"title":"Get set Go - First program"},{"categories":["Golang","Go"],"content":" Go programming language isn\u0026rsquo;t new. It existed for more than 13 years now. The idea of Go language was first conceived in 2007 at Google by Ken Thompson, Robert Griesemer, and Rob Pike. Go was developed in response to some of the challenges the development teams at Google were facing internally. Some of these issues included ridiculously longer build times, baggage that legacy languages imposed on modern infrastructure / systems development, and uncontrolled dependencies among many other pain points. Go was designed to make it easy and efficient to program modern multicore systems, web service backends, and command line tools. The design considerations such as rigorous dependency management and efficiency at scale make Go one of the best modern programming languages.\n","date":"2020-08-03","excerpt":" Go programming language isn\u0026rsquo;t new. It existed for more than 13 years now. The idea of Go language was first conceived in 2007 at Google by Ken Thompson, Robert Griesemer, and Rob Pike. Go was developed in response to some of the challenges the development teams at Google were facing internally. Some of these issues included ridiculously longer build times, baggage that legacy languages imposed on modern infrastructure / systems development, and uncontrolled dependencies among many other pain points. Go was designed to make it easy and efficient to program modern multicore systems, web service backends, and command line tools. The design considerations such as rigorous dependency management and efficiency at scale make Go one of the best modern programming languages.\n","permalink":"https://ravichaganti.com/blog/get-set-go-introduction-to-go-lang/","series":"Get Set GO","tags":["Golang","Go"],"title":"Get set Go - Introduction to Go language"},{"categories":["Azure Resource Manager","Azure","ARM Template"],"content":" Expressions in ARM template language are a way to reduce complexity in the templates. Using parameters and variables in ARM templates always requires the use of expressions. Parameter and variable values are combined with standard (built-in) template functions (STF) to create complex expressions to implement the business requirements and implement known configurations. Updated ARM template syntax introduced the ability to implement user-defined functions for complicated expressions and use repeatedly in your templates. In this part, you will learn more about standard template functions and learn how to implement user-defined functions.\n","date":"2020-07-31","excerpt":" Expressions in ARM template language are a way to reduce complexity in the templates. Using parameters and variables in ARM templates always requires the use of expressions. Parameter and variable values are combined with standard (built-in) template functions (STF) to create complex expressions to implement the business requirements and implement known configurations. Updated ARM template syntax introduced the ability to implement user-defined functions for complicated expressions and use repeatedly in your templates. In this part, you will learn more about standard template functions and learn how to implement user-defined functions.\n","permalink":"https://ravichaganti.com/blog/azure-resource-manager-using-functions-in-arm-templates/","series":"Azure Resource Manager In 30 Days","tags":["Azure Resource Manager","Azure","ARM Template"],"title":"Azure Resource Manager - Using functions in ARM templates"},{"categories":["Azure Resource Manager","Azure","ARM Template"],"content":" So far in this series, you learned how to use VS Code and ARM Tools extension to get started with the ARM template development, how to perform a subscription scoped deployment to create a resource group and then looked at resource group scoped deployment to create a storage account and a virtual network resources. You learned about parameterizing the ARM template so that it becomes reusable. Equipped with that knowledge, you can now start digging into expressions and variables in the ARM templates.\n","date":"2020-07-30","excerpt":" So far in this series, you learned how to use VS Code and ARM Tools extension to get started with the ARM template development, how to perform a subscription scoped deployment to create a resource group and then looked at resource group scoped deployment to create a storage account and a virtual network resources. You learned about parameterizing the ARM template so that it becomes reusable. Equipped with that knowledge, you can now start digging into expressions and variables in the ARM templates.\n","permalink":"https://ravichaganti.com/blog/azure-resource-manager-in-30-days-using-expressions-and-variables-in-arm-templates/","series":"Azure Resource Manager In 30 Days","tags":["Azure Resource Manager","Azure","ARM Template"],"title":"Azure Resource Manager - Using expressions and variables in ARM templates"},{"categories":["Azure Resource Manager","Azure","ARM Template"],"content":" In the last part of this series, you learned the template syntax and authored an ARM template that provisions the resource group needed for the above architecture. This deployment was performed at the subscription level using Azure CLI. In this part, you will create another template for performing additional resource \u0026ndash; storage account and virtual network \u0026ndash; provisioning at the resource group level. You will, then, parameterize this template to understand how to add parameters to ARM templates.\n","date":"2020-07-24","excerpt":" In the last part of this series, you learned the template syntax and authored an ARM template that provisions the resource group needed for the above architecture. This deployment was performed at the subscription level using Azure CLI. In this part, you will create another template for performing additional resource \u0026ndash; storage account and virtual network \u0026ndash; provisioning at the resource group level. You will, then, parameterize this template to understand how to add parameters to ARM templates.\n","permalink":"https://ravichaganti.com/blog/azure-resource-manager-adding-parameters-to-arm-templates/","series":"Azure Resource Manager In 30 Days","tags":["Azure Resource Manager","Azure","ARM Template"],"title":"Azure Resource Manager - Adding parameters to ARM templates"},{"categories":["Azure Resource Manager","Azure","ARM Template"],"content":"In the last two parts of the series, you have seen a brief introduction to Azure Resource Manager and the services that complement ARM to extend its functionality or support the services offered by ARM. You also looked at an overview of ARM templates and the tools available to design, author, and deploy these templates.\nStarting this part of the series for the next few days, you will start learning about authoring ARM templates right from the basics and to the advanced template syntax and techniques with a goal to build an ARM template that helps provision the following architecture.\n","date":"2020-07-23","excerpt":"In the last two parts of the series, you have seen a brief introduction to Azure Resource Manager and the services that complement ARM to extend its functionality or support the services offered by ARM. You also looked at an overview of ARM templates and the tools available to design, author, and deploy these templates.\nStarting this part of the series for the next few days, you will start learning about authoring ARM templates right from the basics and to the advanced template syntax and techniques with a goal to build an ARM template that helps provision the following architecture.\n","permalink":"https://ravichaganti.com/blog/azure-resource-manager-arm-template-basics/","series":"Azure Resource Manager In 30 Days","tags":["Azure Resource Manager","Azure","ARM Template"],"title":"Azure Resource Manager - ARM template basics"},{"categories":["GitHub","Hub","CLI"],"content":"As I started writing more in markdown and using GitHub pages, my work with git and GitHub increased quite a bit. At times, I find myself fighting with git conflicts and merges. I am not an expert in git command-line and in a complex scenario, I figure my way out looking for some help.\nYou may have already seen in my articles that I use GitHub CLI a lot to work with my GitHub repositories, pull requests, and issues. I recently started using another CLI tool from GitHub called hub. Hub is an extension to git command-line and makes working with GitHub from the command-line a breeze.\n","date":"2020-07-23","excerpt":"As I started writing more in markdown and using GitHub pages, my work with git and GitHub increased quite a bit. At times, I find myself fighting with git conflicts and merges. I am not an expert in git command-line and in a complex scenario, I figure my way out looking for some help.\nYou may have already seen in my articles that I use GitHub CLI a lot to work with my GitHub repositories, pull requests, and issues. I recently started using another CLI tool from GitHub called hub. Hub is an extension to git command-line and makes working with GitHub from the command-line a breeze.\n","permalink":"https://ravichaganti.com/blog/github-hub-cli-an-extension-to-git-command-line/","series":null,"tags":["GitHub","Hub","CLI"],"title":"GitHub Hub CLI - An extension to git command-line"},{"categories":["Azure Resource Manager","Azure","ARM Template"],"content":"The first part of this series of articles on Azure Resource Manager (ARM) provided a quick overview of ARM. You looked a quick introduction to ARM templates as well and looked at an overview of different template deployment methods. In this part of the series, we will look at different methods to author ARM templates and an in-depth look at preferred deployment methods. You can choose any of the methods mentioned here but this series of articles will use one preferred method each for authoring and deploying templates. You will read more about those methods and the reasons behind that choice as well.\n","date":"2020-07-17","excerpt":"The first part of this series of articles on Azure Resource Manager (ARM) provided a quick overview of ARM. You looked a quick introduction to ARM templates as well and looked at an overview of different template deployment methods. In this part of the series, we will look at different methods to author ARM templates and an in-depth look at preferred deployment methods. You can choose any of the methods mentioned here but this series of articles will use one preferred method each for authoring and deploying templates. You will read more about those methods and the reasons behind that choice as well.\n","permalink":"https://ravichaganti.com/blog/azure-resource-manager-tools-for-arm-template-design-authoring-and-deployment/","series":"Azure Resource Manager In 30 Days","tags":["Azure Resource Manager","Azure","ARM Template"],"title":"Azure Resource Manager - Tools for ARM template design, authoring, and deployment"},{"categories":["Azure Resource Manager","Azure"],"content":"A while ago, I had written a series of articles introducing and diving deep into authoring Azure Resource Manager (ARM) templates. A few things have changed in authoring ARM templates and new features got added in the recent past. I thought it is probably a better time to revisit and do it all over again. At the same time, I thought why just limit to just authoring ARM templates. Over the years, I made notes around ARM and learned quite a bit. Starting today, I will share those notes with you here.\n","date":"2020-07-16","excerpt":"A while ago, I had written a series of articles introducing and diving deep into authoring Azure Resource Manager (ARM) templates. A few things have changed in authoring ARM templates and new features got added in the recent past. I thought it is probably a better time to revisit and do it all over again. At the same time, I thought why just limit to just authoring ARM templates. Over the years, I made notes around ARM and learned quite a bit. Starting today, I will share those notes with you here.\n","permalink":"https://ravichaganti.com/blog/azure-resource-manager-introduction/","series":"Azure Resource Manager In 30 Days","tags":["Azure Resource Manager","Azure"],"title":"Azure Resource Manager - Introduction"},{"categories":["PowerShell","GitHub"],"content":" Git.io \u0026ndash; service by GitHub \u0026ndash; can be used generate the short URLs for any GitHub.com based URL. You can navigate to Git.io and paste a GitHub URL into the input box and generate a short URL. Note that this works only with GitHub.com URLs.\nI have been using gists a lot lately and the URL to gists is usually very long and includes guids. For these gist URLs, I have been using the git.io service and wrapped that in a quick PowerShell module to help me generate these URLs. Today, I published it on GitHub and PowerShell Gallery for you to use it as well.\n","date":"2020-07-15","excerpt":" Git.io \u0026ndash; service by GitHub \u0026ndash; can be used generate the short URLs for any GitHub.com based URL. You can navigate to Git.io and paste a GitHub URL into the input box and generate a short URL. Note that this works only with GitHub.com URLs.\nI have been using gists a lot lately and the URL to gists is usually very long and includes guids. For these gist URLs, I have been using the git.io service and wrapped that in a quick PowerShell module to help me generate these URLs. Today, I published it on GitHub and PowerShell Gallery for you to use it as well.\n","permalink":"https://ravichaganti.com/blog/powershell-commands-to-generate-git-io-shorturls/","series":null,"tags":["PowerShell","GitHub"],"title":"PowerShell commands to generate Git.io shorturls"},{"categories":["Hugo"],"content":"One of the to-do list items I had for this static blog site was to figure out a way to add page views counter to every article. This is especially important for PowerShell Magazine articles as we move that to a static site as well. I tried looking for a few solutions but found mostly things that would require playing with JavaScript.\nWhile looking at different GitHub profile pages this morning, I came across a visitor counter on Tyler\u0026rsquo;s page. This piqued my interest and looked at how he was generating it. It was made possible through a service hosted on glitch.me. There is a GitHub repo that contains the source for this. At first, it seemed like a thing only for GitHub readme markdown but looking at the docs, I realized that I can embed that in simple webpages too.\n","date":"2020-07-10","excerpt":"One of the to-do list items I had for this static blog site was to figure out a way to add page views counter to every article. This is especially important for PowerShell Magazine articles as we move that to a static site as well. I tried looking for a few solutions but found mostly things that would require playing with JavaScript.\nWhile looking at different GitHub profile pages this morning, I came across a visitor counter on Tyler\u0026rsquo;s page. This piqued my interest and looked at how he was generating it. It was made possible through a service hosted on glitch.me. There is a GitHub repo that contains the source for this. At first, it seemed like a thing only for GitHub readme markdown but looking at the docs, I realized that I can embed that in simple webpages too.\n","permalink":"https://ravichaganti.com/blog/adding-visitor-counter-to-statically-generated-web-pages/","series":null,"tags":["Hugo"],"title":"Adding visitor counter to statically generated web pages"},{"categories":["Hugo"],"content":"In the past I wrote here about the Az Deploy button shortcode and the channel9 video embed shortcode for Hugo generated static pages. I have been creating some simple shortcodes for my own use on this blog as I start writing on different technologies again. A couple of more shortcodes I added recently are for the ARM template visualize button and launching Azure Cloud Shell.\nToday I decided to publish these shortcodes as a collection on GitHub. Instead of writing about each and every shortcode \u0026ndash; unless it has significant value to others as well \u0026ndash; this article will get updated every time I publish a new shortcode.\n","date":"2020-07-08","excerpt":"In the past I wrote here about the Az Deploy button shortcode and the channel9 video embed shortcode for Hugo generated static pages. I have been creating some simple shortcodes for my own use on this blog as I start writing on different technologies again. A couple of more shortcodes I added recently are for the ARM template visualize button and launching Azure Cloud Shell.\nToday I decided to publish these shortcodes as a collection on GitHub. Instead of writing about each and every shortcode \u0026ndash; unless it has significant value to others as well \u0026ndash; this article will get updated every time I publish a new shortcode.\n","permalink":"https://ravichaganti.com/blog/my-custom-hugo-shortcode-collection/","series":null,"tags":["Hugo"],"title":"My custom Hugo shortcode collection"},{"categories":["Hugo","GitHub","GitHub Actions"],"content":"Ever since I moved to this site/blog to static pages using Hugo and GitHub pages, I have been finding ways to optimize the publishing experience. If you ever used Wordpress, the plugins that are available to customize the site look and feel and functionality will spoil you. They make your life easy by extending base functionality and you can achieve pretty much anything you want as long as there is a plugin for that and you will always find one. Moving from such an environment to a static page generator makes you feel that you have to do all the heavy lifting.\n","date":"2020-07-06","excerpt":"Ever since I moved to this site/blog to static pages using Hugo and GitHub pages, I have been finding ways to optimize the publishing experience. If you ever used Wordpress, the plugins that are available to customize the site look and feel and functionality will spoil you. They make your life easy by extending base functionality and you can achieve pretty much anything you want as long as there is a plugin for that and you will always find one. Moving from such an environment to a static page generator makes you feel that you have to do all the heavy lifting.\n","permalink":"https://ravichaganti.com/blog/github-workflow-for-streamlined-publishing-of-static-pages/","series":null,"tags":["Hugo","GitHub","GitHub Actions"],"title":"GitHub workflow for streamlined publishing of static pages"},{"categories":["Community","MVP"],"content":"July 1st of every year is a hit-refresh or F5 day for most of us in the Microsoft MVP community. This year is no different.\nI will be a Cloud \u0026amp; Data Center Management (CDM) MVP for another year. This is my 12th award and still excited the same as my first year in the MVP award program. The last MVP year (2019-2020) was good with PowerShell Conference Asia moving to India and being super successful with over 230 attendees. For the upcoming MVP year (2020-2021), I have a good number of things lined up on this blog already. You will start seeing those contributions starting this month. I am in the process (very slow) of moving PowerShell Magazine as well to a static site so that it becomes easy to maintain and author more articles. Stay tuned for these updates.\n","date":"2020-07-01","excerpt":"July 1st of every year is a hit-refresh or F5 day for most of us in the Microsoft MVP community. This year is no different.\nI will be a Cloud \u0026amp; Data Center Management (CDM) MVP for another year. This is my 12th award and still excited the same as my first year in the MVP award program. The last MVP year (2019-2020) was good with PowerShell Conference Asia moving to India and being super successful with over 230 attendees. For the upcoming MVP year (2020-2021), I have a good number of things lined up on this blog already. You will start seeing those contributions starting this month. I am in the process (very slow) of moving PowerShell Magazine as well to a static site so that it becomes easy to maintain and author more articles. Stay tuned for these updates.\n","permalink":"https://ravichaganti.com/blog/micosoft-mvp-for-another-year/","series":null,"tags":["MVP","Microsoft MVP"],"title":"Microsoft MVP for another year"},{"categories":["GitHub"],"content":"After I moved to a static site hosted on GitHub Pages, I was looking at different options to share the code snippets in a better way. With the Hugo generated static pages, there are a few options for code sharing in an article.\nYou can use the simple pre-formatted text in markdown. This is usually done by enclosing code snippet in ```. This appears (in Hugo Coder theme I am using) as a big black block and has no way to choose the right syntax highlighting based on what programming language the snippet is written in. There are no line numbers or no highlighting of lines in a code snippet and so on.\n","date":"2020-06-16","excerpt":"After I moved to a static site hosted on GitHub Pages, I was looking at different options to share the code snippets in a better way. With the Hugo generated static pages, there are a few options for code sharing in an article.\nYou can use the simple pre-formatted text in markdown. This is usually done by enclosing code snippet in ```. This appears (in Hugo Coder theme I am using) as a big black block and has no way to choose the right syntax highlighting based on what programming language the snippet is written in. There are no line numbers or no highlighting of lines in a code snippet and so on.\n","permalink":"https://ravichaganti.com/blog/how-i-use-gists-to-store-and-display-code-snippets-in-blog-posts/","series":null,"tags":["Gists","GitHub"],"title":"How I use GitHub Gists to store and display code snippets in blog posts"},{"categories":["Hugo"],"content":"I have been trying a few things with my new blogging platform here and in the preparation for a new series of articles, I wanted the ability to embed Channel9 videos. This is Hugo platform! So, it was not a big deal. I just had to create another shortcode like the one I created for Deploy to Azure button.\nHere is the code for the shortcode.\nGitHub Gist This code snippet requires your consent to load content from GitHub, which may set cookies. Enable GitHub Gist rchaganti/056a02f289d7d5415c17d27082ee753b ","date":"2020-06-14","excerpt":"I have been trying a few things with my new blogging platform here and in the preparation for a new series of articles, I wanted the ability to embed Channel9 videos. This is Hugo platform! So, it was not a big deal. I just had to create another shortcode like the one I created for Deploy to Azure button.\nHere is the code for the shortcode.\nGitHub Gist This code snippet requires your consent to load content from GitHub, which may set cookies. Enable GitHub Gist rchaganti/056a02f289d7d5415c17d27082ee753b ","permalink":"https://ravichaganti.com/blog/embedding-channel9-videos-in-hugo-static-pages/","series":null,"tags":["Hugo"],"title":"Embedding Channel9 Videos in Hugo Static Pages"},{"categories":["Hugo"],"content":"As I moved to this new implementation of the blog using Hugo and GitHub pages, I decided to move older article series around authoring Azure Resource Manager templates. This series was one of the most visited ones on this blog. This series provided an incremental way to learn how to author ARM templates and deploy these ARM templates. In each of these articles, I added a \u0026ldquo;Deploy to Azure Button\u0026rdquo; that you could just click and open the template directly in Azure Portal ready for deployment. The code behind this button usually looks like this.\n","date":"2020-05-31","excerpt":"As I moved to this new implementation of the blog using Hugo and GitHub pages, I decided to move older article series around authoring Azure Resource Manager templates. This series was one of the most visited ones on this blog. This series provided an incremental way to learn how to author ARM templates and deploy these ARM templates. In each of these articles, I added a \u0026ldquo;Deploy to Azure Button\u0026rdquo; that you could just click and open the template directly in Azure Portal ready for deployment. The code behind this button usually looks like this.\n","permalink":"https://ravichaganti.com/blog/adding-azdeploy-button-in-static-pages-using-hugo/","series":null,"tags":["Hugo"],"title":"Hugo shortcode for Deploy to Azure Button in a Static Page"},{"categories":["Hugo","GitHub"],"content":" It has been a while since I wrote something here. I was using a Digital Ocean droplet to run this blog using self-hosted version of Wordpress. Overall, it was good experience but there are issues with Wordpress installs. While it allows greater levels of customization, when all you need is just sharing your ideas, it becomes rather heavy. Also, the recent vulnerabilities made me think about it again. While I was having this thought process, I came across a few sites hosted on GitHub pages using Jekyll and simple static pages. I really wanted to move but moving from Wordpress to static site isn\u0026rsquo;t an easy option. There are Wordpress plugins available to export to markdown format and then host the same on GitHub pages. This is done using Hugo. While, on paper, it looks very easy job, it is actually not. The exported markdown files won\u0026rsquo;t be compatible with your selected Hugo theme. As I was wondering about this whole process, Chen came to the rescue and gave me a head start. After reviewing what he sent and doing some more research, I decided to build the site from scratch.\n","date":"2020-05-31","excerpt":" It has been a while since I wrote something here. I was using a Digital Ocean droplet to run this blog using self-hosted version of Wordpress. Overall, it was good experience but there are issues with Wordpress installs. While it allows greater levels of customization, when all you need is just sharing your ideas, it becomes rather heavy. Also, the recent vulnerabilities made me think about it again. While I was having this thought process, I came across a few sites hosted on GitHub pages using Jekyll and simple static pages. I really wanted to move but moving from Wordpress to static site isn\u0026rsquo;t an easy option. There are Wordpress plugins available to export to markdown format and then host the same on GitHub pages. This is done using Hugo. While, on paper, it looks very easy job, it is actually not. The exported markdown files won\u0026rsquo;t be compatible with your selected Hugo theme. As I was wondering about this whole process, Chen came to the rescue and gave me a head start. After reviewing what he sent and doing some more research, I decided to build the site from scratch.\n","permalink":"https://ravichaganti.com/blog/moved-to-static-site-using-hugo-and-github-pages/","series":null,"tags":["Hugo","GitHub"],"title":"Moved Blog to a Static Site Using Hugo and GitHub Pages"},{"categories":["Azure CLI","Azure","Bangalore IT Pro","Presentations"],"content":"I had the opportunity over the weekend to speak at the Global Azure Bootcamp organized by local Microsoft user groups. This event was held at ABB office in Bangalore and I must say that they have done a splendid job. It was a very well organized event. I had only one session and it was about Azure CLI 2.0 Tips and Tricks. I mentioned earlier that I am using CLI mostly these days to work with Azure resources and in this session I shared some tips and tricks around making it easier to work with Azure resource management using Azure CLI 2.0.\n","date":"2019-04-29","excerpt":"I had the opportunity over the weekend to speak at the Global Azure Bootcamp organized by local Microsoft user groups. This event was held at ABB office in Bangalore and I must say that they have done a splendid job. It was a very well organized event. I had only one session and it was about Azure CLI 2.0 Tips and Tricks. I mentioned earlier that I am using CLI mostly these days to work with Azure resources and in this session I shared some tips and tricks around making it easier to work with Azure resource management using Azure CLI 2.0.\n","permalink":"https://ravichaganti.com/blog/slides-and-demo-scripts-from-azure-cli-2-0-tips-and-tricks-session-at-globalazurebootcamp/","series":null,"tags":["Azure","AzCli"],"title":"Slides: Global Azure Bootcamp - Azure CLI 2.0"},{"categories":["Bangalore IT Pro","Bangalore UG Meet","Presentations"],"content":"At today’s Bangalore IT Pro and PowerShell Bangalore User Group (PSBUG) event, I had the opportunity to showcase the PSKoans module by Joel Sallow. This module has a set of Pester tests that you have to fix as you proceed in your efforts towards mastering PowerShell.\nI have found this method engaging and decided that I must show this to the community.\n","date":"2019-02-16","excerpt":"At today’s Bangalore IT Pro and PowerShell Bangalore User Group (PSBUG) event, I had the opportunity to showcase the PSKoans module by Joel Sallow. This module has a set of Pester tests that you have to fix as you proceed in your efforts towards mastering PowerShell.\nI have found this method engaging and decided that I must show this to the community.\n","permalink":"https://ravichaganti.com/blog/session-slides-tests-driven-powershell-learning-using-pskoans/","series":null,"tags":["BITPro","PowerShell","PSBug","twitch"],"title":"Slides: BITPro UG Meet - Tests Driven PowerShell Learning using PSKoans"},{"categories":["Azure PowerShell","Azure CLI","Azure","Presentations"],"content":"I had the opportunity to speak at the inaugural edition of Experts Live India 2019 over the weekend. It was a great experience. The organizers did a great job even when there were teething facilities issues that plagued the event right from the start.\nMy first session was on Azure at the command line. In this session, I walked through both Az CLI 2.0 and Az PowerShell modules and explained the differences to help the audience choose the right tool for their job. The slides do not contain a huge deal of information as I preferred showing the audience a good demo to understand the differences.\n","date":"2019-01-20","excerpt":"I had the opportunity to speak at the inaugural edition of Experts Live India 2019 over the weekend. It was a great experience. The organizers did a great job even when there were teething facilities issues that plagued the event right from the start.\nMy first session was on Azure at the command line. In this session, I walked through both Az CLI 2.0 and Az PowerShell modules and explained the differences to help the audience choose the right tool for their job. The slides do not contain a huge deal of information as I preferred showing the audience a good demo to understand the differences.\n","permalink":"https://ravichaganti.com/blog/session-slides-experts-live-india-azure-at-the-command-line/","series":null,"tags":["Azure PowerShell","AzCli","Azure"],"title":"Slides: Experts Live India – Azure at the command line"},{"categories":["PowerShell","Presentations"],"content":"I had the opportunity to speak at the inaugural edition of Experts Live India 2019 over the weekend. It was a great experience. The organizers did a great job even when there were teething facilities issues that plagued the event right from the start.\nI had planned only for one session at the event but as some international speakers could not make it to the event, I was asked to take up one more session and I chose to show the audience SHiPS module. Hierarchical data can be read as a file system in PowerShell using SHiPS open source module. In this session, I walked the audience through what are providers and what is the advantage of implementing PowerShel providers using the SHiPS module.\n","date":"2019-01-20","excerpt":"I had the opportunity to speak at the inaugural edition of Experts Live India 2019 over the weekend. It was a great experience. The organizers did a great job even when there were teething facilities issues that plagued the event right from the start.\nI had planned only for one session at the event but as some international speakers could not make it to the event, I was asked to take up one more session and I chose to show the audience SHiPS module. Hierarchical data can be read as a file system in PowerShell using SHiPS open source module. In this session, I walked the audience through what are providers and what is the advantage of implementing PowerShel providers using the SHiPS module.\n","permalink":"https://ravichaganti.com/blog/session-slides-experts-live-india-powershell-data-as-file-system/","series":null,"tags":["PowerShell","SHiPS"],"title":"Slides: Experts Live India – PowerShell Data as File System"},{"categories":["DevOps","Azure","Presentations"],"content":"I had the privilege to join the Miracle team at Visakhapatnam today for an Azure MVP bootcamp. I spoke about Microsoft Azure Cloud and DevOps. This event, I must say, it a very well organized and orchestrated. I have been to conferences and events in India and outside India and never seen this level of care of speakers and attendees anywhere.\nI started my day with a good morning walk along the beach and just loved it. I wish I get to do this often.\n","date":"2016-11-12","excerpt":"I had the privilege to join the Miracle team at Visakhapatnam today for an Azure MVP bootcamp. I spoke about Microsoft Azure Cloud and DevOps. This event, I must say, it a very well organized and orchestrated. I have been to conferences and events in India and outside India and never seen this level of care of speakers and attendees anywhere.\nI started my day with a good morning walk along the beach and just loved it. I wish I get to do this often.\n","permalink":"https://ravichaganti.com/blog/slides-from-azure-mvp-bootcamp-microsoft-azure-cloud-and-devops/","series":null,"tags":["DevOps","Azure"],"title":"Slides: Azure MVP Bootcamp – Microsoft Azure Cloud and DevOps"},{"categories":["PSConf","Presentations"],"content":"Yet another successful conference this year. All kudos to Matt, Milton, Sebastian, and Ben for making this year’s PowerShell Conference Asia such a super hit.\nI had a great time speaking about Developing Infrastructure Code for CI \u0026amp; CD and Using PowerShell DSC with AWS Cloud. I have had the opportunity to do an impromptu session with Deepak \u0026amp; Matt on the release pipeline. Overall, I am really happy with the way all my sessions went through and the response from attendees.\n","date":"2016-10-24","excerpt":"Yet another successful conference this year. All kudos to Matt, Milton, Sebastian, and Ben for making this year’s PowerShell Conference Asia such a super hit.\nI had a great time speaking about Developing Infrastructure Code for CI \u0026amp; CD and Using PowerShell DSC with AWS Cloud. I have had the opportunity to do an impromptu session with Deepak \u0026amp; Matt on the release pipeline. Overall, I am really happy with the way all my sessions went through and the response from attendees.\n","permalink":"https://ravichaganti.com/blog/powershell-conference-asia-2016-slides-and-demo-scripts/","series":null,"tags":["PSConf","Asia"],"title":"Slides: PowerShell Conference Asia 2016"},{"categories":["PSConf","Europe","Presentations"],"content":"I returned home from PowerShell Conference EU this morning. Wow, what an amazing event was that! Seriously, right from the opening event to each and every session, this was truly the global PowerShell conference with attendees from more than twelve countries and speakers from four continents.\nI had two sessions at this conference and these were very well received. I uploaded the slides and demo scripts to a PSConfEU Github repository. Feel free to use them as needed. For those who prefer, Slideshare instead, here are the slide decks. The sessions recordings should be online in a couple of weeks. I will updated this post.\n","date":"2016-04-25","excerpt":"I returned home from PowerShell Conference EU this morning. Wow, what an amazing event was that! Seriously, right from the opening event to each and every session, this was truly the global PowerShell conference with attendees from more than twelve countries and speakers from four continents.\nI had two sessions at this conference and these were very well received. I uploaded the slides and demo scripts to a PSConfEU Github repository. Feel free to use them as needed. For those who prefer, Slideshare instead, here are the slide decks. The sessions recordings should be online in a couple of weeks. I will updated this post.\n","permalink":"https://ravichaganti.com/blog/session-slides-and-demo-scripts-from-powershell-conference-eu-2016/","series":null,"tags":["PSConf","Europe"],"title":"Slides: PowerShell Conference EU 2016"},{"categories":["Azure Resource Manager","Azure","ARM Templates"],"content":"When testing ARM templates, I typically use the custom template deployment option in the Azure Portal. This UI option just got better! This deployment option now supports lists the parameters, variables, and resources used in template in a nice treeview navigation.\nTo start a new deployment, you can click on New -\u0026gt; Template Deployment.\nThis opens up the Custom Deployment blade. Click on Edit Template.\n","date":"2016-03-29","excerpt":"When testing ARM templates, I typically use the custom template deployment option in the Azure Portal. This UI option just got better! This deployment option now supports lists the parameters, variables, and resources used in template in a nice treeview navigation.\nTo start a new deployment, you can click on New -\u0026gt; Template Deployment.\nThis opens up the Custom Deployment blade. Click on Edit Template.\n","permalink":"https://ravichaganti.com/blog/custom-template-deployment-improvements-in-azure-portal/","series":"ARM Templates","tags":["Azure Resource Manager","Azure","ARM Templates"],"title":"Custom Template Deployment Improvements in Azure Portal"},{"categories":["Azure Resource Manager","Azure","ARM Templates"],"content":"This subject won\u0026rsquo;t really need a post of its own but I will do it anyway. In the previous part of this ARM series, I showed how we can use the domain join extension instead of DSC to join a VM to an existing AD domain. This resulted is huge savings in time taken to deploy the entire scenario. When I was talking to my good friend, fellow PowerShell MVP and all-things-Azure guru, Ben Gelens, he was quick to point that the delays when using DSC extension here could be due to the install of WMF 5.0. Indeed!\n","date":"2016-02-15","excerpt":"This subject won\u0026rsquo;t really need a post of its own but I will do it anyway. In the previous part of this ARM series, I showed how we can use the domain join extension instead of DSC to join a VM to an existing AD domain. This resulted is huge savings in time taken to deploy the entire scenario. When I was talking to my good friend, fellow PowerShell MVP and all-things-Azure guru, Ben Gelens, he was quick to point that the delays when using DSC extension here could be due to the install of WMF 5.0. Indeed!\n","permalink":"https://ravichaganti.com/blog/building-azure-resource-manager-templates-forcing-wmf-4-0-when-using-dsc-extension/","series":"ARM Templates","tags":["Azure Resource Manager","Azure","ARM Templates"],"title":"Building Azure Resource Manager Templates – Forcing WMF 4.0 when using DSC Extension"},{"categories":["Azure Resource Manager","Azure","ARM Templates"],"content":"The scenario that we used to understand and build ARM templates contained a domain controller VM along with one or more VMs that joined the domain service hosted by the DC VM.\nTo make sure the VMs join the domain, we used PowerShell DSC configuration. One of the biggest quirks, at least what I faced, with DSC extension with ARM templates is that it takes little longer to complete. For example, the complete scenario deployment took almost 48 minutes to deploy. I am not making up that number. Here is the proof.\n","date":"2016-02-13","excerpt":"The scenario that we used to understand and build ARM templates contained a domain controller VM along with one or more VMs that joined the domain service hosted by the DC VM.\nTo make sure the VMs join the domain, we used PowerShell DSC configuration. One of the biggest quirks, at least what I faced, with DSC extension with ARM templates is that it takes little longer to complete. For example, the complete scenario deployment took almost 48 minutes to deploy. I am not making up that number. Here is the proof.\n","permalink":"https://ravichaganti.com/blog/building-azure-resource-manager-templates-using-domain-join-extension/","series":"ARM Templates","tags":["Azure Resource Manager","Azure","ARM Templates"],"title":"Building Azure Resource Manager Templates – Using Domain Join Extension"},{"categories":["Azure Resource Manager","Azure","ARM Templates"],"content":"In this series so far, we looked at building ARM templates by example. The focus was not really on the resource types or how to use resource definitions. Instead, our focus was on learning the basics of template language. To that extent, we have a scenario that we want to deploy and we are incrementally building the template for it.\nWhile building an ARM template for this, we looked at how to use parameters and variables. We looked at using copy object to create multiple instances of a resource type without really writing the resource definition multiple times. We went on to find out how we can define dependencies between different resource types so they are orchestrated in the right order. We looked at how we can decompose the template into purpose-specific external templates and how to link them together. While learning these concepts, we created a template that almost built the scenario we started with.\n","date":"2015-12-18","excerpt":"In this series so far, we looked at building ARM templates by example. The focus was not really on the resource types or how to use resource definitions. Instead, our focus was on learning the basics of template language. To that extent, we have a scenario that we want to deploy and we are incrementally building the template for it.\nWhile building an ARM template for this, we looked at how to use parameters and variables. We looked at using copy object to create multiple instances of a resource type without really writing the resource definition multiple times. We went on to find out how we can define dependencies between different resource types so they are orchestrated in the right order. We looked at how we can decompose the template into purpose-specific external templates and how to link them together. While learning these concepts, we created a template that almost built the scenario we started with.\n","permalink":"https://ravichaganti.com/blog/building-azure-resource-manager-templates-putting-it-all-together/","series":"ARM Templates","tags":["Azure Resource Manager","Azure","ARM Templates"],"title":"Building Azure Resource Manager Templates – Putting it all together"},{"categories":["Azure Resource Manager","Azure","ARM Templates"],"content":"One of the ARM template authoring best practices is to decompose the JSON template, if applicable, into multiple target-specific templates. Think of this as creating re-usable code. You can leverage the re-usable parts of your code within multiple aspects of your application or the deployment.\nFor linking different external templates within the main template, we need to define the Microsoft.Resources/deployments resource instance. Before we proceed let us look at the scenario for which we are building an ARM template.\n","date":"2015-12-14","excerpt":"One of the ARM template authoring best practices is to decompose the JSON template, if applicable, into multiple target-specific templates. Think of this as creating re-usable code. You can leverage the re-usable parts of your code within multiple aspects of your application or the deployment.\nFor linking different external templates within the main template, we need to define the Microsoft.Resources/deployments resource instance. Before we proceed let us look at the scenario for which we are building an ARM template.\n","permalink":"https://ravichaganti.com/blog/building-azure-resource-manager-templates-using-linked-templates/","series":"ARM Templates","tags":["Azure Resource Manager","Azure","ARM Templates"],"title":"Building Azure Resource Manager Templates – Using Linked Templates"},{"categories":["Azure Resource Manager","Azure","ARM Templates"],"content":"We will continue learning about building ARM templates by looking at how we can define dependencies between resources. To recap, here is the scenario we are working on.\nIn the earlier parts of this series, we created the storage account, virtual network, a public IP, a load balancer, and added all inbound NAT rules required for the virtual machine RDP access. If you notice, we have components that depend on others. For example, the inbound NAT rules depend on the load balancer. Similarly, VMs depend on network interfaces which in turn depend on the virtual network. In the absence of dependencies, ARM will attempt to deploy these resources in parallel which may result in errors. So, within the resource template, we need to define these dependencies so that ARM can make decisions about the deployment sequence. There are multiple ways of doing this.\n","date":"2015-12-08","excerpt":"We will continue learning about building ARM templates by looking at how we can define dependencies between resources. To recap, here is the scenario we are working on.\nIn the earlier parts of this series, we created the storage account, virtual network, a public IP, a load balancer, and added all inbound NAT rules required for the virtual machine RDP access. If you notice, we have components that depend on others. For example, the inbound NAT rules depend on the load balancer. Similarly, VMs depend on network interfaces which in turn depend on the virtual network. In the absence of dependencies, ARM will attempt to deploy these resources in parallel which may result in errors. So, within the resource template, we need to define these dependencies so that ARM can make decisions about the deployment sequence. There are multiple ways of doing this.\n","permalink":"https://ravichaganti.com/blog/building-azure-resource-manager-templates-defining-resource-dependencies/","series":"ARM Templates","tags":["Azure Resource Manager","Azure","ARM Templates"],"title":"Building Azure Resource Manager Templates – Defining Resource Dependencies"},{"categories":["Azure Resource Manager","Azure","ARM Templates"],"content":"If you are following this series, by now you know how to use parameters and variables in ARM template language. We used that knowledge to create a template that creates relevant things to like storage account and virtual network. Let us revisit the scenario.\nIn this part, we will extend the template to add publicIP, load balancer, and RDP endpoints for the virtual machines. Before we do that, let us review what we need. To achieve what we want in this, we will use copy object in the template.\n","date":"2015-11-17","excerpt":"If you are following this series, by now you know how to use parameters and variables in ARM template language. We used that knowledge to create a template that creates relevant things to like storage account and virtual network. Let us revisit the scenario.\nIn this part, we will extend the template to add publicIP, load balancer, and RDP endpoints for the virtual machines. Before we do that, let us review what we need. To achieve what we want in this, we will use copy object in the template.\n","permalink":"https://ravichaganti.com/blog/building-azure-resource-manager-templates-using-copy-object/","series":"ARM Templates","tags":["Azure Resource Manager","Azure","ARM Templates"],"title":"Building Azure Resource Manager Templates – Using Copy Object"},{"categories":["Azure Resource Manager","Azure","ARM Templates"],"content":"If you have been following this series on ARM templates, in the last part, we started with a sample scenario that we are using to build an ARM template. Here it is again.\nIn the last part, we completed creation of storage account required for backing the OS and data disks for virtual machines in the deployment. The next step in our scenario is to create the virtual network for the VM connectivity. A virtual network and any subnets required must exist before the creation of virtual machines. So, in today’s article, we will see how we can use variables in the ARM template language while incrementally building an ARM template for our scenario and add virtual network. Towards the end, we will review some best practices guidance with regards to using parameters and variables in developing ARM templates.\n","date":"2015-11-15","excerpt":"If you have been following this series on ARM templates, in the last part, we started with a sample scenario that we are using to build an ARM template. Here it is again.\nIn the last part, we completed creation of storage account required for backing the OS and data disks for virtual machines in the deployment. The next step in our scenario is to create the virtual network for the VM connectivity. A virtual network and any subnets required must exist before the creation of virtual machines. So, in today’s article, we will see how we can use variables in the ARM template language while incrementally building an ARM template for our scenario and add virtual network. Towards the end, we will review some best practices guidance with regards to using parameters and variables in developing ARM templates.\n","permalink":"https://ravichaganti.com/blog/building-azure-resource-manager-templates-using-variables/","series":"ARM Templates","tags":["Azure Resource Manager","Azure","ARM Templates"],"title":"Building Azure Resource Manager Templates – Using Variables"},{"categories":["Azure Resource Manager","Azure","ARM Templates"],"content":"In the earlier parts of this series, we briefly looked at different methods of deploying ARM templates and then basics of ARM template language. Starting today’s article, we will see our leaning in action. To get going with our leaning, we will start building the ARM template for the following scenario.\nWe will incrementally build this scenario by learning different aspects of ARM template language. We won’t be covering all resource types in Azure but we will cover every aspect of the ARM template language and functions and expressions used in the template language. We will also review best practices in building these ARM templates as we proceed forward in this series.\n","date":"2015-11-10","excerpt":"In the earlier parts of this series, we briefly looked at different methods of deploying ARM templates and then basics of ARM template language. Starting today’s article, we will see our leaning in action. To get going with our leaning, we will start building the ARM template for the following scenario.\nWe will incrementally build this scenario by learning different aspects of ARM template language. We won’t be covering all resource types in Azure but we will cover every aspect of the ARM template language and functions and expressions used in the template language. We will also review best practices in building these ARM templates as we proceed forward in this series.\n","permalink":"https://ravichaganti.com/blog/building-azure-resource-manager-templates-using-parameters/","series":"ARM Templates","tags":["Azure Resource Manager","Azure","ARM Templates"],"title":"Building Azure Resource Manager Templates – Using Parameters"},{"categories":["Azure","Azure Resource Manager","Presentations"],"content":" I had a great time at Future Unleashed 2015 talking about Authoring Azure Resource Manager Templates. This was a one-day technical event where there were 11 tracks covering different aspects from Cloud to Data to Analytics.\nThe breakout session setup was a little weird. There were no walls for the breakout session room (or whatever you call it). It was just a big expo hall with 11 tracks spread across like exhibitor booths. All the attendees had to wear a headset to hear the speaker.\n","date":"2015-11-09","excerpt":" I had a great time at Future Unleashed 2015 talking about Authoring Azure Resource Manager Templates. This was a one-day technical event where there were 11 tracks covering different aspects from Cloud to Data to Analytics.\nThe breakout session setup was a little weird. There were no walls for the breakout session room (or whatever you call it). It was just a big expo hall with 11 tracks spread across like exhibitor booths. All the attendees had to wear a headset to hear the speaker.\n","permalink":"https://ravichaganti.com/blog/slides-from-future-unleashed-2015-authoring-azure-resource-manager-templates/","series":null,"tags":["FutureUnleashed","Azure"],"title":"Slides: Future Unleashed – Authoring ARM Templates"},{"categories":["Azure Resource Manager","Azure","ARM Templates"],"content":"As a part of this series, we will go through the language semantics of writing ARM templates. We will explore each and every aspect of the ARM template language and go through multiple examples to understand the concepts better. We won’t focus much on the resource types and resource definitions until we complete the discussion around the language semantics and artifacts.\nLet us get started.\nTools for the job JSON templates for ARM can be edited in notepad too. But, there are better tools that can help us with this.\n","date":"2015-11-06","excerpt":"As a part of this series, we will go through the language semantics of writing ARM templates. We will explore each and every aspect of the ARM template language and go through multiple examples to understand the concepts better. We won’t focus much on the resource types and resource definitions until we complete the discussion around the language semantics and artifacts.\nLet us get started.\nTools for the job JSON templates for ARM can be edited in notepad too. But, there are better tools that can help us with this.\n","permalink":"https://ravichaganti.com/blog/building-azure-resource-manager-templates-the-basics/","series":"ARM Templates","tags":["Azure Resource Manager","Azure","ARM Templates"],"title":"Building Azure Resource Manager Templates – The Basics"},{"categories":["Azure Resource Manager","Azure","ARM Templates"],"content":"Azure Resource Manager isn’t a new thing! It was announced during Build 2014. ARM is certainly the preferred way, with more and more services getting ARM support, to deploy Azure services. Microsoft also announced that the upcoming Azure Stack release will feature Azure Resource Manager and the template deployment. This means that learning how to use ARM and write you own templates is an essential skill not just for public cloud but also for the private and hybrid cloud administrators.\n","date":"2015-11-02","excerpt":"Azure Resource Manager isn’t a new thing! It was announced during Build 2014. ARM is certainly the preferred way, with more and more services getting ARM support, to deploy Azure services. Microsoft also announced that the upcoming Azure Stack release will feature Azure Resource Manager and the template deployment. This means that learning how to use ARM and write you own templates is an essential skill not just for public cloud but also for the private and hybrid cloud administrators.\n","permalink":"https://ravichaganti.com/blog/building-azure-resource-manager-templates-an-introduction/","series":"ARM Templates","tags":["Azure Resource Manager","Azure","ARM Templates"],"title":"Building Azure Resource Manager Templates – An Introduction"},{"categories":["Containers"],"content":"In the earlier article, I explained the hurdles in the traditional and virtualized ways of implementing workloads. Also, we looked how the DevOps challenges are demanding changes the continuous delivery and integration processes. Towards the end, I’d mentioned that Containers are an answer.\nIn today’s article, we will see what are containers and some history behind containerization. Let us get started. In the subsequent parts, we will dig into each building block used within container technologies and understand how to use them.\n","date":"2015-02-06","excerpt":"In the earlier article, I explained the hurdles in the traditional and virtualized ways of implementing workloads. Also, we looked how the DevOps challenges are demanding changes the continuous delivery and integration processes. Towards the end, I’d mentioned that Containers are an answer.\nIn today’s article, we will see what are containers and some history behind containerization. Let us get started. In the subsequent parts, we will dig into each building block used within container technologies and understand how to use them.\n","permalink":"https://ravichaganti.com/blog/containers-what-are-they-and-their-history-part-2/","series":"Containers","tags":["Containers"],"title":"Containers – What are they? And, their history! – Part 2"},{"categories":["Cloud","Azure","Presentations"],"content":"I had the opportunity to do the keynote at the Microsoft Reboot Camp Bangalore. This is a community driven event with support from Microsoft. The theme for the event was cloud computing and Microsoft Cloud offerings.\nIn my keynote, I talked about what cloud computing means to the IT professionals and how they should get ready for the future.\nHere are the slides from my keynote.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: w4XP9qWqOyvpZP ","date":"2015-01-31","excerpt":"I had the opportunity to do the keynote at the Microsoft Reboot Camp Bangalore. This is a community driven event with support from Microsoft. The theme for the event was cloud computing and Microsoft Cloud offerings.\nIn my keynote, I talked about what cloud computing means to the IT professionals and how they should get ready for the future.\nHere are the slides from my keynote.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: w4XP9qWqOyvpZP ","permalink":"https://ravichaganti.com/blog/slides-from-reboot-camp-bangalore-keynote-cloud-computing-for-it-professionals/","series":null,"tags":["Bangalore IT Pro","Azure"],"title":"Slides: Reboot Camp Bangalore - Cloud Computing for IT Professionals"},{"categories":["Containers"],"content":"Containers? No, not the shipping containers but the much-hyped container technology in the computer industry. I am sure even if you have not used any of the existing container technologies, you must have at least read or heard about them.\nI am not the first one to write about containers and this is certainly not an in-depth overview of container technologies. I will eventually get there and show you how you can deploy different container technologies. This series of articles is about my own thoughts and a documentation for my own reference. In the process, I wish to help my readers as well.\n","date":"2015-01-20","excerpt":"Containers? No, not the shipping containers but the much-hyped container technology in the computer industry. I am sure even if you have not used any of the existing container technologies, you must have at least read or heard about them.\nI am not the first one to write about containers and this is certainly not an in-depth overview of container technologies. I will eventually get there and show you how you can deploy different container technologies. This series of articles is about my own thoughts and a documentation for my own reference. In the process, I wish to help my readers as well.\n","permalink":"https://ravichaganti.com/blog/containers-what-are-they-why-do-you-need-one-part-1/","series":"Containers","tags":["Containers"],"title":"Containers – What are they? Why do you need one? – Part 1"},{"categories":["Cloud","Azure","Presentations"],"content":"Microsoft Azure offers several services each categorized into one of the four major categories – Compute, Data, App, and Network Services. This session takes you through an overview of the Microsoft Azure Compute Services.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: 62eQ9o9FToFmEq ","date":"2014-08-24","excerpt":"Microsoft Azure offers several services each categorized into one of the four major categories – Compute, Data, App, and Network Services. This session takes you through an overview of the Microsoft Azure Compute Services.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: 62eQ9o9FToFmEq ","permalink":"https://ravichaganti.com/blog/session-slides-community-day-2014-introduction-to-microsoft-azure-compute/","series":null,"tags":["Bangalore IT Pro","Azure"],"title":"Slides: Community Day 2014 – Introduction to Microsoft Azure Compute"},{"categories":["Hyper-V","Bangalore IT Pro","Presentations"],"content":"Here are the session slides for my second talk on Hyper-V. In this session, I had introduced Hyper-V Replica and demonstrated how to manage Hyper-V replica in Windows Server 2012 and Server 2012 R2.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: uw9WkRyuz6OlId ","date":"2014-03-19","excerpt":"Here are the session slides for my second talk on Hyper-V. In this session, I had introduced Hyper-V Replica and demonstrated how to manage Hyper-V replica in Windows Server 2012 and Server 2012 R2.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: uw9WkRyuz6OlId ","permalink":"https://ravichaganti.com/blog/reboot-it-bangalore-2014-session-slides-hyper-v-replica/","series":null,"tags":["Bangalore IT Pro"],"title":"Slides: Reboot IT, Bangalore - Hyper-V Replica"},{"categories":["Hyper-V","Bangalore IT Pro","Presentations"],"content":"Here are the slides I used for my first session at the Reboot IT conference in Bangalore. We had over 130 attendees and the entire event was very well received.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: 3PSBj4JU4sFGIL ","date":"2014-03-19","excerpt":"Here are the slides I used for my first session at the Reboot IT conference in Bangalore. We had over 130 attendees and the entire event was very well received.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: 3PSBj4JU4sFGIL ","permalink":"https://ravichaganti.com/blog/reboot-it-bangalore-2014-session-slides-whats-new-in-server-2012-r2-hyper-v/","series":null,"tags":["Bangalore IT Pro","Azure"],"title":"Slides: Reboot IT, Bangalore - Whats new in Server 2012 R2 Hyper-V"},{"categories":["PowerShell","Bangalore IT Pro","Presentations"],"content":"I just completed my online session on PowerShell 4.0, First Look for the Singapore PowerShell User Group. It went on pretty well. Here are the slides I used for this session.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: 313hyQgdFB504w ","date":"2013-08-02","excerpt":"I just completed my online session on PowerShell 4.0, First Look for the Singapore PowerShell User Group. It went on pretty well. Here are the slides I used for this session.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: 313hyQgdFB504w ","permalink":"https://ravichaganti.com/blog/powershell-4-0-slides-and-session-recording-from-powershell-saturday-singapore/","series":null,"tags":["Bangalore IT Pro","PowerShell"],"title":"Slides: PowerShell Saturday - Windows PowerShell 4.0"},{"categories":["PowerShell","Bangalore IT Pro","Presentations"],"content":" SlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: y8zcQbeseSuep9 ","date":"2013-08-02","excerpt":" SlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: y8zcQbeseSuep9 ","permalink":"https://ravichaganti.com/blog/vtd-session-windows-powershell-3-0--a-first-look--session-recording/","series":null,"tags":["Bangalore IT Pro","PowerShell"],"title":"Slides: Virtual Tech Days - Windows PowerShell 3.0 – A first look"},{"categories":["DSC","Bangalore IT Pro","Presentations"],"content":"The Microsoft MVP community in India delivered a Virtual Tech Conference (VTC) online yesterday and I had the opportunity to talk about one my favorite topics in PowerShell 4.0 – Desired State Configuration. I used this opportunity to build a custom DSC resource for managing hosts file using DSC. It was a good learning experience for me. And, I see a lot more possibilities with this. Here are the slides I used for this session:\n","date":"2013-08-02","excerpt":"The Microsoft MVP community in India delivered a Virtual Tech Conference (VTC) online yesterday and I had the opportunity to talk about one my favorite topics in PowerShell 4.0 – Desired State Configuration. I used this opportunity to build a custom DSC resource for managing hosts file using DSC. It was a good learning experience for me. And, I see a lot more possibilities with this. Here are the slides I used for this session:\n","permalink":"https://ravichaganti.com/blog/slides-and-demo-scripts-from-my-desired-state-configuration-session-at-vtc-online-india/","series":null,"tags":["Bangalore IT Pro","DSC"],"title":"Slides: VTC Online - Desired State Configuration"},{"categories":["PowerShell","WQL","WMI"],"content":"While I was preparing a few demo scripts for a Bangalore IT Pro UG meet session, I tumbled upon on WMI event class Win32_VolumeChangeEvent. This one is interesting. It is derived from Win32_DeviceChangeEvent class and gives us the ability to monitor local drive events directly.For example, you can get a notification when a local drive or mount point gets removed or added. The following table shows a list of event types we can monitor.\n","date":"2011-08-21","excerpt":"While I was preparing a few demo scripts for a Bangalore IT Pro UG meet session, I tumbled upon on WMI event class Win32_VolumeChangeEvent. This one is interesting. It is derived from Win32_DeviceChangeEvent class and gives us the ability to monitor local drive events directly.For example, you can get a notification when a local drive or mount point gets removed or added. The following table shows a list of event types we can monitor.\n","permalink":"https://ravichaganti.com/blog/monitoring-volume-change-events-in-powershell-using-wmi/","series":"WQL via PowerShell","tags":["PowerShell","WQL","WMI"],"title":"Monitoring Volume Change Events in PowerShell using WMI"},{"categories":["PowerShell","Bangalore IT Pro","Presentations"],"content":"I did a session at @BangaloreITPro this afternoon and the topic was “PowerShell WMI Eventing for IT Pros”. This session’s focus was to give an introduction to WMI events and how to use them in system administration. Here are the slides and demo scripts I used.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: M0T4zDdJrgbj ","date":"2011-08-20","excerpt":"I did a session at @BangaloreITPro this afternoon and the topic was “PowerShell WMI Eventing for IT Pros”. This session’s focus was to give an introduction to WMI events and how to use them in system administration. Here are the slides and demo scripts I used.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: M0T4zDdJrgbj ","permalink":"https://ravichaganti.com/blog/bitpro-ug-meet-powershell-and-wmi-eventing-slides-demo-scripts/","series":null,"tags":["Bangalore IT Pro","PowerShell"],"title":"Slides: BITPro UG Meet - PowerShell and WMI Eventing"},{"categories":["PowerShell","WQL","WMI"],"content":"During a few load test iterations on a SharePoint farm, I started seeing some SQL exceptions in the application log of SharePoint servers. If you are familiar with SharePoint platform, you may have seen these events such as event ID 3355. This event complains that the SharePoint server cannot connect to SQL server. This need not really mean that the DB server is offline. So, to find out the real reason behind these event logs, I needed to start some trace activities whenever event ID 3355 gets logged.\n","date":"2011-06-24","excerpt":"During a few load test iterations on a SharePoint farm, I started seeing some SQL exceptions in the application log of SharePoint servers. If you are familiar with SharePoint platform, you may have seen these events such as event ID 3355. This event complains that the SharePoint server cannot connect to SQL server. This need not really mean that the DB server is offline. So, to find out the real reason behind these event logs, I needed to start some trace activities whenever event ID 3355 gets logged.\n","permalink":"https://ravichaganti.com/blog/attaching-scripts-or-tasks-to-windows-event-log-entries-using-powershell-and-wmi/","series":"WQL via PowerShell","tags":["PowerShell","WQL","WMI"],"title":"Attaching scripts or tasks to Windows event log entries using PowerShell and WMI"},{"categories":null,"content":"This eBook has been updated since the initial release.\nYou can download this ebook for free at https://www.ravichaganti.com/ebooks/AlaymansguidetoPowerShell2remotingv2.pdf.\nHere are the additions in the update.\nChapter 2 Enable remoting for only a specific network adapter Remoting in an Enterprise\nChapter 3 Run script files on remote computers\nChapter 9 Added a note on Domain controller credential delegation\n​\tUpdated a note on Windows XP/2003 support for CredSSP\nAppendix A Added some more FAQ\n","date":"2011-06-24","excerpt":"This eBook has been updated since the initial release.\nYou can download this ebook for free at https://www.ravichaganti.com/ebooks/AlaymansguidetoPowerShell2remotingv2.pdf.\nHere are the additions in the update.\nChapter 2 Enable remoting for only a specific network adapter Remoting in an Enterprise\nChapter 3 Run script files on remote computers\nChapter 9 Added a note on Domain controller credential delegation\n​\tUpdated a note on Windows XP/2003 support for CredSSP\nAppendix A Added some more FAQ\n","permalink":"https://ravichaganti.com/blog/laymans-guide-to-powershell-2-0-remoting/","series":null,"tags":null,"title":"ebook: Layman's Guide to PowerShell 2.0 remoting"},{"categories":null,"content":"This eBook has been updated since the initial release.\nYou can download this ebook at no cost at https://www.ravichaganti.com/ebooks/WMIQueryLanguageviaPowerShellv20.pdf.\nHere are the additions in the update.\nChapter 2 Enable remoting for only a specific network adapter Remoting in an Enterprise\nChapter 3 Run script files on remote computers\nChapter 9 Added a note on Domain controller credential delegation\n​\tUpdated a note on Windows XP/2003 support for CredSSP\nAppendix A Added some more FAQ\n","date":"2011-06-24","excerpt":"This eBook has been updated since the initial release.\nYou can download this ebook at no cost at https://www.ravichaganti.com/ebooks/WMIQueryLanguageviaPowerShellv20.pdf.\nHere are the additions in the update.\nChapter 2 Enable remoting for only a specific network adapter Remoting in an Enterprise\nChapter 3 Run script files on remote computers\nChapter 9 Added a note on Domain controller credential delegation\n​\tUpdated a note on Windows XP/2003 support for CredSSP\nAppendix A Added some more FAQ\n","permalink":"https://ravichaganti.com/blog/ebook-wmi-query-language-wql-via-powershell/","series":null,"tags":null,"title":"ebook: WMI query language (WQL) via PowerShell"},{"categories":["PowerShell","WQL","WMI"],"content":"Update: Based on feedback from @ShayLevy, we don’t have to send the background job object to Event action as a variable. It is already available as $event.Sender or just $sender. You can see that in the image below. I just picked up a wrong example to explain the -MessageData parameter. Although, the article originally showed a background job as an example, it was just to show how any object can be passed to event action. For example, if all you want to access is a background job object which you are monitoring using Register-ObjectEvent, you can access the job name using $event.Sender.Name or $sender.Name, job Id using $event.Sender.Id or $sender.Id, and so on.\n","date":"2011-06-22","excerpt":"Update: Based on feedback from @ShayLevy, we don’t have to send the background job object to Event action as a variable. It is already available as $event.Sender or just $sender. You can see that in the image below. I just picked up a wrong example to explain the -MessageData parameter. Although, the article originally showed a background job as an example, it was just to show how any object can be passed to event action. For example, if all you want to access is a background job object which you are monitoring using Register-ObjectEvent, you can access the job name using $event.Sender.Name or $sender.Name, job Id using $event.Sender.Id or $sender.Id, and so on.\n","permalink":"https://ravichaganti.com/blog/passing-variables-or-arguments-to-an-event-action-in-powershell/","series":"WQL via PowerShell","tags":["PowerShell","WQL","WMI"],"title":"Passing variables or arguments to an event action in PowerShell"},{"categories":["PowerShell","Bangalore IT Pro","Presentations"],"content":"Here are the slides I used for my session “PowerShell in the Enterprise” at TechED India 2011. This was my first ever TechED session and went pretty well. There were 100+ attendees at the session and some good questions too.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: Jk3JoaQUyQDbxu ","date":"2011-03-25","excerpt":"Here are the slides I used for my session “PowerShell in the Enterprise” at TechED India 2011. This was my first ever TechED session and went pretty well. There were 100+ attendees at the session and some good questions too.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: Jk3JoaQUyQDbxu ","permalink":"https://ravichaganti.com/blog/teched-india-2011-powershell-in-the-enterprise-slides/","series":null,"tags":["Bangalore IT Pro","PowerShell"],"title":"Slides: TechED India - PowerShell in the Enterprise"},{"categories":["PowerShell","Bangalore IT Pro","Presentations"],"content":"Early this month, I did an online webcast session for MS Virtual Tech Days. This session was around how administrators can manage remote Windows 7 desktops with Windows PowerShell. Here are the slides from that session.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: yoEBa4SeuaCVc5 ","date":"2011-02-22","excerpt":"Early this month, I did an online webcast session for MS Virtual Tech Days. This session was around how administrators can manage remote Windows 7 desktops with Windows PowerShell. Here are the slides from that session.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: yoEBa4SeuaCVc5 ","permalink":"https://ravichaganti.com/blog/microsoft-virtual-tech-days-monitoring-managing-remote-windows-7-desktops-with-powershell-slides-scripts/","series":null,"tags":["Bangalore IT Pro","PowerShell"],"title":"Slides: Virtual Tech Days - Monitoring \u0026 Managing remote Windows 7"},{"categories":["PowerShell","WQL","WMI"],"content":"There are several ways we can create a file monitoring script using PowerShell. There is also a cmdlet in PowerShellPack called Start-FileSystemWatcher to monitor file /folder changes. However, none of these methods survive a exit at the console or wherever the script is running. This is because all these methods create a temporary event consumer. As I’d mentioned in an earlier post, Trevor’s PowerEvents module makes it very easy to create permanent event consumers in PowerShell. In today’s post, we shall look at how we can do that.\n","date":"2011-01-19","excerpt":"There are several ways we can create a file monitoring script using PowerShell. There is also a cmdlet in PowerShellPack called Start-FileSystemWatcher to monitor file /folder changes. However, none of these methods survive a exit at the console or wherever the script is running. This is because all these methods create a temporary event consumer. As I’d mentioned in an earlier post, Trevor’s PowerEvents module makes it very easy to create permanent event consumers in PowerShell. In today’s post, we shall look at how we can do that.\n","permalink":"https://ravichaganti.com/blog/monitoring-file-creation-using-wmi-and-powerevents-module/","series":"WQL via PowerShell","tags":["PowerShell","WQL","WMI"],"title":"Monitoring file creation using WMI and PowerEvents module"},{"categories":["PowerShell","WQL","WMI"],"content":"A few weeks ago, I wrote about WMI Timer events using Win32_LocalTime and then mentioned how to work around the DayOfWeek issue. In today’s post, I will show you how to use WMI timer events to create complex scheduled tasks.\nAs system administrators, you may have to create scheduled jobs for performing various sysadmin tasks. We generally use Task Scheduler for such jobs. However, using the regular OS task scheduler, there is no easy way to create a scheduled task that occurs — for example — every Thursday of every fourth week of a month in the third quarter of every year.\n","date":"2010-12-25","excerpt":"A few weeks ago, I wrote about WMI Timer events using Win32_LocalTime and then mentioned how to work around the DayOfWeek issue. In today’s post, I will show you how to use WMI timer events to create complex scheduled tasks.\nAs system administrators, you may have to create scheduled jobs for performing various sysadmin tasks. We generally use Task Scheduler for such jobs. However, using the regular OS task scheduler, there is no easy way to create a scheduled task that occurs — for example — every Thursday of every fourth week of a month in the third quarter of every year.\n","permalink":"https://ravichaganti.com/blog/creating-complex-scheduled-tasks-using-wmi-timer-events-and-powerevents-module/","series":"WQL via PowerShell","tags":["PowerShell","WQL","WMI"],"title":"Creating complex scheduled tasks using WMI Timer events and PowerEvents Module"},{"categories":["PowerShell","WQL","WMI"],"content":"In this part of the WQL series, we shall look at extrinsic events.\nExtrinsic events represent events that do not directly link to standard WMI model. For example, Windows registry defines extrinsic events for all registry change events. For intrinsic events, having a WMI provider isn’t mandatory. This is mostly because they are defined within the standard WMI model and WMI takes care of these if there is no WMI provider for a given resource in the standard WMI model. However, since extrinsic events are outside of the standard WMI model, having a WMI provider is mandatory.\n","date":"2010-12-24","excerpt":"In this part of the WQL series, we shall look at extrinsic events.\nExtrinsic events represent events that do not directly link to standard WMI model. For example, Windows registry defines extrinsic events for all registry change events. For intrinsic events, having a WMI provider isn’t mandatory. This is mostly because they are defined within the standard WMI model and WMI takes care of these if there is no WMI provider for a given resource in the standard WMI model. However, since extrinsic events are outside of the standard WMI model, having a WMI provider is mandatory.\n","permalink":"https://ravichaganti.com/blog/wmi-query-language-wql-event-queries-extrinsic-events/","series":"WQL via PowerShell","tags":["PowerShell","WQL","WMI"],"title":"WMI Query Language (WQL) – Event Queries: Extrinsic Events"},{"categories":["PowerShell","WQL","WMI"],"content":"In this last and final part of this series, we will look at how to use WQL for querying the WMI schema.\nSchema queries are used to retrieve class definitions (rather than class instances) and schema associations. In simple words, if you need to find out what type of information (this is what schema really means) a specific class holds, you use schema queries.Here is an example of a schema query:\n","date":"2010-12-24","excerpt":"In this last and final part of this series, we will look at how to use WQL for querying the WMI schema.\nSchema queries are used to retrieve class definitions (rather than class instances) and schema associations. In simple words, if you need to find out what type of information (this is what schema really means) a specific class holds, you use schema queries.Here is an example of a schema query:\n","permalink":"https://ravichaganti.com/blog/wmi-query-language-wql-schema-queries/","series":"WQL via PowerShell","tags":["PowerShell","WQL","WMI"],"title":"WMI Query Language (WQL) – Schema Queries"},{"categories":["PowerShell","WQL","WMI"],"content":"Intrinsic events are used to monitor a resource represented by a class in the CIM repository. In other words, the intrinsic events occur in response to a change in the standard WMI data model. WMI creates intrinsic events for objects stored in the WMI repository. A provider generates intrinsic events for dynamic classes, but WMI can create an instance for a dynamic class if no provider is available. WMI uses polling to detect the changes.\n","date":"2010-12-22","excerpt":"Intrinsic events are used to monitor a resource represented by a class in the CIM repository. In other words, the intrinsic events occur in response to a change in the standard WMI data model. WMI creates intrinsic events for objects stored in the WMI repository. A provider generates intrinsic events for dynamic classes, but WMI can create an instance for a dynamic class if no provider is available. WMI uses polling to detect the changes.\n","permalink":"https://ravichaganti.com/blog/wmi-query-language-wql--event-queries-intrinsic-events/","series":"WQL via PowerShell","tags":["PowerShell","WQL","WMI"],"title":"WMI Query Language (WQL) – Event Queries: Intrinsic Events"},{"categories":["PowerShell","WQL","WMI"],"content":"The WMI query syntax for event queries is a bit different and deserves a discussion. So, before we delve in to the types of event queries, let us first look at the syntax for WQL event queries. As we discussed earlier, we use SELECT statement for event queries too. We can combine this with other keywords such as WITHIN, HAVING, and GROUP to change how we receive these WMI events.\nHere is how a MSDN article shows the syntax for WMI event queries.\n","date":"2010-12-22","excerpt":"The WMI query syntax for event queries is a bit different and deserves a discussion. So, before we delve in to the types of event queries, let us first look at the syntax for WQL event queries. As we discussed earlier, we use SELECT statement for event queries too. We can combine this with other keywords such as WITHIN, HAVING, and GROUP to change how we receive these WMI events.\nHere is how a MSDN article shows the syntax for WMI event queries.\n","permalink":"https://ravichaganti.com/blog/wmi-query-language-wql-event-queries-syntax/","series":"WQL via PowerShell","tags":["PowerShell","WQL","WMI"],"title":"WMI Query Language (WQL) – Event Queries: Syntax"},{"categories":["PowerShell","WQL","WMI"],"content":"In my earlier post, I showed how Win32_LocalTime WMI class can be used to capture timer events. As mentioned there, WMI events can be quite helpful in creating complex scheduling tasks. For example, you can specify to run a script every Thursday of every fourth week of a month in the third quarter of every year. However, there is a bug in Win32_LocalTime that currently blocks this.\nI created a support incident with MS and reported this bug to them. I got a response that this indeed is a bug and they provided a workaround to solve this temporarily.\n","date":"2010-12-03","excerpt":"In my earlier post, I showed how Win32_LocalTime WMI class can be used to capture timer events. As mentioned there, WMI events can be quite helpful in creating complex scheduling tasks. For example, you can specify to run a script every Thursday of every fourth week of a month in the third quarter of every year. However, there is a bug in Win32_LocalTime that currently blocks this.\nI created a support incident with MS and reported this bug to them. I got a response that this indeed is a bug and they provided a workaround to solve this temporarily.\n","permalink":"https://ravichaganti.com/blog/workarounds-for-dayofweek-timer-events-when-using-win32_localtime/","series":"WQL via PowerShell","tags":["PowerShell","WQL","WMI"],"title":"Workarounds for DayOfWeek Timer events when using Win32_LocalTime"},{"categories":["PowerShell","WQL","WMI"],"content":"This is not a part of the WQL series I am doing. I happend to take a look at the WMI timer events while providing feedback to an upcoming (cool) PowerEvents module by Trevor (@pcgeek86). BTW, this module will be released on November 30th. So, watch out for the annoncement.\nComing to the subject of this post, in WMI, there are 3 types of events possible. They are Timer events, Intrinsic events, and extrinsic events. My WQL series will soon cover intrinsic and extrensic events. Very few people have written about WMI timer events in the past but this particular post on The SysAdmins blog discusses good amount of details.\n","date":"2010-11-24","excerpt":"This is not a part of the WQL series I am doing. I happend to take a look at the WMI timer events while providing feedback to an upcoming (cool) PowerEvents module by Trevor (@pcgeek86). BTW, this module will be released on November 30th. So, watch out for the annoncement.\nComing to the subject of this post, in WMI, there are 3 types of events possible. They are Timer events, Intrinsic events, and extrinsic events. My WQL series will soon cover intrinsic and extrensic events. Very few people have written about WMI timer events in the past but this particular post on The SysAdmins blog discusses good amount of details.\n","permalink":"https://ravichaganti.com/blog/wmi-timer-events-in-powershell-using-win32_localtime/","series":"WQL via PowerShell","tags":["PowerShell","WQL","WMI"],"title":"WMI Timer Events in PowerShell using Win32_LocalTime"},{"categories":["PowerShell","WQL","WMI"],"content":"In this post, I will write a bit about basics of WMI events and how Register-WMIEvent cmdlet can be used. To start with, here is an excerpt from Microsoft Scripting guide that introduces WMI events:\nJust as there is a WMI class that represents each type of system resource that can be managed using WMI, there is a WMI class that represents each type of WMI event. When an event that can be monitored by WMI occurs, an instance of the corresponding WMI event class is created. A WMI event occurs when that instance is created.\n","date":"2010-11-15","excerpt":"In this post, I will write a bit about basics of WMI events and how Register-WMIEvent cmdlet can be used. To start with, here is an excerpt from Microsoft Scripting guide that introduces WMI events:\nJust as there is a WMI class that represents each type of system resource that can be managed using WMI, there is a WMI class that represents each type of WMI event. When an event that can be monitored by WMI occurs, an instance of the corresponding WMI event class is created. A WMI event occurs when that instance is created.\n","permalink":"https://ravichaganti.com/blog/wmi-query-language-wql--event-queries-introduction/","series":"WQL via PowerShell","tags":["PowerShell","WQL","WMI"],"title":"WMI Query Language (WQL) – Event Queries: Introduction"},{"categories":["PowerShell","WQL","WMI"],"content":"Per MSDN documentation, the REFERENCES OF statement\nRetrieves all association instances that refer to a particular source instance. The REFERENCES OF statement is similar to the ASSOCIATORS OF statement in its syntax. However, rather than retrieving endpoint instances, it retrieves the intervening association instances.\nThat is very cryptic for beginners like you and me. So, let us look at an example to understand this.\nIf you look at the above diagram (captured from the associations tab of Win32_Process in CIM Studio) and as I showed you in my earlier post, Win32_SessionProcess, in32_NamedJobObjectProcesses, Win32_SystemProcesses are the associator or association classes. Whereas, Win32_Process, Win32_LogonSession, Win32_NamedObject, and Win32_ComputerSystem are the associated classes.\n","date":"2010-11-11","excerpt":"Per MSDN documentation, the REFERENCES OF statement\nRetrieves all association instances that refer to a particular source instance. The REFERENCES OF statement is similar to the ASSOCIATORS OF statement in its syntax. However, rather than retrieving endpoint instances, it retrieves the intervening association instances.\nThat is very cryptic for beginners like you and me. So, let us look at an example to understand this.\nIf you look at the above diagram (captured from the associations tab of Win32_Process in CIM Studio) and as I showed you in my earlier post, Win32_SessionProcess, in32_NamedJobObjectProcesses, Win32_SystemProcesses are the associator or association classes. Whereas, Win32_Process, Win32_LogonSession, Win32_NamedObject, and Win32_ComputerSystem are the associated classes.\n","permalink":"https://ravichaganti.com/blog/wmi-query-language-wql-data-queries-references-of/","series":"WQL via PowerShell","tags":["PowerShell","WQL","WMI"],"title":"WMI Query Language (WQL) – Data Queries: References Of"},{"categories":["PowerShell","WQL","WMI"],"content":"As we saw in the previous post, Select queries can be used to retrieve instances of WMI class. But select queries are not the only way to query for instances. We can also use Associators Of keyword to the same. However, there is a difference. Select queries always return a collection of instances of a WMI class where as “Associators Of” returns a collection of WMI objects that belong to different WMI classes or associated WMI classes. Before we dig too much in to this, let us first understand what are associated WMI classes.\n","date":"2010-09-13","excerpt":"As we saw in the previous post, Select queries can be used to retrieve instances of WMI class. But select queries are not the only way to query for instances. We can also use Associators Of keyword to the same. However, there is a difference. Select queries always return a collection of instances of a WMI class where as “Associators Of” returns a collection of WMI objects that belong to different WMI classes or associated WMI classes. Before we dig too much in to this, let us first understand what are associated WMI classes.\n","permalink":"https://ravichaganti.com/blog/wmi-query-language-wql-data-queries-associators-of/","series":"WQL via PowerShell","tags":["PowerShell","WQL","WMI"],"title":"WMI Query Language (WQL) – Data Queries: Associators Of"},{"categories":["PowerShell","WQL","WMI"],"content":"In this part of the series on WQL, we will look at what are data queries and how some of the WQL keywords \u0026amp; operators can be used to retrieve information from WMI repository. Also, as mentioned earlier, there are many other tools that consume WQL queries to retrieve information from WMI. However, in this series, I shall use only PowerShell to demonstrate WQL.\nWQL data queries are the most simplest form of querying for WMI data. Data queries are used to retrieve class instances and data associations. For example,\n","date":"2010-08-03","excerpt":"In this part of the series on WQL, we will look at what are data queries and how some of the WQL keywords \u0026amp; operators can be used to retrieve information from WMI repository. Also, as mentioned earlier, there are many other tools that consume WQL queries to retrieve information from WMI. However, in this series, I shall use only PowerShell to demonstrate WQL.\nWQL data queries are the most simplest form of querying for WMI data. Data queries are used to retrieve class instances and data associations. For example,\n","permalink":"https://ravichaganti.com/blog/wmi-query-language-wql-data-queries-select-from-and-where/","series":"WQL via PowerShell","tags":["PowerShell","WQL","WMI"],"title":"WMI Query Language (WQL) – Data Queries: SELECT, FROM, and WHERE"},{"categories":["PowerShell","WQL","WMI"],"content":"In this post, we will look at the a brief description of WQL keywords and operators and see a classification of the keywords based on where (query types) these keywords can be used.\nKeywords Similar to SQL, WQL queries use keywords to retrieve data from the management objects. WQL has 19 keywords to perform these queries against WMI repositories. In the previous post, we discussed about three types of queries: Data, Event, and Schema. Though there are 19 WQL keywords, only a few of them can be used all 3 possible query types. The following table lists all the WQL keywords and lists the query type in which they can be used.\n","date":"2010-08-02","excerpt":"In this post, we will look at the a brief description of WQL keywords and operators and see a classification of the keywords based on where (query types) these keywords can be used.\nKeywords Similar to SQL, WQL queries use keywords to retrieve data from the management objects. WQL has 19 keywords to perform these queries against WMI repositories. In the previous post, we discussed about three types of queries: Data, Event, and Schema. Though there are 19 WQL keywords, only a few of them can be used all 3 possible query types. The following table lists all the WQL keywords and lists the query type in which they can be used.\n","permalink":"https://ravichaganti.com/blog/wmi-query-language-wql-keywords-and-operators/","series":"WQL via PowerShell","tags":["PowerShell","WQL","WMI"],"title":"WMI Query Language (WQL) – Keywords and Operators"},{"categories":["PowerShell","WQL","WMI"],"content":"I have been using WMI a lot these days and got to play with WQL as well. In this series of posts, I want to write about how WMI Query Language (WQL) can be used to retrieve management data exposed by WMI. Yes, this has nothing to do with PowerShell but as a PowerShell lover (and a MVP now), I will use PowerShell for all my examples.\nWindows Management Instrumentation (WMI) is the Microsoft implementation of Web-based Enterprise Management (WBEM), which is an industry initiative to develop a standard technology for accessing management information in an enterprise environment. WMI uses the Common Information Model (CIM) industry standard to represent systems, applications, networks, devices, and other managed components. CIM is developed and maintained by the Distributed Management Task Force (DMTF). We can write WMI scripts to automate several tasks on local or remote computer(s).\n","date":"2010-07-22","excerpt":"I have been using WMI a lot these days and got to play with WQL as well. In this series of posts, I want to write about how WMI Query Language (WQL) can be used to retrieve management data exposed by WMI. Yes, this has nothing to do with PowerShell but as a PowerShell lover (and a MVP now), I will use PowerShell for all my examples.\nWindows Management Instrumentation (WMI) is the Microsoft implementation of Web-based Enterprise Management (WBEM), which is an industry initiative to develop a standard technology for accessing management information in an enterprise environment. WMI uses the Common Information Model (CIM) industry standard to represent systems, applications, networks, devices, and other managed components. CIM is developed and maintained by the Distributed Management Task Force (DMTF). We can write WMI scripts to automate several tasks on local or remote computer(s).\n","permalink":"https://ravichaganti.com/blog/wmi-query-language-wql-an-introduction/","series":"WQL via PowerShell","tags":["PowerShell","WQL","WMI"],"title":"WMI Query Language (WQL) – An introduction"},{"categories":["PowerShell","Bangalore IT Pro","Presentations"],"content":"I was at Bangalore ITPro BarCamp today and did a session on “PowerShell for Active Directory”. Here are the slides from that session.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: ETmDJt3jFoSlGQ ","date":"2010-05-15","excerpt":"I was at Bangalore ITPro BarCamp today and did a session on “PowerShell for Active Directory”. Here are the slides from that session.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: ETmDJt3jFoSlGQ ","permalink":"https://ravichaganti.com/blog/slides-from-bangalore-itpro-barcamp-powershell-for-activedirectory-administration/","series":null,"tags":["Bangalore IT Pro","PowerShell"],"title":"Slides: Bangalore ITPro - PowerShell for ActiveDirectory Administration"},{"categories":["PowerShell","Bangalore IT Pro","Presentations"],"content":"We had the BITPro / PowerShell Bangalore User Group UG meet today. I presented PowerShell 2.0 remoting. Here are the slides I used at this UG meet.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: wxuMRDES5Q3sCL ","date":"2010-05-15","excerpt":"We had the BITPro / PowerShell Bangalore User Group UG meet today. I presented PowerShell 2.0 remoting. Here are the slides I used at this UG meet.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: wxuMRDES5Q3sCL ","permalink":"https://ravichaganti.com/blog/psbug-ug-meet-slides-powershell-2-0-remoting/","series":null,"tags":["Bangalore IT Pro","PowerShell"],"title":"Slides: PSBUG Meet - PowerShell 2.0 remoting"},{"categories":["PowerShell","Bangalore IT Pro","Presentations"],"content":"I just came back from the PowerShell / Bangalore ITPro UG meet. We had nearly 40 people showing up for this event. I spoke about getting started with PowerShell scripting and Ismail talked about Exchange 2010 migration. Here are the slides I used for my session.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: JDWNWgF5R8BL60 ","date":"2010-03-13","excerpt":"I just came back from the PowerShell / Bangalore ITPro UG meet. We had nearly 40 people showing up for this event. I spoke about getting started with PowerShell scripting and Ismail talked about Exchange 2010 migration. Here are the slides I used for my session.\nSlideShare Presentation This presentation requires your consent to load content from SlideShare (LinkedIn), which may set tracking cookies. Enable SlideShare Presentation ID: JDWNWgF5R8BL60 ","permalink":"https://ravichaganti.com/blog/slides-getting-started-with-powershell-scripting/","series":null,"tags":["Bangalore IT Pro","PowerShell"],"title":"Slides: Getting Started with PowerShell scripting"},{"categories":["PowerShell","Remoting"],"content":"In this part of the remoting series, we look at how CredSSP can be used for multi-hop authentication in PowerShell remoting. CredSSP and multi-hop support are not features of PowerShell 2.0 or PowerShell remoting, per se. Credential Security Service Provider (CredSSP) is a new security service provider that enables an application to delegate the user’s credentials from the client to the target server. Multi-hop support in Windows Remote Management uses CredSSP for authentication. Since PowerShell 2.0 remoting is built on top of WinRM, we can use CredSSP to perform multi-hop authentication.\n","date":"2010-02-18","excerpt":"In this part of the remoting series, we look at how CredSSP can be used for multi-hop authentication in PowerShell remoting. CredSSP and multi-hop support are not features of PowerShell 2.0 or PowerShell remoting, per se. Credential Security Service Provider (CredSSP) is a new security service provider that enables an application to delegate the user’s credentials from the client to the target server. Multi-hop support in Windows Remote Management uses CredSSP for authentication. Since PowerShell 2.0 remoting is built on top of WinRM, we can use CredSSP to perform multi-hop authentication.\n","permalink":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-12--using-credssp-for-multi-hop-authentication/","series":"PowerShell Remoting","tags":["PowerShell","Remoting"],"title":"PowerShell 2.0 remoting guide: Part 12 – Using CredSSP for multi-hop authentication"},{"categories":["PowerShell","Remoting"],"content":"In this part of the remoting series, we look at remoting output. This includes how the output is transferred from remote computer to local, how it is displayed and how we can format this output based on a need. We already discussed various methods to execute commands (part4, part 5 and part 6) on a remote computer. In this post, for the sake of our discussion of remoting output, I will use only Invoke-Command method to execute remote commands. However, I will point out the differences as required.\n","date":"2010-02-15","excerpt":"In this part of the remoting series, we look at remoting output. This includes how the output is transferred from remote computer to local, how it is displayed and how we can format this output based on a need. We already discussed various methods to execute commands (part4, part 5 and part 6) on a remote computer. In this post, for the sake of our discussion of remoting output, I will use only Invoke-Command method to execute remote commands. However, I will point out the differences as required.\n","permalink":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-11--interpreting-formatting-and-displaying-remote-output/","series":"PowerShell Remoting","tags":["PowerShell","Remoting"],"title":"PowerShell 2.0 remoting guide: Part 11 – Interpreting, formatting and displaying remote output"},{"categories":["PowerShell","Remoting"],"content":"“With great power comes great responsibility”, said uncle Ben. But some people don’t just understand that. That is when you have to rip-off their powers. Similarly, the default PS Session configuration allows full access to PowerShell language, cmdlets, scripts and everything available to PowerShell. Of course, you need to authenticate as a local administrator or should have execute permission to invoke the session. Running a few cmdlets such as Stop-Service or Restart-Computer can be quite dangerous on a production server. This is where a custom session configuration can help provide role based access to remote host using PowerShell remoting.\n","date":"2010-02-11","excerpt":"“With great power comes great responsibility”, said uncle Ben. But some people don’t just understand that. That is when you have to rip-off their powers. Similarly, the default PS Session configuration allows full access to PowerShell language, cmdlets, scripts and everything available to PowerShell. Of course, you need to authenticate as a local administrator or should have execute permission to invoke the session. Running a few cmdlets such as Stop-Service or Restart-Computer can be quite dangerous on a production server. This is where a custom session configuration can help provide role based access to remote host using PowerShell remoting.\n","permalink":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-10--restricting-available-commands-using-custom-session-configuration/","series":"PowerShell Remoting","tags":["PowerShell","Remoting"],"title":"PowerShell 2.0 remoting guide: Part 10 – Restricting available commands using custom session configuration"},{"categories":["PowerShell","Remoting"],"content":"In part2 of this series on PowerShell remoting we quickly looked at various cmdlets that form part of overall remoting infrastructure. The list there included cmdlets related to PS Session configuration. Now that we have gone through the basics of remoting, it is time for us to dig in to these additional cmdlets and explore what they really do.\nSo, in this part, we will look at all the PS session configurtion cmdlets, discuss how to create custom PS Session configurations and the need for it. Let us dive in to this now.\n","date":"2010-02-09","excerpt":"In part2 of this series on PowerShell remoting we quickly looked at various cmdlets that form part of overall remoting infrastructure. The list there included cmdlets related to PS Session configuration. Now that we have gone through the basics of remoting, it is time for us to dig in to these additional cmdlets and explore what they really do.\nSo, in this part, we will look at all the PS session configurtion cmdlets, discuss how to create custom PS Session configurations and the need for it. Let us dive in to this now.\n","permalink":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-9--session-configurations-and-creating-custom-configurations/","series":"PowerShell Remoting","tags":["PowerShell","Remoting"],"title":"PowerShell 2.0 remoting guide: Part 9 – Session configurations and creating custom configurations"},{"categories":["PowerShell","Remoting"],"content":"If you have been following this remoting series and using PS remoting on a test setup or even production, you must have gone through a few initial hiccups. In fact, there could be many such issues if you are working in a mixed environment where you have a few computers in a domain and a few in workgroup. So, in this part of the remoting series I will discuss some of these issues and workarounds to resolve the same. I discussed enabling remoting on workgroup computers in part3 – “Enable remoting” of this series. This post is kind of an extension to that.\n","date":"2010-02-07","excerpt":"If you have been following this remoting series and using PS remoting on a test setup or even production, you must have gone through a few initial hiccups. In fact, there could be many such issues if you are working in a mixed environment where you have a few computers in a domain and a few in workgroup. So, in this part of the remoting series I will discuss some of these issues and workarounds to resolve the same. I discussed enabling remoting on workgroup computers in part3 – “Enable remoting” of this series. This post is kind of an extension to that.\n","permalink":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-8--remoting-scenarios-and-troubleshooting/","series":"PowerShell Remoting","tags":["PowerShell","Remoting"],"title":"PowerShell 2.0 remoting guide: Part 8 – remoting scenarios and troubleshooting"},{"categories":["PowerShell","Remoting"],"content":"In part 6 of the remoting series we looked at how we can use Import-PSSession cmdlet to execute remote commands as if they were local. This is nice but this will last only while the session ($s in the example) is alive. The moment we kill the session — using Rem0ve-PSSession, remoting session will also get killed. In this part of the series, we will look at how we can save a remoting session to disk so that we don’t even have to explicitly create a session.\n","date":"2010-02-04","excerpt":"In part 6 of the remoting series we looked at how we can use Import-PSSession cmdlet to execute remote commands as if they were local. This is nice but this will last only while the session ($s in the example) is alive. The moment we kill the session — using Rem0ve-PSSession, remoting session will also get killed. In this part of the series, we will look at how we can save a remoting session to disk so that we don’t even have to explicitly create a session.\n","permalink":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-7--saving-remote-session-to-disk/","series":"PowerShell Remoting","tags":["PowerShell","Remoting"],"title":"PowerShell 2.0 remoting guide: Part 7 – saving remote session to disk"},{"categories":["PowerShell","Remoting"],"content":"In an earlier post on interactive remoting sessions, we looked at how we can enter a remote session and then execute commands as if they were local. However, if you’d observed it more closely, we were actually sitting in the remote session than local console. The change in PowerShell prompt indicates this fact clearly.\nIn this part of the remoting series, we will look at a feature called implicit remoting which makes it possible to run the commands / scripts on the remote computer while in the local session.\n","date":"2010-02-03","excerpt":"In an earlier post on interactive remoting sessions, we looked at how we can enter a remote session and then execute commands as if they were local. However, if you’d observed it more closely, we were actually sitting in the remote session than local console. The change in PowerShell prompt indicates this fact clearly.\nIn this part of the remoting series, we will look at a feature called implicit remoting which makes it possible to run the commands / scripts on the remote computer while in the local session.\n","permalink":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-6-implicit-remoting-sessions/","series":"PowerShell Remoting","tags":["PowerShell","Remoting"],"title":"PowerShell 2.0 remoting guide: Part 6 – implicit remoting sessions"},{"categories":["PowerShell","Remoting"],"content":"In this part of the remoting series, I will talk about using Enter-PSSession and Exit-PSSession cmdlets to perform interactive remoting.\nWhy do you need interactive remoting?\nTo understand the advantages of interactive remoting in PowerShell 2.0, let us first look at some gotchas with Invoke-Command. Take an example of a remote system where SharePoint 2010 is installed. SharePoint 2010 provides native PowerShell cmdlets and these cmdlets can be accesses only if you load Microsoft.SharePoint.PowerShell PS snap-in. So, to do this using Invoke-Command\n","date":"2010-02-02","excerpt":"In this part of the remoting series, I will talk about using Enter-PSSession and Exit-PSSession cmdlets to perform interactive remoting.\nWhy do you need interactive remoting?\nTo understand the advantages of interactive remoting in PowerShell 2.0, let us first look at some gotchas with Invoke-Command. Take an example of a remote system where SharePoint 2010 is installed. SharePoint 2010 provides native PowerShell cmdlets and these cmdlets can be accesses only if you load Microsoft.SharePoint.PowerShell PS snap-in. So, to do this using Invoke-Command\n","permalink":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-5-interactive-remoting-sessions/","series":"PowerShell Remoting","tags":["PowerShell","Remoting"],"title":"PowerShell 2.0 remoting guide: Part 5 – interactive remoting sessions"},{"categories":["PowerShell","Remoting"],"content":"In this part of PowerShell remoting series, I will discuss how to run commands or scripts on remote computer(s). Within remoting, there are couple of ways to run commands or scripts on a remote machine. This includes Invoke-Command cmdlet and interactive remoting sessions. These two methods deserve a separate post for each and hence I will discuss the Invoke-Command method in today\u0026rsquo;s post.\nOnce you have enabled remoting on all your computers, you can use Invoke-Command cmdlet to run commands and scripts on local computer or on remote computer(s). There are many possible variations of this cmdlet. I will cover most of them here.\n","date":"2010-02-01","excerpt":"In this part of PowerShell remoting series, I will discuss how to run commands or scripts on remote computer(s). Within remoting, there are couple of ways to run commands or scripts on a remote machine. This includes Invoke-Command cmdlet and interactive remoting sessions. These two methods deserve a separate post for each and hence I will discuss the Invoke-Command method in today\u0026rsquo;s post.\nOnce you have enabled remoting on all your computers, you can use Invoke-Command cmdlet to run commands and scripts on local computer or on remote computer(s). There are many possible variations of this cmdlet. I will cover most of them here.\n","permalink":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-4--execute-commands-or-scripts-on-a-remote-computer-using-invoke-command/","series":"PowerShell Remoting","tags":["PowerShell","Remoting"],"title":"PowerShell 2.0 remoting guide: Part 4 – Execute commands or scripts on a remote computer using Invoke-Command"},{"categories":["PowerShell","Remoting"],"content":"In this part of the series of articles on PowerShell 2.0 remoting, we will look at how to enable remoting in different scenarios. This post assumes that you are running a supported operating system and you have installed all necesary pre-requisite software.\nSo, how do you enable remoting?\nRemoting in PowerShell 2.0 can be enabled by just running the following cmdlet\nEnable-PSRemoting Note: You have to run this at a elevated PowerShell prompt. Also, all your active networks should be set to “Home” or “Work” network location. Setting firewall exceptions for remoting will fail if the network location is set to “Public”.\n","date":"2010-01-31","excerpt":"In this part of the series of articles on PowerShell 2.0 remoting, we will look at how to enable remoting in different scenarios. This post assumes that you are running a supported operating system and you have installed all necesary pre-requisite software.\nSo, how do you enable remoting?\nRemoting in PowerShell 2.0 can be enabled by just running the following cmdlet\nEnable-PSRemoting Note: You have to run this at a elevated PowerShell prompt. Also, all your active networks should be set to “Home” or “Work” network location. Setting firewall exceptions for remoting will fail if the network location is set to “Public”.\n","permalink":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-3--enable-remoting/","series":"PowerShell Remoting","tags":["PowerShell","Remoting"],"title":"PowerShell 2.0 remoting guide: Part 3 – Enable remoting"},{"categories":["PowerShell","Remoting"],"content":"In part 1 of this series I gave a quick introduction to PowerShell 2.0 remoting. Before we look at how to enable or configure a computer for remoting, let us take a quick look at PowerShell 2.0 remoting cmdlets. Here is a complete list of cmdlets with a brief overview.\nThis list will also include cmdlets that are not directly used within remoting but help configure various aspects of remoting. The knowledge of these cmdlets such as WSMan, etc in this list is not mandatory for basic usage of PowerShell remoting. In this post, I will only discuss what each of these cmdlets are capable of and list any gotchas. A detailed usage of these cmdlets will be discussed later in the series.\n","date":"2010-01-27","excerpt":"In part 1 of this series I gave a quick introduction to PowerShell 2.0 remoting. Before we look at how to enable or configure a computer for remoting, let us take a quick look at PowerShell 2.0 remoting cmdlets. Here is a complete list of cmdlets with a brief overview.\nThis list will also include cmdlets that are not directly used within remoting but help configure various aspects of remoting. The knowledge of these cmdlets such as WSMan, etc in this list is not mandatory for basic usage of PowerShell remoting. In this post, I will only discuss what each of these cmdlets are capable of and list any gotchas. A detailed usage of these cmdlets will be discussed later in the series.\n","permalink":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-2--overview-of-remoting-cmdlets/","series":"PowerShell Remoting","tags":["PowerShell","Remoting"],"title":"PowerShell 2.0 remoting guide: Part 2 – Overview of remoting cmdlets"},{"categories":["PowerShell","Remoting"],"content":"I am starting a series of articles on remoting feature of PowerShell 2.0. This is one of the best features of PowerShell 2.0 and my favorite feature for sure. The number of very cool things one can achieve using this feature is just un-imaginable. I have started digging deep in to this feature as I start writing a network file browser powerpack as a part of hands-on. I hope it is worth sharing what I learn by writing about it here. So, this is the first in that series of posts. In this post, we will look at absolute basics to start using PowerShell remoting.\n","date":"2010-01-22","excerpt":"I am starting a series of articles on remoting feature of PowerShell 2.0. This is one of the best features of PowerShell 2.0 and my favorite feature for sure. The number of very cool things one can achieve using this feature is just un-imaginable. I have started digging deep in to this feature as I start writing a network file browser powerpack as a part of hands-on. I hope it is worth sharing what I learn by writing about it here. So, this is the first in that series of posts. In this post, we will look at absolute basics to start using PowerShell remoting.\n","permalink":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-1-the-basics/","series":"PowerShell Remoting","tags":["PowerShell","Remoting"],"title":"PowerShell 2.0 remoting guide: Part 1 – The basics"}]