<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: RAUL TAPARA YANGALI</title>
    <description>The latest articles on DEV Community by RAUL TAPARA YANGALI (@rtaparay).</description>
    <link>https://dev.to/rtaparay</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1506976%2F6e48701b-8ae4-49bb-ab6a-9a453107aa17.jpg</url>
      <title>DEV Community: RAUL TAPARA YANGALI</title>
      <link>https://dev.to/rtaparay</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rtaparay"/>
    <language>en</language>
    <item>
      <title>🚀 StackOpsys: Part 3-Automating Kubernetes Infrastructure on Proxmox with Packer, Terraform and Ansible</title>
      <dc:creator>RAUL TAPARA YANGALI</dc:creator>
      <pubDate>Thu, 04 Sep 2025 03:03:58 +0000</pubDate>
      <link>https://dev.to/rtaparay/stackopsys-part-3-automating-kubernetes-infrastructure-on-proxmox-with-packer-terraform-5fl2</link>
      <guid>https://dev.to/rtaparay/stackopsys-part-3-automating-kubernetes-infrastructure-on-proxmox-with-packer-terraform-5fl2</guid>
      <description>&lt;p&gt;🧱 What’s included in this phase?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; ✅ Automated Kubernetes cluster installation with kubeadm&lt;/li&gt;
&lt;li&gt; ✅ Master and worker nodes configuration with containerd runtime&lt;/li&gt;
&lt;li&gt; ✅ Network modules preparation for Istio&lt;/li&gt;
&lt;li&gt; ✅ SSH key management and passwordless authentication&lt;/li&gt;
&lt;li&gt; ✅ Cluster verification and kubeconfig setup&lt;/li&gt;
&lt;li&gt; ✅ Task automation with go-task for streamlined operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📦 Technologies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🤖 Ansible 2.9+&lt;/li&gt;
&lt;li&gt;☸️ Kubernetes (kubeadm)&lt;/li&gt;
&lt;li&gt;🐳 Containerd Runtime&lt;/li&gt;
&lt;li&gt;⚡  Task (go-task) for automation
🐧 Ubuntu Server 24.04 LTS&lt;/li&gt;
&lt;li&gt;🔧 Python 3.13&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🌐 Setting Up StackOpsys Overview&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc0he73kn2udaluiotqnt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc0he73kn2udaluiotqnt.png" alt=" " width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📁 Project Structure Overview&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ansible/
├── ansible.cfg              # Ansible configuration
├── site.yaml               # Main playbook
├── Taskfile.yml            # Automated tasks with Task
├── inventory/
│   ├── hosts.ini           # Host inventory
│   └── group_vars/
│       └── all.yaml        # Global variables
├── roles/
│   ├── prepare-nodes/      # Node preparation
│   ├── configure-master-node/  # Master configuration
│   ├── configure-worker-node/  # Worker configuration
│   ├── kubeconfig/         # Kubeconfig setup
│   └── reset-vm/           # Cluster reset (optional)
├── collections/
│   └── requirements.yaml   # Required Ansible collections
└── output/                 # Logs and output files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h2&gt;
  
  
  🔄 Detailed Workflow:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fepowcjyj2qrlmr9e612e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fepowcjyj2qrlmr9e612e.png" alt=" " width="800" height="1378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⚙️ Configuration Examples&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inventory Configuration&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[k8s_master]&lt;/span&gt;
&lt;span class="err"&gt;cluster-kubeadm-k8s-master-01&lt;/span&gt; &lt;span class="py"&gt;ansible_host&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;192.168.100.220&lt;/span&gt;

