Logo

dev-resources.site

for different kinds of informations.

Vecchio RaspberryPi, Nuova HomeLab!

Published at
12/29/2024
Categories
devops
ansible
docker
raspberrypi
Author
massimobiagioli
Categories
4 categories in total
devops
open
ansible
open
docker
open
raspberrypi
open
Author
15 person written this
massimobiagioli
open
Vecchio RaspberryPi, Nuova HomeLab!

Per Natale vorrei regalarmi un nuovo RaspberryPi
E' iniziata così questa esperienza. La voglia di metter su una HomeLab con un nuovo RaspberryPi 5, tanto c'è Natale, quale miglior occasione per regalarselo e cestinare il vecchio RaspberryPi 3?
E invece no. Il RaspberryPi 3 non si butta. Il RaspberryPi 3 può ancora regalare delle soddisfazioni. Il RaspberryPi 3 mi ha convinto nuovamente e costruirò la mia nuova HomeLab su misura per lui.
In fondo, a Natale, siamo tutti più buoni, no?

Iniziamo
Per prima cosa, dobbiamo assicurarci di poterci collegare al nostro RaspberryPi.
Generiamo quindi una chiave ssh:

ssh-keygen -t rsa -b 2048
Enter fullscreen mode Exit fullscreen mode

e copiamola dentro al RaspberryPi:

ssh-copy-id user@raspberry_pi_ip_address
Enter fullscreen mode Exit fullscreen mode

Automatizziamo tutto con Ansible
Ora, vogliamo veramente installare tutto il software a mano sul nostro RaspberryPi? Oppure vogliamo pensare di automatizzare questo processo il più possibile? Ecco, io ho optato per la seconda opzione, ed ho scelto Ansible come strumento per risolvere questo problema.
Nel mio caso, per installare Ansible sul mio Macbook, ho semplicemente eseguito questo comando:

brew install ansible
Enter fullscreen mode Exit fullscreen mode

Progettiamo la nostra Infrastruttura
Sicuramente la parte più "succosa" di tutto questo percorso è la creazione dell'infrastruttura.
Per prima cosa, dobbiamo creare il file inventory.ini dove indicare le "coordinate" per raggiungere il nostro RaspberryPi:

[raspberry_pi]
raspberrypi ansible_host=raspberrypi_host ansible_user=user ansible_become=true
Enter fullscreen mode Exit fullscreen mode

Ora, possiamo concentrarci sulla creazione dei vari "playbooks", questi sono quelli individuati per iniziare:

  • update: aggiornamento dei pacchetti
  • install-docker
  • install-dockge

Playbook "update": aggiornamento dei pacchetti
Questo playbook (file: playbooks/update.yml) consente di tenere sempre aggiornato il nostro RaspberryPi.

---
- name: Update Raspberry Pi
  hosts: raspberry_pi
  gather_facts: true
  tasks:
    - name: Update the package cache
      apt:
        update_cache: true
        cache_valid_time: 3600

    - name: Upgrade all packages to the latest version
      apt:
        upgrade: dist
        autoclean: true
        autoremove: true

    - name: Check if a reboot is required
      stat:
        path: /var/run/reboot-required
      register: reboot_required

    - name: Reboot the system if a reboot is required
      reboot:
        msg: "Rebooting the system to complete the update"
        connect_timeout: 5
      when: reboot_required.stat.exists
Enter fullscreen mode Exit fullscreen mode

E può essere lanciato tramite il comando:

ansible-playbook -i inventory.ini playbooks/update.yml
Enter fullscreen mode Exit fullscreen mode

In questi casi, però, preferisco sempre creare un Makefile in modo da poter lanciare tutti i comandi in maniera più semplice.
In questo caso:

make update
Enter fullscreen mode Exit fullscreen mode

(il comando make senza argomenti restituisce la lista di tutti i comandi disponibili, e dal mio punto di vista è davvero molto utile).

Playbook "install-docker": aggiornamento di docker
Sicuramente docker è un elemento imprescindibile nella mia HomeLab.
Il playbook playbooks/install-docker.yml consente di installare docker nel nostro RaspberryPi.

---
- name: Install Docker on Raspberry Pi
  hosts: raspberry_pi
  become: true
  vars_files:
    - vars/main.yml
  tasks:
    - name: Install prerequisites for APT
      apt:
        name:
          - apt-transport-https
          - ca-certificates
          - curl
          - software-properties-common
        state: present
        update_cache: true

    - name: Add Docker's GPG key
      ansible.builtin.shell: |
        set -o pipefail
        mkdir -p /etc/apt/keyrings
        curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
      args:
        executable: /bin/bash
        creates: /etc/apt/keyrings/docker.gpg  # Run only if the key file doesn't already exist

    - name: Add Docker's repository
      ansible.builtin.apt_repository:
        repo: "deb [arch=armhf signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian {{ ansible_distribution_release }} stable"
        state: present

    - name: Update APT cache
      apt:
        update_cache: true

    - name: Install Docker
      apt:
        name: docker-ce
        state: present

    - name: Start and enable Docker service
      systemd:
        name: docker
        enabled: true
        state: started

    - name: Add docker user user to the Docker group (optional)
      ansible.builtin.user:
        name: "{{ docker_user }}"
        groups: docker
        append: true
        state: present

    - name: Check Docker version
      ansible.builtin.shell: |
        set -o pipefail
        docker --version
      args:
        executable: /bin/bash
      register: docker_version
      changed_when: false

    - name: Display the installed Docker version
      ansible.builtin.debug:
        msg: "{{ docker_version.stdout }}"
