<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tactical Programming</title><link>https://www.tacticalprogramming.com/</link><description>Recent content on Tactical Programming</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 28 Apr 2026 18:24:13 -0400</lastBuildDate><atom:link href="https://www.tacticalprogramming.com/index.xml" rel="self" type="application/rss+xml"/><item><title>New Fundamentals</title><link>https://www.tacticalprogramming.com/posts/new-fundamentals/</link><pubDate>Tue, 28 Apr 2026 18:24:13 -0400</pubDate><guid>https://www.tacticalprogramming.com/posts/new-fundamentals/</guid><description>I started writing on the Internet with a nod to the value of the fundamentals, with an unapolagetically strong emphasis on learning bash. I think now is a good time to revisit what a &amp;ldquo;fundamental skill&amp;rdquo; is today, in 2026.
I believe everyone has their personal &amp;ldquo;oh shit&amp;rdquo; moment when it comes to AI. Mine was on the day I heard about ChatGPT and I logged in with the free tier.</description></item><item><title>Running OpenWebUI and Ollama in Docker Compose with GPU Support</title><link>https://www.tacticalprogramming.com/posts/running-openwebui-and-ollama-docker-compose/</link><pubDate>Thu, 05 Jun 2025 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/running-openwebui-and-ollama-docker-compose/</guid><description>Problem We want to run OpenWebUI so we have an easy way to interact with, and test out, LLMs. We also want the convenience of Ollama for managing/running our models for us. We also want to make use of the GPU in our system.
Solution Go the lazy simple route of running both inside containers. We&amp;rsquo;ll coordinate the tech with docker-compose.
The file Below is one successful docker-compose.yaml file for standing up both containers, getting them talking to each other, and also exposing both ports on the host network for easy access over your home network.</description></item><item><title>Running the Wiz MCP Server in WSL2</title><link>https://www.tacticalprogramming.com/posts/wiz-mcp-server-with-wsl/</link><pubDate>Wed, 04 Jun 2025 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/wiz-mcp-server-with-wsl/</guid><description>Problem We want to take advantage of the Wiz MCP Server on our Windows workstation running WSL2.
Solution The long-term solution to this is to just host the MCP server in a central location and put something like the OpenWebUI OpenAI Proxy in front of it. But this is a fast-moving area so we&amp;rsquo;ll scope this article to our local workstation.
Here&amp;rsquo;s our tech stack:
Cline VSCode plugin for our human interface (we will configure Cline to talk to our LLM and our MPC server) WSL for our runtime.</description></item><item><title>Troubleshooting Battery Drain Issues on the Garmin Venu 3</title><link>https://www.tacticalprogramming.com/posts/garmin-venu-3-battery-drain-troubleshooting/</link><pubDate>Tue, 07 Jan 2025 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/garmin-venu-3-battery-drain-troubleshooting/</guid><description>Problem Garmin Venu 3 watches will sometimes go into severe battery drain mode, measured by more than 1% per hour (normaly, a single charge will last over ten days). This is further complicated by the sheer opacity of the devices. There&amp;rsquo;s no logs, no error indicators, and the only way to interact with the device is a desktop program.
Solution (sort of) The Internet is filled with threads and forum posts of people performing various Kabuki dances because knowing the cause is impossible, so you can&amp;rsquo;t execute a precise fix.</description></item><item><title>Progress, Not Perfection</title><link>https://www.tacticalprogramming.com/posts/progress-not-perfection/</link><pubDate>Tue, 24 Sep 2024 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/progress-not-perfection/</guid><description>With thanks to Arnold, Adam, and Ketch for the pointers.
I recently finished The Foundation workout program in Arnold&amp;rsquo;s Pump Club. This is a 90-day workout program with multiple workouts per week.
I finished it after ten months.
Injuries, sickness, work schedule, life events. There was always something slowing me down but I always got back to it once I had the time &amp;amp; ability. I&amp;rsquo;ll let you in on another secret - I didn&amp;rsquo;t do the full workout every single time.</description></item><item><title>It's Always the Service</title><link>https://www.tacticalprogramming.com/posts/its-always-the-service/</link><pubDate>Mon, 09 Sep 2024 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/its-always-the-service/</guid><description>I love reading. I love the idea of books, to the point that a small, always ongoing vanity project of mine is a library of books I find special. This means there are always a few books in flight (I should probably practice better focus and work on only one book at a time).
So anyway, I was reading a memoir from someone in the restaurant industry. They were recounting an interview they had early in their career.</description></item><item><title>Your Core Skillset</title><link>https://www.tacticalprogramming.com/posts/your-core-skillset/</link><pubDate>Tue, 03 Sep 2024 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/your-core-skillset/</guid><description>For the longest time, Garmin was &amp;ldquo;the GPS company&amp;rdquo;. They sold those bricks that you mount on your car dashboard and would help you get from Point A to Point B. They even had custom voice packs you could buy; and this was before it was easy to generate it with AI so you had to pay real money to the real Samuel L. Jackson, who sat in front of a real microphone and really said &amp;ldquo;Turn right here!</description></item><item><title>Your Responsibility to the Audience</title><link>https://www.tacticalprogramming.com/posts/responsibility-to-the-audience/</link><pubDate>Mon, 26 Aug 2024 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/responsibility-to-the-audience/</guid><description>When you&amp;rsquo;re the one talking, all eyes are on you. This means several things:
Everyone showed up to accomplish something. We all dedicated this time to this thing. We chose to be here instead of anywhere else. It doesn&amp;rsquo;t matter if it&amp;rsquo;s a three-person meeting to decide on today&amp;rsquo;s work or a recorded TED Talk with tens of thousands of people in the audience. Your responsibility doesn&amp;rsquo;t change:
inform / assist keep their attention Most of us took classes on the first part - putting together information, making charts, or preparing to troubleshoot.</description></item><item><title>Build It, but it's not Enough</title><link>https://www.tacticalprogramming.com/posts/built-it-but-its-not-enough/</link><pubDate>Mon, 19 Aug 2024 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/built-it-but-its-not-enough/</guid><description>You can build the best thing, do your best work. But if no one notices, it doesn&amp;rsquo;t mean anything.
Let me try to illustrate with a story. We were on a vacation to Disneyworld years ago. Disney, if you weren&amp;rsquo;t aware, has engineered just about all the efficiency out of their experience. They track traffic, ridership numbers, they even have data on which garbage cans are the most popular.
So it&amp;rsquo;s not surprising to see this pathological obsession over efficiency applied to the Starbucks that&amp;rsquo;s in Epcot Center.</description></item><item><title>In Defense of Convenience</title><link>https://www.tacticalprogramming.com/posts/in-defense-of-convenience/</link><pubDate>Tue, 13 Aug 2024 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/in-defense-of-convenience/</guid><description>When there&amp;rsquo;s a setback, a technical bump in the road, people who don&amp;rsquo;t really care will dismiss the problem with &amp;ldquo;it&amp;rsquo;s just an inconvenience&amp;rdquo;. The subtext is &amp;ldquo;grow up, deal with it&amp;rdquo;.
But convenience has knock-on effects:
convenient things get done often, because they&amp;rsquo;re easy to do convenient things free up time, because they take less time convenient things can be done by anyone, because they&amp;rsquo;re easy to do Making something &amp;ldquo;convenient&amp;rdquo; isn&amp;rsquo;t just about making the job cushier.</description></item><item><title>Self-Signed Certs with Subject Alt Names</title><link>https://www.tacticalprogramming.com/posts/self-signed-certs-with-sans/</link><pubDate>Thu, 11 May 2023 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/self-signed-certs-with-sans/</guid><description>Problem We need to create self-signed certs. But because browsers/tools are finally enforcing what they said they would for years, we have to put the CN into the list of SANs for the cert. This is non-negotiable.
That means we have to use the x509v3 extensions. Which is highly forgettable.
Solution Automate as much as is reasonable. Worth noting that this worked as of this writing for securing an NPM registry proxy.</description></item><item><title>Strategic vs Tactical</title><link>https://www.tacticalprogramming.com/posts/strategic-vs-tactical/</link><pubDate>Tue, 21 Feb 2023 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/strategic-vs-tactical/</guid><description>Entire books have been written on the topic of Strategic vs Tactical. At the risk of creating more noise, I&amp;rsquo;d like to add my experience to the collection.
Talking with Tom Hatch about, well, a lot of things, this topic came up and he had the best illustration. I&amp;rsquo;m sure you&amp;rsquo;ve heard a varient of it before.
If I&amp;rsquo;m defending my house (let&amp;rsquo;s pretend it&amp;rsquo;s a zombie apocalypse just for fun), the &amp;ldquo;man at the door&amp;rdquo; is my Tactical need.</description></item><item><title>Automatic Updates for Raspberry Pi's</title><link>https://www.tacticalprogramming.com/posts/automatic-updates-for-raspberry-pi/</link><pubDate>Sun, 15 May 2022 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/automatic-updates-for-raspberry-pi/</guid><description>Problem Raspberry Pi&amp;rsquo;s are great but they don&amp;rsquo;t automatically update themselves. And once we&amp;rsquo;ve figured out how to make them do whatever it is we wanted them to do, we&amp;rsquo;re not likely to log back in just for updates.
We need to set the machine to update itself.
Solution There are, no doubt, a number of ways to do this. The following approach just drops an entry into /etc/crontab to make the system update itself and reboot once a day.</description></item><item><title>Using cert-manager in Kubernetes with Lets Encrypt</title><link>https://www.tacticalprogramming.com/posts/kubernetes-cert-manager-letsencrypt/</link><pubDate>Wed, 19 Jan 2022 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/kubernetes-cert-manager-letsencrypt/</guid><description>Problem We have Kubernetes. We need a cert. We want to use Let&amp;rsquo;s Encrypt to create (and manage) that cert for us.
Solution We can install cert-manager and, with three objects, do exactly that. At a high level, we create a ClusterIssuer, we configure it with our cloud credentials (in this case AWS), and we request a certificate.
We&amp;rsquo;ll be using Harbor as the example application but this can be used for any service requiring a cert.</description></item><item><title>Rotating Pinniped Credentials in Tanzu Kubernetes Grid</title><link>https://www.tacticalprogramming.com/posts/rotate-pinniped-credentials-in-tanzu-tkg/</link><pubDate>Thu, 16 Dec 2021 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/rotate-pinniped-credentials-in-tanzu-tkg/</guid><description>Problem We&amp;rsquo;ve successfully implemented user authentication in our TKG clusters. Now, we&amp;rsquo;d like to update the client ID/secret for our TKG Management Cluster.
Solution TKG uses Pinniped to support authentication, including to OIDC providers. However, exactly which Kubernetes object we need to update/reconfigure is not immediately obvious. Fortunately, we only need to update one object, and the cluster takes care of the rest for us.
At a high level, here&amp;rsquo;s what we&amp;rsquo;ll do:</description></item><item><title>Cluster Node Autoscaling in Tanzu Kubernetes Grid (TKG)</title><link>https://www.tacticalprogramming.com/posts/kubernetes-cluster-autoscaling-in-tkg/</link><pubDate>Tue, 19 Oct 2021 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/kubernetes-cluster-autoscaling-in-tkg/</guid><description>Problem We need to reliably implement cluster autoscaling for our Kubernetes platform. How can we do that? And how can we know it&amp;rsquo;s working?
Solution TKG uses the ClusterAPI provider, part of the Cluster Autoscaler but makes it easy to configure. We&amp;rsquo;ll ask TKG to enable Cluster Autoscaler for us, dial in a few options, and then test it out.
Note: As of this writing, the latest version of TKG is 1.</description></item><item><title>User Management in Tanzu Kubernetes Grid (TKG)</title><link>https://www.tacticalprogramming.com/posts/user-auth-in-tanzu-tkg/</link><pubDate>Mon, 28 Jun 2021 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/user-auth-in-tanzu-tkg/</guid><description>Problem User management is not part of Kubernetes. You have to tie Kubernetes to an external system. This gets&amp;hellip;. complicated.
Solution For TKG, we can hook our Kubernetes clusters up to any OIDC provider. For this excercise, we&amp;rsquo;ll use Okta. At a high level, here&amp;rsquo;s what we&amp;rsquo;ll do.
Create a new &amp;lsquo;app&amp;rsquo; in Okta. This will give us our OIDC endpoint. Deploy a management cluster, configuring it to point to our Okta app Update our Okta app with a callback URL (created during the management cluster creation process) Generate kubeconfig and test Create RoleBinding and finalize This has some big advantages, most notable is the centralizing of user management.</description></item><item><title>GPU-Enabled Kubernetes Clusters with Tanzu Kubernetes Grid</title><link>https://www.tacticalprogramming.com/posts/tanzu-tkg-and-gpu-kubernetes-clusters/</link><pubDate>Mon, 24 May 2021 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/tanzu-tkg-and-gpu-kubernetes-clusters/</guid><description>Stated Goal We want easy GPU access for Kubernetes workloads in our TKG clusters. This is done by:
Installing GPU device drivers on our Kubernetes worker nodes Installing the device plugins on our Kubernetes worker nodes Applying the appropriate labels to our Kubernetes worker nodes so that GPU workloads can find them. The Nvidia GPU Operator does all three for us.
I&amp;rsquo;m Impatient. Just Tell Me What to Type If you just want to get up and running and move on with life, here you go.</description></item><item><title>kapp-controller Getting Started</title><link>https://www.tacticalprogramming.com/posts/kapp-controller-getting-started/</link><pubDate>Mon, 22 Feb 2021 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/kapp-controller-getting-started/</guid><description>Problem As of today, there is no single answer to the question &amp;ldquo;How do I deploy my workload?&amp;rdquo;. Helm Chart? A set of yaml files? Templated yaml files?
And not just user-facing apps - how do I consistently deploy ingress controllers? K8s cluster user auth services? Diagnostics, metrics, and so forth?
We need one answer to this question. Enter kapp and kapp-controller.
In this post, we&amp;rsquo;re going to focus on kapp-controller and show how to set up a reconciliation loop that gives you the ability to push a new version of your workload into your Kubernetes cluster with just a git push (hi Gitops!</description></item><item><title>Vsphere 7u1 - Embedded Kubernetes with HA Proxy and Ubiquiti Home Networking Setup</title><link>https://www.tacticalprogramming.com/posts/vsphere-7u1-ubiquiti-networking-example/</link><pubDate>Thu, 15 Oct 2020 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/vsphere-7u1-ubiquiti-networking-example/</guid><description>Problem Now that Vsphere 7u1 is out (yay!), you, too, can run Vsphere with Kubernetes without NSX-T. But for the home lab of a former developer, what does that look like? We have our fancy Ubiquiti networking but we&amp;rsquo;re not sure how to make the right networks. We also don&amp;rsquo;t know how to make those networks work on our Vsphere gear. If you&amp;rsquo;re approaching Vsphere with Kubernetes from an app down perspective (that is, you&amp;rsquo;re better at Kubernetes than you are at Vsphere), we&amp;rsquo;re going to explain how you can set up your network to prepare for enabling Workload Management.</description></item><item><title>Vsphere 7 with Kubernetes Quickstart - User Edition</title><link>https://www.tacticalprogramming.com/posts/vsphere-7-with-kubernetes-user-quickstart/</link><pubDate>Tue, 18 Aug 2020 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/vsphere-7-with-kubernetes-user-quickstart/</guid><description>Problem You got a Kubernetes! Your Vsphere team has given you access to a Vsphere Workload Management Namespace, which means you can start making clusters! But how, exactly? Assuming they didn&amp;rsquo;t give you enough directions, how do you from &amp;lsquo;access&amp;rsquo; to &amp;lsquo;I have a Kubernetes workload!&amp;rsquo; ?
Solution At a high level, you&amp;rsquo;ll need to log into the Supervisor cluster built into Vsphere. After doing that, you can target the supervisor namespace created for you and get to work creating clusters and using them.</description></item><item><title>Troubleshooting Roblox Teleport Hijacking</title><link>https://www.tacticalprogramming.com/posts/roblox-teleport-hijacking-troubleshooting/</link><pubDate>Mon, 22 Jun 2020 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/roblox-teleport-hijacking-troubleshooting/</guid><description>Problem You may occasionally find that a game you made in Roblox has been hijacked and immediately teleports you to another game when you start. This is a total bummer as it takes away all the time you spent creating the game and can leave you feeling helpless.
Bottom line, this is being caused by some code, somewhere, teleporting the player to the target game. This is done (currently) by a call to Teleport() in the API, found here.</description></item><item><title>Simple MongoDB Deployment in Kubernetes with Private Access</title><link>https://www.tacticalprogramming.com/posts/simple-private-mongo-in-kubernetes/</link><pubDate>Mon, 15 Jun 2020 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/simple-private-mongo-in-kubernetes/</guid><description>Problem We want to deploy a simple (read: development) instance of MongoDB in our Kubernetes cluster with as little work as possible. Additionally, we&amp;rsquo;d like to make that MongoDB deployment available to services outside the k8s cluster but not outside our VPC
Solution Use Bitnami&amp;rsquo;s MongoDB helm chart to deploy MongoDB, then expose the service via a Kubernetes service of type LoadBalancer.
Assumptions We assume you:
are in AWS (not EKS, just living in AWS) already have a Kubernetes and have appropriately tagged your public subnets to allow Kubernetes to create load balancers for you on your behalf.</description></item><item><title>PKS - Proper Kubernetes Cluster Creation and Handoff</title><link>https://www.tacticalprogramming.com/posts/pks-k8s-handoff-workflow/</link><pubDate>Fri, 24 Apr 2020 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/pks-k8s-handoff-workflow/</guid><description>Note: This will be light on details. The exact commands to run, unfortunately, are an exercise left to the reader. This post is more of a tactical guideline to jog your memory. The author regrets the lack of detail.
Problem Creating your k8s clusters is just the first step. How do you hand the cluster off to the right people so you don&amp;rsquo;t have to worry about it anymore? How do you give them access while keeping others out?</description></item><item><title>Jenkins Pipelines and Docker - An Introduction</title><link>https://www.tacticalprogramming.com/posts/jenkins-pipeline-with-docker-intro/</link><pubDate>Tue, 11 Jun 2019 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/jenkins-pipeline-with-docker-intro/</guid><description>Problem We have Jenkins. We also have a need to build and deploy a typical application (in this case, a Java application). We need a way to go from &amp;ldquo;I just installed Jenkins&amp;rdquo; to &amp;ldquo;We have a Jenkins pipeline that can build and deploy our code&amp;rdquo;.
Solution We will install the bare minimum of extra packages on our Jenkins server (and slaves, if necessary), then write a pipeline to fetch, build, and deploy our code.</description></item><item><title>Managing Your own CA and Issuing a Wildcard Cert</title><link>https://www.tacticalprogramming.com/posts/self-managed-wildcard-cert/</link><pubDate>Thu, 06 Jun 2019 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/self-managed-wildcard-cert/</guid><description>Disclaimer It was recently brought to my attention that this problem is probably solved by using certstrap, courtesty of Square. If you&amp;rsquo;re in a hurry, I&amp;rsquo;d encourage you to go and give that a try first.
Link: https://github.com/square/certstrap
I&amp;rsquo;m leaving the below for posterity and pedagogical use.
Problem Wildcard certs are expensive, especially for home labs. It seems, though, that the Internet is full of how-to&amp;rsquo;s and &amp;ldquo;works for me!&amp;rdquo; type solutions.</description></item><item><title>Pivotal Cloud Foundry and VM Extensions in AWS</title><link>https://www.tacticalprogramming.com/posts/pcf-vm-extensions/</link><pubDate>Tue, 07 May 2019 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/pcf-vm-extensions/</guid><description>Problem As of this writing, the docs for deploying PCF on Amazon using Terraform have a gap that could lead to a lot of frustration. In short, the Terraform files and docs have switched to using Network Load Balancers instead of &amp;lsquo;Classic&amp;rsquo;, Elastic Load Balancers. The end result is there is a detail that we need to implement ourselves.
The problem is that our router vms need to be placed behind the web-lb-security-group in order to accept HTTP/HTTPS traffic.</description></item><item><title>Creating Small Local Offline Apt Repos</title><link>https://www.tacticalprogramming.com/posts/offline-apt-repo/</link><pubDate>Thu, 17 Jan 2019 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/offline-apt-repo/</guid><description>Problem We have an offline (i.e. airgapped) Ubuntu machine (or machines) and the need to install packages on them. We also are unable to stand up our own repo mirror (because reasons), so all we have is our single machine with limited disk space.
Solution Package up only the binaries that we need and create a local repo on said airgapped machine.
In full transparency, the clean, &amp;ldquo;right&amp;rdquo; way to do this is to create a mirror of the repo in your airgapped network and simply use that.</description></item><item><title>Another Certificate Request Post with SAN Action</title><link>https://www.tacticalprogramming.com/posts/many-cert-requests/</link><pubDate>Wed, 17 Oct 2018 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/many-cert-requests/</guid><description>Problem We need to make several Certificate Signing Requests (CSRs) for our datacenter. Two, or two-thousand, it doesn&amp;rsquo;t matter. We&amp;rsquo;re putting together a one-liner that will solve it for us. Of course we&amp;rsquo;re automating it.
Solution Create a text file containing your server short names. Say, servers.txt.
text Copy salt-master-01 es-data-01 es-data-02 es-data-03 es-data-04 es-data-05 es-data-06 es-kibana-01 streamsets-sdc-01 streamsets-sdc-02 Set your domain via an environment variable:
sh Copy DOMAIN=lab.company.com And fire away:</description></item><item><title>Simple Bash Expansion</title><link>https://www.tacticalprogramming.com/posts/simple-bash-expansion/</link><pubDate>Fri, 05 Oct 2018 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/simple-bash-expansion/</guid><description>In keeping with the fundamentals, here&amp;rsquo;s a handy one-liner to save yourself a few extra commands.
Problem We want to delete a number of machines via Salt Cloud, but we want it in a one-liner because we hate typing the same thing over and over.
bash Copy $ salt-key Accepted Keys: esdata-01 esdata-02 esdata-03 esdata-05 Four machines. But we want to avoid up-arrowing or copy/pasting each individual one. So&amp;hellip;
Solution bash Copy $ salt-cloud -d $( for x in 1 2 3 5; do echo &amp;#34;esdata-0${x}&amp;#34;; done) The following virtual machines are set to be destroyed: vmware: vmware: esdata-01 esdata-03 esdata-02 esdata-05 And we&amp;rsquo;re done.</description></item><item><title>Saltstack and Dnsmasq for Easy, Predictable Network Space Management</title><link>https://www.tacticalprogramming.com/posts/salt-reactor-dnsmasq/</link><pubDate>Thu, 04 Oct 2018 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/salt-reactor-dnsmasq/</guid><description>Introduction Salt has moved on from simple configuration management and is better described as &amp;ldquo;event-driven automation&amp;rdquo;. At the heart of this argument is the message bus.
A typical follow up to getting your hands around your internal cloud is going to be management of your network space. Let&amp;rsquo;s go through how Salt&amp;rsquo;s event bus can help us solve this problem. This post assumes a simple setup of a /24 network.</description></item><item><title>Saltstack and VMWare - Deploying VMs from Templates</title><link>https://www.tacticalprogramming.com/posts/salted-vmware-part-01/</link><pubDate>Wed, 19 Sep 2018 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/salted-vmware-part-01/</guid><description>It turns out that there are a lot of nuances when using Saltstack with VMWare. Let&amp;rsquo;s walk through the requirements for successfully using Saltstack to deploy VMs on VMWare.
Assumptions To narrow the scope of this post, we&amp;rsquo;ll assume the following is already taken care of.
The intended use is to deploy VMs from a template, a la a normal cloud provider. You already have a healthy VMWare environment. Permissions - There are many and I won&amp;rsquo;t pretend to know all of them.</description></item><item><title>On Presumptive Software</title><link>https://www.tacticalprogramming.com/posts/presumptive-software/</link><pubDate>Thu, 30 Aug 2018 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/presumptive-software/</guid><description>If there&amp;rsquo;s one thing that the great Saint Atwood taught me, it&amp;rsquo;s this - software is built to help people do their jobs. That&amp;rsquo;s why we have automation, right? Because we need something done and would rather not spend all our time manually building something. That&amp;rsquo;s why we have software, computers, and all of these crazy frameworks and languages we spend our times learning - so we can build something that someone needs.</description></item><item><title>Saltstack's Python API - An Introduction</title><link>https://www.tacticalprogramming.com/posts/salt-python-api/</link><pubDate>Mon, 20 Aug 2018 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/salt-python-api/</guid><description>I&amp;rsquo;ve always said that Salt is not configuration management. I want to expand on one of the capabilities that Salt, as a platform, can offer you. That capability lies just under all the salt commands you&amp;rsquo;re accustomed to firing on the command line. It&amp;rsquo;s Salt&amp;rsquo;s Python API, not to be confused with the separate salt-api system.
The largest advantage of going down this route is the ability to inspect the return data from a Salt run and, using the full capability of Python, write the logic necessary to make complex decisions that would otherwise be difficult in Bash or an absolute nightmare in Jinja.</description></item><item><title>Adding Virtual Disks in KVM</title><link>https://www.tacticalprogramming.com/posts/kvm-adding-disks/</link><pubDate>Tue, 03 Jul 2018 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/kvm-adding-disks/</guid><description>Sometimes you need to make a few VMs. For me, it&amp;rsquo;s usually libvirt.
We have some scripting around the creation of a number of machines, but what we don&amp;rsquo;t have (yet) is the ability to add additional disks to those VMs. So instead of chasing each machine in the VM Manager UI, let&amp;rsquo;s slap together some bash (remember Bash? Remember the previous entry?).
bash Copy #!/bin/bash # Create, and attach, three additional disks: # /dev/vdb # /dev/vdc # /dev/vdd for vm in `virsh list --name`; do for disk in b c d; do # Fancy disk name disk_name=${vm}-vd${disk}.</description></item><item><title>Invest in the Fundamentals</title><link>https://www.tacticalprogramming.com/posts/fundamentals/</link><pubDate>Mon, 18 Jun 2018 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/posts/fundamentals/</guid><description>If you want to be useful, learn a trade
In trying to keep up with the latest in technology and staying relevant, it&amp;rsquo;s easy to forget that each one of these emerging technologies is built upon a bedrock of simple, reliable tools. Simple tools that you can learn, and then use everywhere you go because they&amp;rsquo;ll never be obsolete.
For my case (and yours, if you&amp;rsquo;re reading this), that means that the fundamentals include (but are certainly not limited to):</description></item><item><title>Team of Teams</title><link>https://www.tacticalprogramming.com/books/team-of-teams/</link><pubDate>Mon, 18 Jun 2018 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/books/team-of-teams/</guid><description>Gen. McChrystal captures and summarizes the experiences during the start of the GWOT (Global War on Terrorism) when Al Qaida, despite having inferior tech and weapons, routinely outsmarts and outmanuevers the US military. He describes identifying the deltas between the two organizations and how the US military completely changed their structure and culture to adapt and overcome. Of particular interest to me going into this book is the concept of “Shared Consciousness”, balanced with “Empowered Execution”</description></item><item><title/><link>https://www.tacticalprogramming.com/automatic-updates-for-raspberry-pi/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/automatic-updates-for-raspberry-pi/</guid><description>Title: Automatic Updates for Raspberry Pi&amp;rsquo;s Date: 2022-05-15 Category: howto
Problem Raspberry Pi&amp;rsquo;s are great but they don&amp;rsquo;t automatically update themselves. And once we&amp;rsquo;ve figured out how to make them do whatever it is we wanted them to do, we&amp;rsquo;re not likely to log back in just for updates.
We need to set the machine to update itself.
Solution There are, no doubt, a number of ways to do this. The following approach just drops an entry into /etc/crontab to make the system update itself and reboot once a day.</description></item><item><title/><link>https://www.tacticalprogramming.com/built-it-but-its-not-enough/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/built-it-but-its-not-enough/</guid><description>Title: Build It, but it&amp;rsquo;s not Enough Date: 2024-08-19 Category: philosophy
You can build the best thing, do your best work. But if no one notices, it doesn&amp;rsquo;t mean anything.
Let me try to illustrate with a story. We were on a vacation to Disneyworld years ago. Disney, if you weren&amp;rsquo;t aware, has engineered just about all the efficiency out of their experience. They track traffic, ridership numbers, they even have data on which garbage cans are the most popular.</description></item><item><title/><link>https://www.tacticalprogramming.com/fundamentals/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/fundamentals/</guid><description>Title: Invest in the Fundamentals Date: 2018-06-18 Category: philosophy
###If you want to be useful, learn a trade
In trying to keep up with the latest in technology and staying relevant, it&amp;rsquo;s easy to forget that each one of these emerging technologies is built upon a bedrock of simple, reliable tools. Simple tools that you can learn, and then use everywhere you go because they&amp;rsquo;ll never be obsolete.
For my case (and yours, if you&amp;rsquo;re reading this), that means that the fundamentals include (but are certainly not limited to):</description></item><item><title/><link>https://www.tacticalprogramming.com/garmin-venu-3-battery-drain-troubleshooting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/garmin-venu-3-battery-drain-troubleshooting/</guid><description>Title: Troubleshooting Battery Drain Issues on the Garmin Venu 3 Date: 2025-01-07 Category: howto
Problem Garmin Venu 3 watches will sometimes go into severe battery drain mode, measured by more than 1% per hour (normaly, a single charge will last over ten days). This is further complicated by the sheer opacity of the devices. There&amp;rsquo;s no logs, no error indicators, and the only way to interact with the device is a desktop program.</description></item><item><title/><link>https://www.tacticalprogramming.com/in-defense-of-convenience/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/in-defense-of-convenience/</guid><description>Title: In Defense of Convenience Date: 2024-08-13 Category: philosophy
When there&amp;rsquo;s a setback, a technical bump in the road, people who don&amp;rsquo;t really care will dismiss the problem with &amp;ldquo;it&amp;rsquo;s just an inconvenience&amp;rdquo;. The subtext is &amp;ldquo;grow up, deal with it&amp;rdquo;.
But convenience has knock-on effects:
convenient things get done often, because they&amp;rsquo;re easy to do convenient things free up time, because they take less time convenient things can be done by anyone, because they&amp;rsquo;re easy to do Making something &amp;ldquo;convenient&amp;rdquo; isn&amp;rsquo;t just about making the job cushier.</description></item><item><title/><link>https://www.tacticalprogramming.com/its-always-the-service/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/its-always-the-service/</guid><description>Title: It&amp;rsquo;s Always the Service Date: 2024-09-09 Category: philosophy
I love reading. I love the idea of books, to the point that a small, always ongoing vanity project of mine is a library of books I find special. This means there are always a few books in flight (I should probably practice better focus and work on only one book at a time).
So anyway, I was reading a memoir from someone in the restaurant industry.</description></item><item><title/><link>https://www.tacticalprogramming.com/jenkins-pipeline-with-docker-intro/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/jenkins-pipeline-with-docker-intro/</guid><description>Title: Jenkins Pipelines and Docker - An Introduction Date: 2019-06-11 Category: howto
Problem We have Jenkins. We also have a need to build and deploy a typical application (in this case, a Java application). We need a way to go from &amp;ldquo;I just installed Jenkins&amp;rdquo; to &amp;ldquo;We have a Jenkins pipeline that can build and deploy our code&amp;rdquo;.
Solution We will install the bare minimum of extra packages on our Jenkins server (and slaves, if necessary), then write a pipeline to fetch, build, and deploy our code.</description></item><item><title/><link>https://www.tacticalprogramming.com/kapp-controller-getting-started/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/kapp-controller-getting-started/</guid><description>Title: kapp-controller Getting Started Date: 2021-02-22 Category: howto
Problem As of today, there is no single answer to the question &amp;ldquo;How do I deploy my workload?&amp;rdquo;. Helm Chart? A set of yaml files? Templated yaml files?
And not just user-facing apps - how do I consistently deploy ingress controllers? K8s cluster user auth services? Diagnostics, metrics, and so forth?
We need one answer to this question. Enter kapp and kapp-controller.</description></item><item><title/><link>https://www.tacticalprogramming.com/kubernetes-cert-manager-letsencrypt/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/kubernetes-cert-manager-letsencrypt/</guid><description>Title: Using cert-manager in Kubernetes with Lets Encrypt Date: 2022-01-19 Category: howto
Problem We have Kubernetes. We need a cert. We want to use Let&amp;rsquo;s Encrypt to create (and manage) that cert for us.
Solution We can install cert-manager and, with three objects, do exactly that. At a high level, we create a ClusterIssuer, we configure it with our cloud credentials (in this case AWS), and we request a certificate.</description></item><item><title/><link>https://www.tacticalprogramming.com/kubernetes-cluster-autoscaling-in-tkg/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/kubernetes-cluster-autoscaling-in-tkg/</guid><description>Title: Cluster Node Autoscaling in Tanzu Kubernetes Grid (TKG) Date: 2021-10-19 Category: howto
Problem We need to reliably implement cluster autoscaling for our Kubernetes platform. How can we do that? And how can we know it&amp;rsquo;s working?
Solution TKG uses the ClusterAPI provider, part of the Cluster Autoscaler but makes it easy to configure. We&amp;rsquo;ll ask TKG to enable Cluster Autoscaler for us, dial in a few options, and then test it out.</description></item><item><title/><link>https://www.tacticalprogramming.com/kvm-adding-disks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/kvm-adding-disks/</guid><description>Title: Adding Virtual Disks in KVM Date: 2018-07-03 Category: howto
Sometimes you need to make a few VMs. For me, it&amp;rsquo;s usually libvirt.
We have some scripting around the creation of a number of machines, but what we don&amp;rsquo;t have (yet) is the ability to add additional disks to those VMs. So instead of chasing each machine in the VM Manager UI, let&amp;rsquo;s slap together some bash (remember Bash? Remember the previous entry?</description></item><item><title/><link>https://www.tacticalprogramming.com/many-cert-requests/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/many-cert-requests/</guid><description>Title: Another Certificate Request Post with SAN Action Date: 2018-10-17 Category: howto
Problem We need to make several Certificate Signing Requests (CSRs) for our datacenter. Two, or two-thousand, it doesn&amp;rsquo;t matter. We&amp;rsquo;re putting together a one-liner that will solve it for us. Of course we&amp;rsquo;re automating it.
Solution Create a text file containing your server short names. Say, servers.txt.
text Copy salt-master-01 es-data-01 es-data-02 es-data-03 es-data-04 es-data-05 es-data-06 es-kibana-01 streamsets-sdc-01 streamsets-sdc-02 Set your domain via an environment variable:</description></item><item><title/><link>https://www.tacticalprogramming.com/offline-apt-repo/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/offline-apt-repo/</guid><description>Title: Creating Small Local Offline Apt Repos Date: 2019-01-17 Category: howto
Problem We have an offline (i.e. airgapped) Ubuntu machine (or machines) and the need to install packages on them. We also are unable to stand up our own repo mirror (because reasons), so all we have is our single machine with limited disk space.
Solution Package up only the binaries that we need and create a local repo on said airgapped machine.</description></item><item><title/><link>https://www.tacticalprogramming.com/pcf-vm-extensions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/pcf-vm-extensions/</guid><description>Title: Pivotal Cloud Foundry and VM Extensions in AWS Date: 2019-05-07 Category: howto
Problem As of this writing, the docs for deploying PCF on Amazon using Terraform have a gap that could lead to a lot of frustration. In short, the Terraform files and docs have switched to using Network Load Balancers instead of &amp;lsquo;Classic&amp;rsquo;, Elastic Load Balancers. The end result is there is a detail that we need to implement ourselves.</description></item><item><title/><link>https://www.tacticalprogramming.com/pks-k8s-handoff-workflow/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/pks-k8s-handoff-workflow/</guid><description>Title: PKS - Proper Kubernetes Cluster Creation and Handoff Date: 2020-04-24 Category: howto
Note: This will be light on details. The exact commands to run, unfortunately, are an exercise left to the reader. This post is more of a tactical guideline to jog your memory. The author regrets the lack of detail.
Problem Creating your k8s clusters is just the first step. How do you hand the cluster off to the right people so you don&amp;rsquo;t have to worry about it anymore?</description></item><item><title/><link>https://www.tacticalprogramming.com/presumptive-software/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/presumptive-software/</guid><description>Title: On Presumptive Software Date: 2018-08-30 Category: philosophy
If there&amp;rsquo;s one thing that the great Saint Atwood taught me, it&amp;rsquo;s this - software is built to help people do their jobs. That&amp;rsquo;s why we have automation, right? Because we need something done and would rather not spend all our time manually building something. That&amp;rsquo;s why we have software, computers, and all of these crazy frameworks and languages we spend our times learning - so we can build something that someone needs.</description></item><item><title/><link>https://www.tacticalprogramming.com/progress-not-perfection/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/progress-not-perfection/</guid><description>Title: Progress, Not Perfection Date: 2024-09-24 Category: philosophy
With thanks to Arnold, Adam, and Ketch for the pointers.
I recently finished The Foundation workout program in Arnold&amp;rsquo;s Pump Club. This is a 90-day workout program with multiple workouts per week.
I finished it after ten months.
Injuries, sickness, work schedule, life events. There was always something slowing me down but I always got back to it once I had the time &amp;amp; ability.</description></item><item><title/><link>https://www.tacticalprogramming.com/responsibility-to-the-audience/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/responsibility-to-the-audience/</guid><description>Title: Your Responsibility to the Audience Date: 2024-08-26 Category: philosophy
When you&amp;rsquo;re the one talking, all eyes are on you. This means several things:
Everyone showed up to accomplish something. We all dedicated this time to this thing. We chose to be here instead of anywhere else. It doesn&amp;rsquo;t matter if it&amp;rsquo;s a three-person meeting to decide on today&amp;rsquo;s work or a recorded TED Talk with tens of thousands of people in the audience.</description></item><item><title/><link>https://www.tacticalprogramming.com/roblox-teleport-hijacking-troubleshooting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/roblox-teleport-hijacking-troubleshooting/</guid><description>Title: Troubleshooting Roblox Teleport Hijacking Date: 2020-06-22 Category: howto
Problem You may occasionally find that a game you made in Roblox has been hijacked and immediately teleports you to another game when you start. This is a total bummer as it takes away all the time you spent creating the game and can leave you feeling helpless.
Bottom line, this is being caused by some code, somewhere, teleporting the player to the target game.</description></item><item><title/><link>https://www.tacticalprogramming.com/rotate-pinniped-credentials-in-tanzu-tkg/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/rotate-pinniped-credentials-in-tanzu-tkg/</guid><description>Title: Rotating Pinniped Credentials in Tanzu Kubernetes Grid Date: 2021-12-16 Category: howto
Problem We&amp;rsquo;ve successfully implemented user authentication in our TKG clusters. Now, we&amp;rsquo;d like to update the client ID/secret for our TKG Management Cluster.
Solution TKG uses Pinniped to support authentication, including to OIDC providers. However, exactly which Kubernetes object we need to update/reconfigure is not immediately obvious. Fortunately, we only need to update one object, and the cluster takes care of the rest for us.</description></item><item><title/><link>https://www.tacticalprogramming.com/running-openwebui-and-ollama-docker-compose/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/running-openwebui-and-ollama-docker-compose/</guid><description>Title: Running OpenWebUI and Ollama in Docker Compose with GPU Support Date: 2025-06-05 Category: howto
Problem We want to run OpenWebUI so we have an easy way to interact with, and test out, LLMs. We also want the convenience of Ollama for managing/running our models for us. We also want to make use of the GPU in our system.
Solution Go the lazy simple route of running both inside containers. We&amp;rsquo;ll coordinate the tech with docker-compose.</description></item><item><title/><link>https://www.tacticalprogramming.com/salt-python-api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/salt-python-api/</guid><description>Title: Saltstack&amp;rsquo;s Python API - An Introduction Date: 2018-08-20 Category: howto
I&amp;rsquo;ve always said that Salt is not configuration management. I want to expand on one of the capabilities that Salt, as a platform, can offer you. That capability lies just under all the salt commands you&amp;rsquo;re accustomed to firing on the command line. It&amp;rsquo;s Salt&amp;rsquo;s Python API, not to be confused with the separate salt-api system.
The largest advantage of going down this route is the ability to inspect the return data from a Salt run and, using the full capability of Python, write the logic necessary to make complex decisions that would otherwise be difficult in Bash or an absolute nightmare in Jinja.</description></item><item><title/><link>https://www.tacticalprogramming.com/salt-reactor-dnsmasq/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/salt-reactor-dnsmasq/</guid><description>Title: Saltstack and Dnsmasq for Easy, Predictable Network Space Management Date: 2018-10-04 Category: howto
Introduction Salt has moved on from simple configuration management and is better described as &amp;ldquo;event-driven automation&amp;rdquo;. At the heart of this argument is the message bus.
A typical follow up to getting your hands around your internal cloud is going to be management of your network space. Let&amp;rsquo;s go through how Salt&amp;rsquo;s event bus can help us solve this problem.</description></item><item><title/><link>https://www.tacticalprogramming.com/salted-vmware-part-01/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/salted-vmware-part-01/</guid><description>Title: Saltstack and VMWare - Deploying VMs from Templates Date: 2018-09-19 Category: howto
It turns out that there are a lot of nuances when using Saltstack with VMWare. Let&amp;rsquo;s walk through the requirements for successfully using Saltstack to deploy VMs on VMWare.
Assumptions To narrow the scope of this post, we&amp;rsquo;ll assume the following is already taken care of.
The intended use is to deploy VMs from a template, a la a normal cloud provider.</description></item><item><title/><link>https://www.tacticalprogramming.com/self-managed-wildcard-cert/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/self-managed-wildcard-cert/</guid><description>Title: Managing Your own CA and Issuing a Wildcard Cert Date: 2019-06-06 Category: howto
Disclaimer It was recently brought to my attention that this problem is probably solved by using certstrap, courtesty of Square. If you&amp;rsquo;re in a hurry, I&amp;rsquo;d encourage you to go and give that a try first.
Link: https://github.com/square/certstrap
I&amp;rsquo;m leaving the below for posterity and pedagogical use.
Problem Wildcard certs are expensive, especially for home labs. It seems, though, that the Internet is full of how-to&amp;rsquo;s and &amp;ldquo;works for me!</description></item><item><title/><link>https://www.tacticalprogramming.com/self-signed-certs-with-sans/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/self-signed-certs-with-sans/</guid><description>Title: Self-Signed Certs with Subject Alt Names Date: 2023-05-11 Category: howto
Problem We need to create self-signed certs. But because browsers/tools are finally enforcing what they said they would for years, we have to put the CN into the list of SANs for the cert. This is non-negotiable.
That means we have to use the x509v3 extensions. Which is highly forgettable.
Solution Automate as much as is reasonable. Worth noting that this worked as of this writing for securing an NPM registry proxy.</description></item><item><title/><link>https://www.tacticalprogramming.com/simple-bash-expansion/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/simple-bash-expansion/</guid><description>Title: Simple Bash Expansion Date: 2018-10-05 Category: howto
In keeping with the fundamentals, here&amp;rsquo;s a handy one-liner to save yourself a few extra commands.
Problem We want to delete a number of machines via Salt Cloud, but we want it in a one-liner because we hate typing the same thing over and over.
bash Copy $ salt-key Accepted Keys: esdata-01 esdata-02 esdata-03 esdata-05 Four machines. But we want to avoid up-arrowing or copy/pasting each individual one.</description></item><item><title/><link>https://www.tacticalprogramming.com/simple-private-mongo-in-kubernetes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/simple-private-mongo-in-kubernetes/</guid><description>Title: Simple MongoDB Deployment in Kubernetes with Private Access Date: 2020-06-15 Category: howto
Problem We want to deploy a simple (read: development) instance of MongoDB in our Kubernetes cluster with as little work as possible. Additionally, we&amp;rsquo;d like to make that MongoDB deployment available to services outside the k8s cluster but not outside our VPC
Solution Use Bitnami&amp;rsquo;s MongoDB helm chart to deploy MongoDB, then expose the service via a Kubernetes service of type LoadBalancer.</description></item><item><title/><link>https://www.tacticalprogramming.com/strategic-vs-tactical/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/strategic-vs-tactical/</guid><description>Title: Strategic vs Tactical Date: 2023-02-21 Category: philosophy
Entire books have been written on the topic of Strategic vs Tactical. At the risk of creating more noise, I&amp;rsquo;d like to add my experience to the collection.
Talking with Tom Hatch about, well, a lot of things, this topic came up and he had the best illustration. I&amp;rsquo;m sure you&amp;rsquo;ve heard a varient of it before.
If I&amp;rsquo;m defending my house (let&amp;rsquo;s pretend it&amp;rsquo;s a zombie apocalypse just for fun), the &amp;ldquo;man at the door&amp;rdquo; is my Tactical need.</description></item><item><title/><link>https://www.tacticalprogramming.com/tanzu-tkg-and-gpu-kubernetes-clusters/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/tanzu-tkg-and-gpu-kubernetes-clusters/</guid><description>Title: GPU-Enabled Kubernetes Clusters with Tanzu Kubernetes Grid Date: 2021-05-24 Category: howto
Stated Goal We want easy GPU access for Kubernetes workloads in our TKG clusters. This is done by:
Installing GPU device drivers on our Kubernetes worker nodes Installing the device plugins on our Kubernetes worker nodes Applying the appropriate labels to our Kubernetes worker nodes so that GPU workloads can find them. The Nvidia GPU Operator does all three for us.</description></item><item><title/><link>https://www.tacticalprogramming.com/user-auth-in-tanzu-tkg/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/user-auth-in-tanzu-tkg/</guid><description>Title: User Management in Tanzu Kubernetes Grid (TKG) Date: 2021-06-28 Category: howto
Problem User management is not part of Kubernetes. You have to tie Kubernetes to an external system. This gets&amp;hellip;. complicated.
Solution For TKG, we can hook our Kubernetes clusters up to any OIDC provider. For this excercise, we&amp;rsquo;ll use Okta. At a high level, here&amp;rsquo;s what we&amp;rsquo;ll do.
Create a new &amp;lsquo;app&amp;rsquo; in Okta. This will give us our OIDC endpoint.</description></item><item><title/><link>https://www.tacticalprogramming.com/vsphere-7-with-kubernetes-user-quickstart/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/vsphere-7-with-kubernetes-user-quickstart/</guid><description>Title: Vsphere 7 with Kubernetes Quickstart - User Edition Date: 2020-08-18 Category: howto
Problem You got a Kubernetes! Your Vsphere team has given you access to a Vsphere Workload Management Namespace, which means you can start making clusters! But how, exactly? Assuming they didn&amp;rsquo;t give you enough directions, how do you from &amp;lsquo;access&amp;rsquo; to &amp;lsquo;I have a Kubernetes workload!&amp;rsquo; ?
Solution At a high level, you&amp;rsquo;ll need to log into the Supervisor cluster built into Vsphere.</description></item><item><title/><link>https://www.tacticalprogramming.com/vsphere-7u1-ubiquiti-networking-example/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/vsphere-7u1-ubiquiti-networking-example/</guid><description>Title: Vsphere 7u1 - Embedded Kubernetes with HA Proxy and Ubiquiti Home Networking Setup Date: 2020-10-15 Category: howto
Problem Now that Vsphere 7u1 is out (yay!), you, too, can run Vsphere with Kubernetes without NSX-T. But for the home lab of a former developer, what does that look like? We have our fancy Ubiquiti networking but we&amp;rsquo;re not sure how to make the right networks. We also don&amp;rsquo;t know how to make those networks work on our Vsphere gear.</description></item><item><title/><link>https://www.tacticalprogramming.com/wiz-mcp-server-with-wsl/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/wiz-mcp-server-with-wsl/</guid><description>Title: Running the Wiz MCP Server in WSL2 Date: 2025-06-04 Category: howto
Problem We want to take advantage of the Wiz MCP Server on our Windows workstation running WSL2.
Solution The long-term solution to this is to just host the MCP server in a central location and put something like the OpenWebUI OpenAI Proxy in front of it. But this is a fast-moving area so we&amp;rsquo;ll scope this article to our local workstation.</description></item><item><title/><link>https://www.tacticalprogramming.com/your-core-skillset/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.tacticalprogramming.com/your-core-skillset/</guid><description>Title: Your Core Skillset Date: 2024-09-03 Category: philosophy
For the longest time, Garmin was &amp;ldquo;the GPS company&amp;rdquo;. They sold those bricks that you mount on your car dashboard and would help you get from Point A to Point B. They even had custom voice packs you could buy; and this was before it was easy to generate it with AI so you had to pay real money to the real Samuel L.</description></item></channel></rss>