&lt;span class="nn"&gt;[k8s_worker]&lt;/span&gt;
&lt;span class="err"&gt;cluster-kubeadm-k8s-worker-01&lt;/span&gt; &lt;span class="py"&gt;ansible_host&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;192.168.100.223&lt;/span&gt;
&lt;span class="err"&gt;cluster-kubeadm-k8s-worker-02&lt;/span&gt; &lt;span class="py"&gt;ansible_host&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;192.168.100.224&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Global Variables&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;os&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;linux"&lt;/span&gt;
&lt;span class="na"&gt;arch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;amd64"&lt;/span&gt;
&lt;span class="na"&gt;ansible_user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;user&amp;gt;&lt;/span&gt;
&lt;span class="na"&gt;ansible_ssh_private_key_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;~/.ssh/ansible&lt;/span&gt;
&lt;span class="na"&gt;ansible_become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cluster Architecture&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Master Node&lt;/strong&gt;: 1 node (192.168.100.220)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Worker Nodes&lt;/strong&gt;: 2 nodes (192.168.100.223, 192.168.100.224)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime&lt;/strong&gt;: Containerd&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network&lt;/strong&gt;: Pre-configured for Istio&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;🚀 Usage Steps&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Prerequisites Setup&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Task (MacOS)&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;go-task/tap/go-task

&lt;span class="c"&gt;# Install Ansible collections&lt;/span&gt;
ansible-galaxy collection &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; collections/requirements.yaml

&lt;span class="c"&gt;# Setup SSH keys&lt;/span&gt;
ssh-copy-id &lt;span class="nt"&gt;-i&lt;/span&gt; ~/.ssh/ansible.pub rtaparay@192.168.100.220
ssh-copy-id &lt;span class="nt"&gt;-i&lt;/span&gt; ~/.ssh/ansible.pub rtaparay@192.168.100.223
ssh-copy-id &lt;span class="nt"&gt;-i&lt;/span&gt; ~/.ssh/ansible.pub rtaparay@192.168.100.224
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Testing (Dry Run)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Test complete configuration&lt;/span&gt;
task &lt;span class="nb"&gt;test&lt;/span&gt;:all

&lt;span class="c"&gt;# Test master only&lt;/span&gt;
task &lt;span class="nb"&gt;test&lt;/span&gt;:site:master

&lt;span class="c"&gt;# Test workers only&lt;/span&gt;
task &lt;span class="nb"&gt;test&lt;/span&gt;:site:worker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Full Deployment&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Execute complete configuration&lt;/span&gt;
task apply:all

&lt;span class="c"&gt;# Or step by step&lt;/span&gt;
task apply:site
task apply:kubeconfig
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Alternative: Direct Ansible&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Connectivity verification&lt;/span&gt;
ansible all &lt;span class="nt"&gt;-i&lt;/span&gt; inventory/hosts.ini &lt;span class="nt"&gt;-m&lt;/span&gt; ping

&lt;span class="c"&gt;# Full deployment&lt;/span&gt;
ansible-playbook site.yaml &lt;span class="nt"&gt;-i&lt;/span&gt; inventory/hosts.ini
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔧 Ansible Roles Breakdown:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;prepare-nodes&lt;/strong&gt; - Disables swap permanently - Configures kernel&lt;br&gt;
modules (overlay, br_netfilter) - Installs and configures containerd -&lt;br&gt;
Prepares modules for Istio/Kubeflow - Installs kubeadm, kubelet, and&lt;br&gt;
kubectl&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;configure-master-node&lt;/strong&gt; - Initializes Kubernetes cluster with&lt;br&gt;
kubeadm - Configures cluster networking - Generates join tokens for&lt;br&gt;
worker nodes&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;configure-worker-node&lt;/strong&gt; - Joins worker nodes to the cluster -&lt;br&gt;
Configures kubelet on worker nodes&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;kubeconfig&lt;/strong&gt; - Copies kubeconfig from master node - Sets up cluster&lt;br&gt;
access configuration&lt;/p&gt;


&lt;h2&gt;
  
  
  📊 Outputs &amp;amp; Verification
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Generated Files&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;output/
├── ansible-2025-01-XX_XX-XX-XX.log  # Execution logs
└── kubeconfig                        # Kubernetes config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Cluster Verification Commands&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Copy kubeconfig locally&lt;/span&gt;
scp rtaparay@192.168.100.220:~/.kube/config ~/.kube/config