Enter fullscreen mode Exit fullscreen mode

Nel playbook viene utilizzata la variabile docker_user, che va definita nel file playbooks/vars/main.yml:

docker_user: pi
Enter fullscreen mode Exit fullscreen mode

Playbook "install-dockge": aggiornamento di dockge
Per orchestrare i container utilizzeremo il software dockge.
Il playbook playbooks/install-dockge.yml consente di installare docker nel nostro RaspberryPi.

---
- name: Install Dockge using Docker Compose
  hosts: raspberry_pi
  become: true

  tasks:
    - name: Ensure the required directories exist
      file:
        path: "{{ item }}"
        state: directory
        owner: root
        group: root
        mode: '0755'
      loop:
        - /opt/stacks
        - /opt/dockge

    - name: Download compose.yaml for Dockge
      get_url:
        url: "https://dockge.kuma.pet/compose.yaml?port=5001&stacksPath=%2Fopt%2Fstacks"
        dest: /opt/dockge/compose.yaml
        owner: root
        group: root
        mode: '0644'

    - name: Start Dockge using Docker Compose
      community.docker.docker_compose_v2:
        project_src: /opt/dockge
        state: present
      register: output
Enter fullscreen mode Exit fullscreen mode

It Works!
Per accedere alla console di dockge, basta collegarsi all'indirizzo:

http://<raspberrypi-host>:5001

La prima volta, occorre creare un'utenza di ammnistratore.
Questo il risultato:

Image description

Proviamo a creare uno stack di prova
Proviamo ora a creare uno stack con nginx:

Image description

Il servizio nginx ora è attivo sulla porta 9080 del nostro RaspberryPi, se proviamo ad aprire la pagina possiamo vedere che funziona:

Image description

Conclusioni
Questo vuole essere solo un punto di partenza per la mia HomeLab.
Durante questo percorso ho imparato che a volte l'obsolescenza è solo nella nostra testa, perchè semplicemente vogliamo qualcosa di nuovo. Parliamo molto spesso di valore, ma quando ci troviamo di fronte a delle scelte, a volte scegliamo di "buttar via" anzichè sfruttare bene ciò che si ha. E questo non vale solo per il software purtroppo.
Altra cosa che ho imparato, e che considero molto importante: la "DevOps" culture è anche nelle piccole cose, e spesso la pigrizia è un nemico duro da sconfiggere, perchè applica una resistenza molto forte al cambiamento. Sperimentare per migliorarsi, applicare e sbagliare per costruire: un "mantra" che mi piace applicare, e che voglio continuare a fare mio anche nei prossimi anni.

Se volete dare un'occhiata al mio repository della infra, questo è il link.

raspberrypi Article's
30 articles in total
Favicon
Nextcloud on Raspberry Pi - Fedora + Podman Quadlets
Favicon
Vecchio RaspberryPi, Nuova HomeLab!
Favicon
Building a Smart Heater Controller with Python, Docker, and Bluetooth #3
Favicon
Building a Smart Heater Controller with Python, Docker, and Bluetooth #2
Favicon
Building a Smart Heater Controller with Python, Docker, and Bluetooth #1
Favicon
How to Install Docker on Raspberry Pi
Favicon
How to SSH into a Raspberry Pi?
Favicon
node.js and docker on raspberry
Favicon
Open source mealie type docker container for recipes
Favicon
Deploy a Node.js Application Using MySQL and Prisma on a Raspberry Pi
Favicon
Getting started with Nix and Nix Flakes
Favicon
How to edit boot config Raspberry Pi 5 USB?
Favicon
Weather Dashboard with 5-Day Forecast and Wi-Fi Menu
Favicon
The Intelligent Disaster Management System with Alternative Energy and AI-Powered
Favicon
How I Leverage Raspberry Pi as a DevOps Engineer
Favicon
How to self-host MongoDB on a Raspberry Pi 4
Favicon
How to Turn a USB-Only Printer into a Wireless Printer Using CUPS and a Raspberry Pi
Favicon
Raspberry Pi project: Install project management software
Favicon
Running Raspberry Pi OS in a Docker Container
Favicon
The Smart House Experience: Crafting Innovation with a Raspberry Pi
Favicon
From Mobile Simplicity to Pi Complexity
Favicon
Setting Up Home Assistant on a Raspberry Pi 3 Model B
Favicon
Create an AP with Network Manager
Favicon
🏠 GPT Home 🤖💬 an Open-source Raspberry Pi Home Assistant!
Favicon
Controlling an LED with a Snap Using the KY-037 Sound Sensor and Raspberry Pi
Favicon
How to Build Your Own Website with a Raspberry Pi: An Entertaining Guide
Favicon
How to self-host Postgres Database on Linux
Favicon
[K8s] A Complete Series of Articles on Kubernetes Environment Locally
Favicon
How to control a Noctua NF-A20 PWM fan from Raspberry Pi (OFF or 20%-100%)
Favicon
Rockchip SoC Roadmap for AI & Vision

Featured ones: