https://github.com/gvozdenkov/devops-home-lab
IaC repo for DevOps home lab based on ruspberry pi
https://github.com/gvozdenkov/devops-home-lab
Last synced: 17 days ago
JSON representation
IaC repo for DevOps home lab based on ruspberry pi
- Host: GitHub
- URL: https://github.com/gvozdenkov/devops-home-lab
- Owner: gvozdenkov
- Created: 2025-10-14T11:32:40.000Z (8 months ago)
- Default Branch: main
- Last Pushed: 2025-10-22T13:42:01.000Z (8 months ago)
- Last Synced: 2025-10-22T15:41:20.299Z (8 months ago)
- Language: Shell
- Size: 5.86 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# DevOps Home Lab
To learn and test k8s, gitlab ci, IaC and gitOps principals on raspberry pi home cluster
## Architecture
For the start I use 2 Raspberry Pi to constract bare metal kubernetes cluster:
1. Raspberry Pi 3B+ 1Gb for master node (control plane)
2. Rspberry Pi 5 8Gb for worker node

## Use devcontainers for dev:)
With `devpod`
```sh
# Clean fash build
devpod up . --dotfiles git@github.com:gvozdenkov/dotfiles.git
# Recreate when changes in devcontainer.json, Dockerfile or any other env changes
devpod up . --dotfiles git@github.com:gvozdenkov/dotfiles.git --recreate
# Complately restart workspace from a clean slate
devpod up . --dotfiles git@github.com:gvozdenkov/dotfiles.git --reset
# Any time after build to connect to workspace with IDE
devpod up . --ide vscode
# Connect to container via ssh and then execute commands for terrafrom and ansible
ssh devops-home-lab.devpod
```
### Terraform
Terraform in this context acts as an orchestration and configuration management tool rather than a true infrastructure provisioner

#### Replace / Add node
If some `pi` node breaks, or sd card breaks, or add new node:
1. Go to `terraform/variables.tf`/`terraform.tfvars` and check/add new node setup params (mac address, os, tags, etc.)
2. `terraform apply` new changes. This will generate cloud-init config files and script to write os on SD card for new node in `/terraform/raspberry-pi`
3. Insert SD card and execute `/terraform/raspberry-pi/xxx-prepare-os.sh` script to write os to SD card
4. Insert SD card to `pi` and this should work
### Ansible
```sh
cd terraform/ansible/
ansible-playbook -i inventory.ini playbook.yml
# use tags to run only specific tasks
ansible-playbook -i inventory.ini playbook.yml --tags lvm
ansible-playbook -i inventory.ini playbook.yml --tags lvm,raid
ansible-playbook -i inventory.ini playbook.yml --skip-tags packages
# List available tags
ansible-playbook playbook.yml --list-tags
```
## Debug
```sh
# on pi5 host to check podman containers running via systemd servcies generated by quadlet .container files
sudo -u containers -H sh -lc 'export XDG_RUNTIME_DIR=/run/user/$(id -u); systemctl --user status yoga-quote-api.service'
# Show generated systemd unit file
sudo -u containers -H sh -lc 'export XDG_RUNTIME_DIR=/run/user/$(id -u); systemctl --user cat yoga-quote-api.service'
# Check logs
sudo -u containers -H sh -lc 'export XDG_RUNTIME_DIR=/run/user/$(id -u); journalctl --user -u yoga-quote-api.service -e'
# Check podman login to registry
sudo -u containers -H sh -lc 'export XDG_RUNTIME_DIR=/run/user/$(id -u);cd /home/containers; podman login --get-login registry.gitlab.com || true'
# Podman test pull
sudo -u containers -H sh -lc 'export XDG_RUNTIME_DIR=/run/user/$(id -u);cd /home/containers; podman pull registry.gitlab.com/arty-gvozdenkov/yoga-quote-api:latest'
# Check podman conatiners
sudo -u containers -H sh -lc 'cd /home/containers && podman ps -a'
```