&lt;span class="c"&gt;# Verify cluster status&lt;/span&gt;
kubectl get nodes
kubectl get pods &lt;span class="nt"&gt;-A&lt;/span&gt;
kubectl cluster-info
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Expected Output&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME                            STATUS   ROLES           AGE   VERSION
cluster-kubeadm-k8s-master-01   Ready    control-plane   5m    v1.28.x
cluster-kubeadm-k8s-worker-01   Ready    &amp;lt;none&amp;gt;          3m    v1.28.x
cluster-kubeadm-k8s-worker-02   Ready    &amp;lt;none&amp;gt;          3m    v1.28.x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h2&gt;
  
  
  🔄 Task Automation Features
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Available Tasks&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;task init&lt;/code&gt; - Initialize log directories &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;task test:all&lt;/code&gt; - Run all tests (dry-run) &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;task apply:all&lt;/code&gt; - Full cluster deployment &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;task apply:site&lt;/code&gt; - Main playbook execution &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;task apply:kubeconfig&lt;/code&gt; - Kubeconfig setup only&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Automated Logging&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Timestamped log files &lt;/li&gt;
&lt;li&gt;Structured output
directory &lt;/li&gt;
&lt;li&gt;Verbose execution tracking&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ Troubleshooting &amp;amp; Reset
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Common Issues&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# SSH connectivity test&lt;/span&gt;
ansible all &lt;span class="nt"&gt;-i&lt;/span&gt; inventory/hosts.ini &lt;span class="nt"&gt;-m&lt;/span&gt; ping

&lt;span class="c"&gt;# Manual swap disable&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;swapoff &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;span class="nb"&gt;sudo sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/ swap / s/^/#/'&lt;/span&gt; /etc/fstab

&lt;span class="c"&gt;# Verbose execution&lt;/span&gt;
ansible-playbook site.yaml &lt;span class="nt"&gt;-i&lt;/span&gt; inventory/hosts.ini &lt;span class="nt"&gt;-vvv&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cluster Reset (Optional)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Uncomment reset-vm role in site.yaml&lt;/span&gt;
ansible-playbook site.yaml &lt;span class="nt"&gt;-i&lt;/span&gt; inventory/hosts.ini &lt;span class="nt"&gt;--tags&lt;/span&gt; reset
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;With your Kubernetes cluster now fully automated: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔹 Deploy CNI plugins(Calico) &lt;/li&gt;
&lt;li&gt;🔹 Configure service mesh (Istio)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🤝 Complete StackOpsys Journey
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Part 1&lt;/strong&gt;: 🏗️ Custom VM templates with Packer&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 2&lt;/strong&gt;: ☁️ Infrastructure provisioning with Terraform &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 3&lt;/strong&gt;: 🤖 Cluster automation with Ansible &lt;/p&gt;

&lt;p&gt;📁 Full project available at: 👉 github.com/rtaparay/stackopsys&lt;/p&gt;




</description>
    </item>
    <item>
      <title>🚀 StackOpsys: Part 2-Automating Kubernetes Infrastructure on Proxmox with Packer, Terraform and Ansible</title>
      <dc:creator>RAUL TAPARA YANGALI</dc:creator>
      <pubDate>Wed, 20 Aug 2025 05:55:05 +0000</pubDate>
      <link>https://dev.to/rtaparay/stackopsys-part-2-automating-kubernetes-infrastructure-on-proxmox-with-packer-terraform-and-4c4m</link>
      <guid>https://dev.to/rtaparay/stackopsys-part-2-automating-kubernetes-infrastructure-on-proxmox-with-packer-terraform-and-4c4m</guid>
      <description>&lt;p&gt;In the first part of &lt;a href="https://dev.to/rtaparay/stackopsys-part-1-automating-kubernetes-infrastructure-on-proxmox-with-packer-terraform-and-42i2"&gt;StackOpsys&lt;/a&gt;, we built a secure, cloud-init-ready image for Kubernetes using &lt;strong&gt;Packer&lt;/strong&gt;. Now it’s time for &lt;strong&gt;Part 2&lt;/strong&gt;: automating the creation of Kubernetes cluster infrastructure using &lt;strong&gt;Terraform&lt;/strong&gt; on &lt;strong&gt;Proxmox VE&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 What’s included in this phase?
&lt;/h2&gt;

&lt;p&gt;✅ Creation of VMs (master + workers) based on the custom Ubuntu 22.04 template&lt;br&gt;&lt;br&gt;
✅ Modular structure with a reusable &lt;code&gt;vms_proxmox&lt;/code&gt; Terraform module&lt;br&gt;&lt;br&gt;
✅ Network bridge configuration, fixed IPs, and cloud-init enabled&lt;br&gt;&lt;br&gt;
✅ Support for multiple environments (dev, QA, prod) using &lt;code&gt;.tfvars&lt;/code&gt;  &lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Technologies
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🧰 &lt;strong&gt;Terraform&lt;/strong&gt; 1.8+&lt;/li&gt;
&lt;li&gt;☁️ &lt;strong&gt;Proxmox VE&lt;/strong&gt; 8.3.3+&lt;/li&gt;
&lt;li&gt;🐧 &lt;strong&gt;Ubuntu Server 22.04 LTS&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📁 Project Structure Overview
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;terraform/
├── environments/
│   ├── dev.tfvars
│   └── prd.tfvars
├── modules/
│   ├── vms_proxmox/
│   └── tools_k8s/
├── main.tf
├── variables.tf
├── outputs.tf
├── providers.tf
└── .github/workflows/terraform.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚙️ Configuration Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Proxmox Access
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;proxmox&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;endpoint&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://192.168.100.100:8006/api2/json"&lt;/span&gt;
  &lt;span class="nx"&gt;username&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"root"&lt;/span&gt;
  &lt;span class="nx"&gt;password&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"your_password"&lt;/span&gt;
  &lt;span class="nx"&gt;api_token&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"root@pam!iac-tf=your_token"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cluster &amp;amp; VMs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;cluster&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"cluster-kubeadm"&lt;/span&gt;
  &lt;span class="nx"&gt;gateway&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"192.168.100.1"&lt;/span&gt;
  &lt;span class="nx"&gt;cidr&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;
  &lt;span class="nx"&gt;endpoint&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"192.168.100.220"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;vms&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"k8s-master-01"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;ip&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"192.168.100.220"&lt;/span&gt;
    &lt;span class="nx"&gt;cpu&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
    &lt;span class="nx"&gt;ram_dedicated&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4096&lt;/span&gt;
    &lt;span class="nx"&gt;file_id&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"directory:9001/base-9001-disk-0.qcow2"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 Usage Steps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Initialize Terraform
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Plan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform plan &lt;span class="nt"&gt;-var-file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;environments/dev.tfvars
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdz1rk4n5lalgyue2pgtj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdz1rk4n5lalgyue2pgtj.png" alt="plan" width="800" height="643"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Apply
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform apply &lt;span class="nt"&gt;-var-file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;environments/dev.tfvars
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwkm0yxodl25bnbbm05rb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwkm0yxodl25bnbbm05rb.png" alt="apply" width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Destroy (optional)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform destroy &lt;span class="nt"&gt;-var-file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;environments/dev.tfvars
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔐 Outputs
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;cluster_name&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"cluster-kubeadm"&lt;/span&gt;
&lt;span class="nx"&gt;vm_ipv4_address_vms&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="s2"&gt;"192.168.100.220/24"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"192.168.100.223/24"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"192.168.100.224/24"&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔄 GitHub Actions Pipeline
&lt;/h2&gt;

&lt;p&gt;Includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Terraform init/plan/validate/apply&lt;/li&gt;
&lt;li&gt;Secrets stored securely in GitHub&lt;/li&gt;
&lt;li&gt;Reproducible infrastructure builds&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;In &lt;strong&gt;Part 3&lt;/strong&gt;, we’ll use &lt;strong&gt;Ansible&lt;/strong&gt; to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install required packages on each VM&lt;/li&gt;
&lt;li&gt;Configure kubeadm on the master node&lt;/li&gt;
&lt;li&gt;Join the worker nodes automatically&lt;/li&gt;
&lt;li&gt;Deploy networking (e.g., Calico) and additional tools&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📖 &lt;a href="https://github.com/rtaparay/StackOpsys" rel="noopener noreferrer"&gt;Full code and documentation on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow along and let me know what you'd add!&lt;/p&gt;

&lt;h1&gt;
  
  
  DevOps #Terraform #Kubernetes #IaC #Proxmox #Ansible #CI/CD #CloudInit #StackOpsys
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>🚀 StackOpsys: Part 1-Automating Kubernetes Infrastructure on Proxmox with Packer, Terraform and Ansible</title>
      <dc:creator>RAUL TAPARA YANGALI</dc:creator>
      <pubDate>Tue, 19 Aug 2025 05:41:11 +0000</pubDate>
      <link>https://dev.to/rtaparay/stackopsys-part-1-automating-kubernetes-infrastructure-on-proxmox-with-packer-terraform-and-42i2</link>
      <guid>https://dev.to/rtaparay/stackopsys-part-1-automating-kubernetes-infrastructure-on-proxmox-with-packer-terraform-and-42i2</guid>
      <description>&lt;h2&gt;
  
  
  ✨ What is StackOpsys?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;StackOpsys&lt;/strong&gt; is a personal project I'm building to automate the end-to-end deployment of &lt;strong&gt;Kubernetes clusters&lt;/strong&gt; on &lt;strong&gt;Proxmox VE&lt;/strong&gt; using key &lt;strong&gt;Infrastructure as Code (IaC)&lt;/strong&gt; tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔧 &lt;strong&gt;Packer&lt;/strong&gt; → builds custom base images&lt;/li&gt;
&lt;li&gt;⚙️ &lt;strong&gt;Terraform&lt;/strong&gt; → provisions virtual machines on Proxmox&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Ansible&lt;/strong&gt; → installs packages and connects the nodes to the cluster&lt;/li&gt;
&lt;li&gt;☸️ &lt;strong&gt;Kubeadm&lt;/strong&gt; → orchestrates the Kubernetes cluster&lt;/li&gt;
&lt;li&gt;🖥️ &lt;strong&gt;Proxmox VE&lt;/strong&gt; → local virtualization environment&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ Project Status
&lt;/h2&gt;

&lt;p&gt;So far, I’ve completed the &lt;strong&gt;Packer&lt;/strong&gt; phase by creating a secure base image with &lt;strong&gt;Ubuntu Server 24.04 LTS&lt;/strong&gt; that includes system configurations to run Kubernetes properly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Swap disabled&lt;/li&gt;
&lt;li&gt;Kernel modules loaded (&lt;code&gt;br_netfilter&lt;/code&gt;, &lt;code&gt;overlay&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;sysctl network parameters applied&lt;/li&gt;
&lt;li&gt;Firewall configured with &lt;code&gt;firewalld&lt;/code&gt; and required ports open&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This forms a solid base for a fully reproducible cluster deployment.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Using Packer in StackOpsys
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What does this module do?
&lt;/h3&gt;

&lt;p&gt;It creates a custom image in &lt;strong&gt;Proxmox VE&lt;/strong&gt;, ideal for Terraform use. It’s also prepared for integration with Ansible and Kubeadm.&lt;/p&gt;

&lt;h3&gt;
  
  
  Requirements:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A working Proxmox VE setup&lt;/li&gt;
&lt;li&gt;API Token with permissions to create VMs&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.hashicorp.com/packer" rel="noopener noreferrer"&gt;Packer&lt;/a&gt; version ≥ 1.8&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 Installing Packer
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔹 On Ubuntu
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; unzip
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://releases.hashicorp.com/packer/1.9.4/packer_1.9.4_linux_amd64.zip &lt;span class="nt"&gt;-o&lt;/span&gt; packer.zip
unzip packer.zip
&lt;span class="nb"&gt;sudo mv &lt;/span&gt;packer /usr/local/bin/
packer &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔹 On macOS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew tap hashicorp/tap
brew &lt;span class="nb"&gt;install &lt;/span&gt;hashicorp/tap/packer
packer &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 How to Use Packer in StackOpsys
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ Initialize the environment
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/rtaparay/StackOpsys.git
&lt;span class="nb"&gt;cd &lt;/span&gt;packer/base-images
packer init &lt;span class="nt"&gt;-upgrade&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ Validate the template with custom variables
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;packer validate &lt;span class="nt"&gt;-var-file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dev.pkrvars.hcl &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🏗️ Build the image (interactive mode if errors occur)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;packer build &lt;span class="nt"&gt;-on-error&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ask &lt;span class="nt"&gt;-var-file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"dev.pkrvars.hcl"&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔍 Detailed build with logs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;PACKER_LOG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 packer build &lt;span class="nt"&gt;-on-error&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ask &lt;span class="nt"&gt;-var-file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"dev.pkrvars.hcl"&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;tee &lt;/span&gt;logs/packer-build-&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +&lt;span class="s2"&gt;"%Y-%m-%d_%H:%M:%S"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9f1uog6atp2a51tj8hjo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9f1uog6atp2a51tj8hjo.png" alt="1" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbemi86u53krfovhgx6c2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbemi86u53krfovhgx6c2.png" alt="2" width="800" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzgpiwbzyl6ce1ztxv1xz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzgpiwbzyl6ce1ztxv1xz.png" alt="3" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6hrtbqz0h715ast9u0yn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6hrtbqz0h715ast9u0yn.png" alt="4" width="800" height="585"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📁 Project Structure (so far)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;packer
├── base-images
│   ├── files
│   │   └── 99-pve.cfg
│   ├── http
│   │   ├── meta-data
│   │   └── user-data
│   ├── logs
│   ├── dev.pkrvars.hcl
│   ├── scripts
│   │   └── install-kubeadm.sh
│   ├── ubuntu-server-noble.pkr.hcl
│   └── variables.pkr.hcl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔐 Preconfigured Network Security
&lt;/h2&gt;

&lt;p&gt;The image enables &lt;strong&gt;firewalld&lt;/strong&gt; and opens the required ports for Kubernetes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Port/Range&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Protocol&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Function&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Used By&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;6443&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;Kubernetes API&lt;/td&gt;
&lt;td&gt;kube-apiserver&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2379-2380&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;etcd&lt;/td&gt;
&lt;td&gt;etcd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10250&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;Kubelet API&lt;/td&gt;
&lt;td&gt;kubelet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10251&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;kube-scheduler&lt;/td&gt;
&lt;td&gt;kube-scheduler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10252&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;kube-controller-manager&lt;/td&gt;
&lt;td&gt;kube-controller-manager&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  📍 What's Next?
&lt;/h2&gt;

&lt;p&gt;Next phases include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Terraform&lt;/strong&gt; for automatic VM creation in Proxmox using this image
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ansible&lt;/strong&gt; for installing packages and joining nodes to the cluster
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kubeadm&lt;/strong&gt; for control-plane initialization and networking&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All under a clean, modular and fully repeatable flow.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤝 Want to follow or contribute?
&lt;/h2&gt;

&lt;p&gt;📁 Project in progress. You can follow it or drop suggestions here:&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://github.com/rtaparay/stackopsys" rel="noopener noreferrer"&gt;github.com/rtaparay/stackopsys&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;StackOpsys is more than a script or template—it's a complete approach to building infrastructure from scratch, with full control, best practices, and freedom to scale.&lt;/p&gt;

&lt;p&gt;If you're into DevOps, Kubernetes, IaC or building your own Proxmox lab, this might be useful to you!&lt;/p&gt;

&lt;p&gt;Thanks for reading 💻⚙️&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
