Compare commits

...

31 Commits

Author SHA1 Message Date
gballan be2208b245 Adding uptime kuma config
ci/woodpecker/push/woodpecker Pipeline failed
2026-10-24 00:14:43 -04:00
gballan 089f875520 Adding new Pi 5 1GB to inventory; updating monitoring server nodes list with new wifi node IPs
ci/woodpecker/push/woodpecker Pipeline failed
2026-10-20 22:03:21 -04:00
gballan ea32497180 Adding playbook to run benchmarks via sysbench
ci/woodpecker/push/woodpecker Pipeline failed
2026-10-16 14:58:36 -04:00
gballan bbf63b4c63 Adding Raspberry Pi Zero 1; adding Pi 3A+ and Pi Zero to Grafan
ci/woodpecker/push/woodpecker Pipeline failed
2026-10-07 01:09:26 -04:00
gballan 588a44a0c1 Adding Pi 3A+
ci/woodpecker/push/woodpecker Pipeline failed
2026-10-05 22:35:10 -04:00
gballan 924bacd958 Adding rest of Raspberry Pis to Prometheus
ci/woodpecker/push/woodpecker Pipeline failed
2026-10-05 19:15:15 -04:00
gballan f21fb8b604 Adding rest of Raspberry Pis to inventory 2026-10-05 19:15:04 -04:00
gballan fcd584e2ba Fixing SSSD config 2026-10-05 19:14:46 -04:00
gballan 3d8bdafd28 Moving prometheus targets to group_vars
ci/woodpecker/push/woodpecker Pipeline failed
2026-10-05 17:35:23 -04:00
gballan 83790d5b73 Added Prometheus and Grafana config
ci/woodpecker/push/woodpecker Pipeline was canceled
2026-10-05 17:32:14 -04:00
gballan 197962ecda Adding the new pi 5 2GB to raspberry pi group
ci/woodpecker/push/woodpecker Pipeline failed
2026-10-05 15:49:44 -04:00
gballan 81e7ce6a4b Updated Docker playbook to install Python library for managing containers; updated Podman playbook to set up containers
ci/woodpecker/push/woodpecker Pipeline failed
2026-09-29 23:31:41 -04:00
gballan d0c201c1f3 Updating sssd role
ci/woodpecker/push/woodpecker Pipeline failed
2026-09-28 15:10:22 -04:00
gballan e0575045d2 Adding common /nfs mount to systems
ci/woodpecker/push/woodpecker Pipeline failed
2026-09-28 14:46:18 -04:00
gballan 5d8d0c6dea Updating SSSD role
ci/woodpecker/push/woodpecker Pipeline failed
2026-09-28 11:11:20 -04:00
gballan d39027365d Updating SSSD role
ci/woodpecker/push/woodpecker Pipeline failed
2026-09-28 11:02:50 -04:00
gballan 2e03babda2 Fixing LDAP groups, maybe
ci/woodpecker/push/woodpecker Pipeline failed
2026-09-28 10:54:22 -04:00
gballan 63525e0967 Updating SSSD role
ci/woodpecker/push/woodpecker Pipeline failed
2026-09-28 10:48:19 -04:00
gballan 1dcb23dfaf Removing SSSD bind credentials; updating SSSD role
ci/woodpecker/push/woodpecker Pipeline failed
2026-09-28 10:41:32 -04:00
gballan 61f3d73d70 Adding SSSD config
ci/woodpecker/push/woodpecker Pipeline failed
2026-09-28 10:22:18 -04:00
gballan 43d7b9fce6 Updating SSSD role:
ci/woodpecker/push/woodpecker Pipeline failed
2026-09-28 10:10:35 -04:00
gballan 8d2d3874f7 Adding sssd role
ci/woodpecker/push/woodpecker Pipeline failed
2026-09-28 10:08:05 -04:00
gballan b4b36cefb3 Adding sssd role
ci/woodpecker/push/woodpecker Pipeline failed
2026-09-28 10:07:14 -04:00
gballan 84dfd3b040 Adding sssd role
ci/woodpecker/push/woodpecker Pipeline failed
2026-09-28 10:00:57 -04:00
gballan 229df90f74 Removing unnecessary podman version output
ci/woodpecker/push/woodpecker Pipeline was successful
2026-09-28 09:16:32 -04:00
gballan 28827dd5d3 Switching CI runners to podman
ci/woodpecker/push/woodpecker Pipeline was successful
2026-09-28 09:12:54 -04:00
gballan b940e10a4c Updating list of Pis
ci/woodpecker/push/woodpecker Pipeline was successful
2026-09-27 23:20:03 -04:00
gballan 44dd4195a7 Updating pi1b addresses
ci/woodpecker/push/woodpecker Pipeline was successful
2026-09-25 23:04:09 -04:00
gballan decdf4f99d Created a raspberrypi group to track all Pis in the infrastructure
ci/woodpecker/push/woodpecker Pipeline was successful
2026-09-23 23:09:08 -04:00
gballan de98fe2057 Replacing ansible.builtin.shell with ansible.builtin.command
ci/woodpecker/push/woodpecker Pipeline was successful
2026-09-23 21:54:49 -04:00
gballan 0c2889923d Adding DNS VMs
ci/woodpecker/push/woodpecker Pipeline failed
2026-09-23 21:52:21 -04:00
15 changed files with 401 additions and 14 deletions
+19 -1
View File
@@ -59,9 +59,27 @@ ntp_restrict:
- '127.0.0.1' - '127.0.0.1'
- '::1' - '::1'
# SSSD & OpenLDAP core settings
sssd_nss_homedir_substring: '/nfs/users'
sssd_domain_name: "metaunix"
openldap_host: "ldap.int.metaunix.net"
openldap_port: 636
openldap_use_starttls: false
openldap_search_base: "dc=metaunix,dc=net"
openldap_schema: "rfc2307"
# TLS / Certificate validation
sssd_disable_tls_verify: true
# Behavior & Performance
sssd_enable_mkhomedir: true
sssd_cache_credentials: true
sssd_enumerate: false
sssd_default_shell: "/bin/bash"
sudoers_sudoers: sudoers_sudoers:
privileges: privileges:
- name: '%sudo' - name: '%sudo'
entry: 'ALL=NOPASSWD:ALL' entry: 'ALL=NOPASSWD:ALL'
- name: '%linuxadmins' - name: '%linuxadmins'
entry: 'ALL=(ALL) ALL' entry: 'ALL=NOPASSWD:ALL'
+15
View File
@@ -0,0 +1,15 @@
---
podman_containers:
woodpecker_agent:
image: docker.io/woodpeckerci/woodpecker-agent:v3.16
state: started
volumes:
- '/var/run/docker.sock:/var/run/docker.sock'
env:
WOODPECKER_BACKEND=docker
WOODPECKER_SERVER=10.7.10.84:9000
WOODPECKER_AGENT_SECRET=af2c22a8f27fe2c22249d3b1e42f92df
generate_systemd:
restart_policy: always
names: true
@@ -0,0 +1,28 @@
---
prometheus_prometheus_targets:
- "localhost:9090"
prometheus_node_exporter_targets:
- "10.7.10.15:9100"
- "10.7.10.16:9100"
- "10.7.10.26:9100"
- "10.7.10.96:9100"
- "10.7.10.97:9100"
- "10.7.10.101:9100"
- "10.7.10.102:9100"
- "10.7.10.105:9100"
- "10.7.10.106:9100"
- "10.7.10.107:9100"
- "10.7.20.65:9100"
- "10.7.20.66:9100"
- "10.7.20.67:9100"
- "10.7.20.68:9100"
- "10.7.20.69:9100"
- "ci-v2-arm1.int.metaunix.net:9100"
- "ci-v2-arm2.int.metaunix.net:9100"
- "ci-v2-arm3.int.metaunix.net:9100"
- "ks-v2.int.metaunix.net:9100"
- "lb-v3.int.metaunix.net:9100"
- "ns3.int.metaunix.net:9100"
- "ns4.int.metaunix.net:9100"
+34 -3
View File
@@ -21,12 +21,15 @@ lb-v3 ansible_host=lb-v3.int.metaunix.net
[kickstart_servers] [kickstart_servers]
ks-v2 ansible_host=ks-v2.int.metaunix.net ks-v2 ansible_host=ks-v2.int.metaunix.net
[monitoring_server]
pi5b2g ansible_host=10.7.10.106
[munin_masters] [munin_masters]
munin-v1 ansible_host=munin-v1.int.metaunix.net munin-v1 ansible_host=munin-v1.int.metaunix.net
[nameservers] [nameservers]
#ns1 ansible_host=ns1.int.metaunix.net ns1 ansible_host=ns1.int.metaunix.net
#ns2 ansible_host=ns2.int.metaunix.net ns2 ansible_host=ns2.int.metaunix.net
ns3 ansible_host=ns3.int.metaunix.net ns3 ansible_host=ns3.int.metaunix.net
ns4 ansible_host=ns4.int.metaunix.net ns4 ansible_host=ns4.int.metaunix.net
@@ -34,13 +37,41 @@ ns4 ansible_host=ns4.int.metaunix.net
orangepi3lts ansible_host=10.7.10.97 orangepi3lts ansible_host=10.7.10.97
orangepi3zerow ansible_host=10.7.10.96 orangepi3zerow ansible_host=10.7.10.96
[raspberrypi]
backup-v2 ansible_host=10.7.10.26
ci-v2-arm1 ansible_host=ci-v2-arm1.int.metaunix.net
ci-v2-arm2 ansible_host=ci-v2-arm2.int.metaunix.net
ci-v2-arm3 ansible_host=ci-v2-arm3.int.metaunix.net
ks-v2 ansible_host=ks-v2.int.metaunix.net
lb-v3 ansible_host=lb-v3.int.metaunix.net
ns3 ansible_host=ns3.int.metaunix.net
ns4 ansible_host=ns4.int.metaunix.net
pitty-v1-pico ansible_host=10.7.10.16
pitty-v1-sw ansible_host=10.7.10.15
pi1b-1 ansible_host=10.7.10.101
pi1b-2 ansible_host=10.7.10.102
#pi1b-3 ansible_host=10.7.10.103
pi3b ansible_host=10.7.10.104
pi4b4g ansible_host=10.7.10.105
pi5b2g ansible_host=10.7.10.106
picm5-1 ansible_host=10.7.10.107
picam-1 ansible_host=10.7.20.65
pimusic-1 ansible_host=10.7.20.66
pimusic-2 ansible_host=10.7.20.67
pizero1 ansible_host=10.7.20.68
pi5b1g ansible_host=10.7.20.69
[serial_ttyd] [serial_ttyd]
pitty ansible_host=10.7.10.175 pitty-v1-sw ansible_host=10.7.10.15
pitty-v1-pico ansible_host=10.7.10.16
[smtp_servers] [smtp_servers]
smtp1 ansible_host=smtp1.int.metaunix.net smtp1 ansible_host=smtp1.int.metaunix.net
smtp2 ansible_host=smtp2.int.metaunix.net smtp2 ansible_host=smtp2.int.metaunix.net
[uptime_kuma]
pi5b1g ansible_host=10.7.20.69
[web_servers] [web_servers]
www3 ansible_host=www3.int.metaunix.net www3 ansible_host=www3.int.metaunix.net
www4 ansible_host=www4.int.metaunix.net www4 ansible_host=www4.int.metaunix.net
+7
View File
@@ -1,5 +1,12 @@
--- ---
- name: Install and configure SSSD
hosts: all
become: true
roles:
- gballan.sssd
- name: Configure sudoers - name: Configure sudoers
hosts: all hosts: all
become: true become: true
+32
View File
@@ -0,0 +1,32 @@
---
- name: Run Sysbench Suite
hosts: all
become: true
tasks:
- name: Ensure sysbench is installed
ansible.builtin.package:
name: sysbench
state: present
tags: [always]
- name: CPU Benchmarks
tags: [cpu, sysbench_cpu]
block:
- name: Sysbench CPU (Single-thread)
ansible.builtin.command: sysbench cpu --cpu-max-prime=20000 --threads=1 run
register: sysbench_cpu_single
changed_when: false
- name: Sysbench CPU (Multi-thread)
ansible.builtin.command: sysbench cpu --cpu-max-prime=20000 --threads={{ ansible_processor_vcpus }} run
register: sysbench_cpu_multi
changed_when: false
- name: Memory Benchmarks
tags: [memory, sysbench_memory]
block:
- name: Sysbench Memory (Write throughput)
ansible.builtin.command: sysbench memory --memory-block-size=1M --memory-total-size=10G --memory-oper=write run
register: sysbench_mem_write
changed_when: false
+11 -1
View File
@@ -3,8 +3,18 @@
- name: Install and configure Docker - name: Install and configure Docker
hosts: hosts:
- ci_servers - ci_servers
- ci_runners - uptime_kuma
become: true become: true
roles: roles:
- geerlingguy.docker - geerlingguy.docker
- name: Ensure python3-docker is installed
hosts: ci_servers
become: true
tasks:
- name: Install python3-docker
ansible.builtin.package:
name:
- python3-docker
state: present
+10
View File
@@ -0,0 +1,10 @@
---
- name: Deploy node_exporter across all fleet hosts
hosts: all
become: true
roles:
- role: prometheus.prometheus.node_exporter
vars:
node_exporter_web_listen_address: "0.0.0.0:9100"
+67
View File
@@ -0,0 +1,67 @@
---
- name: Deploy standalone Prometheus on Raspberry Pi 5
hosts: monitoring_server
become: true
vars:
# Bind to all interfaces on default port
prometheus_web_listen_address: "0.0.0.0:9090"
# Reduce retention to save storage/microSD wear (default is 15d)
prometheus_storage_retention: "60d"
# Self-scrape configuration
prometheus_scrape_configs:
- job_name: "prometheus"
metrics_path: "/metrics"
static_configs:
- targets: "{{ prometheus_prometheus_targets }}"
- job_name: "node_exporter"
metrics_path: "/metrics"
static_configs:
- targets: "{{ prometheus_node_exporter_targets }}"
roles:
- role: prometheus.prometheus.prometheus
- name: Deploy Grafana on Raspberry Pi 5
hosts: monitoring_server
become: true
pre_tasks:
- name: Ensure python3-debian is present for deb822 repository support
ansible.builtin.apt:
name: python3-debian
state: present
update_cache: true
roles:
- role: grafana.grafana.grafana
vars:
grafana_version: "latest"
# All grafana.ini sections now live under grafana_ini
grafana_ini:
server:
http_port: 3000
http_addr: "0.0.0.0"
security:
admin_user: "admin"
admin_password: "LimpBizkit6"
analytics:
reporting_enabled: false
check_for_updates: false
# Provision datasources directly
grafana_datasources:
- name: "Prometheus"
type: "prometheus"
access: "proxy"
url: "http://localhost:9090"
isDefault: true
editable: true
# Optional: install community plugins automatically
# grafana_plugins:
# - grafana-piechart-panel
+20
View File
@@ -0,0 +1,20 @@
---
- name: Setup and mount NFS share
hosts: all
become: true
gather_facts: true
tasks:
- name: Ensure NFS client packages are installed
ansible.builtin.package:
name: "{{ 'nfs-common' if ansible_facts['os_family'] == 'Debian' else 'nfs-utils' }}"
state: present
- name: Ensure NFS share is mounted and persistent in fstab
ansible.posix.mount:
path: /nfs
src: nfs-v4.int.metaunix.net:/export/nfs
fstype: nfs
opts: rw,vers=4,_netdev,sync,hard,intr,rsize=8192,wsize=8192
state: mounted
+103
View File
@@ -0,0 +1,103 @@
---
- name: Install and configure Podman
hosts: ci_runners
become: true
vars:
# Packages common to both Debian and RHEL families
podman_base_packages:
- podman
- podman-docker
# Debian/Ubuntu specific packages
podman_debian_packages:
- podman-compose
# RHEL-family specific packages (adjust or add epel-release if compose is needed)
podman_rhel_packages: []
# Set to true if you need the Docker-compatible API socket (e.g., for Woodpecker CI)
podman_enable_socket: true
tasks:
- name: Gather distribution-specific facts
ansible.builtin.setup:
gather_subset:
- "!all"
- distribution
- os_family
- name: Install Podman packages on Debian/Ubuntu
ansible.builtin.apt:
name: "{{ podman_base_packages + podman_debian_packages }}"
state: present
update_cache: true
cache_valid_time: 3600
when: ansible_facts['os_family'] == 'Debian'
- name: Install Podman packages on RHEL/Rocky/AlmaLinux/CentOS
ansible.builtin.dnf:
name: "{{ podman_base_packages + podman_rhel_packages }}"
state: present
when: ansible_facts['os_family'] == 'RedHat'
- name: Enable and start system-wide Podman socket
ansible.builtin.systemd:
name: podman.socket
state: started
enabled: true
when: podman_enable_socket
- name: Verify Podman installation
ansible.builtin.command: podman --version
register: podman_version_output
changed_when: false
- name: Run Podman containers
hosts: ci_runners
become: true
tasks:
- name: Determine mount host paths
ansible.builtin.set_fact:
_mount_paths: >-
{{
_mount_paths | default([]) +
(item.value.volumes | map('regex_replace', ':.*$', '') | list)
}}
loop: "{{ podman_containers | default({}) | dict2items }}"
when:
- item.value.volumes is defined
- item.value.state | default('started') != 'absent'
- name: Check status of mount paths on host
ansible.builtin.stat:
path: "{{ item }}"
loop: "{{ _mount_paths | default([]) | unique }}"
register: _mount_stats
- name: Ensure container mount directories exist
ansible.builtin.file:
# If the target path exists and is a file/socket/link, create its parent dir.
# If it doesn't exist at all, create it as a directory.
path: "{{ (item.stat.exists and not item.stat.isdir) | ternary(item.item | dirname, item.item) }}"
state: directory
mode: "0755"
loop: "{{ _mount_stats.results }}"
# Skip creating anything if the file/socket already exists
when: not (item.stat.exists and not item.stat.isdir)
- name: Manage Podman containers
containers.podman.podman_container:
name: "{{ item.key }}"
image: "{{ item.value.image | default(omit) }}"
state: "{{ item.value.state | default('started') }}"
command: "{{ item.value.command | default(omit) }}"
ports: "{{ item.value.ports | default(omit) }}"
volumes: "{{ item.value.volumes | default(omit) }}"
env: "{{ item.value.env | default(omit) }}"
network: "{{ item.value.network | default(omit) }}"
privileged: "{{ item.value.privileged | default(false) }}"
recreate: "{{ item.value.recreate | default(false) }}"
generate_systemd: "{{ item.value.generate_systemd | default(omit) }}"
loop: "{{ podman_containers | default({}) | dict2items }}"
+8
View File
@@ -6,12 +6,20 @@
import_playbook: base.yml import_playbook: base.yml
- name: Authentication - name: Authentication
import_playbook: auth.yml import_playbook: auth.yml
- name: NFS Client
import_playbook: nfs_client.yml
- name: Packages - name: Packages
import_playbook: packages.yml import_playbook: packages.yml
- name: Grafana / Prometheus
import_playbook: grafana.yml
- name: node_exporter and others for Prometheus
import_playbook: exporters.yml
- name: Munin - name: Munin
import_playbook: munin.yml import_playbook: munin.yml
- name: Gitea - name: Gitea
import_playbook: gitea.yml import_playbook: gitea.yml
- name: Podman
import_playbook: podman.yml
- name: Docker - name: Docker
import_playbook: docker.yml import_playbook: docker.yml
- name: Apache - name: Apache
+9 -9
View File
@@ -5,36 +5,36 @@
become: true become: true
tasks: tasks:
- name: Show system CPU info - name: Show system CPU info
ansible.builtin.shell: lscpu ansible.builtin.command: lscpu
register: shell_result register: cmd_output
changed_when: false changed_when: false
- name: Print stdout to terminal - name: Print stdout to terminal
ansible.builtin.debug: ansible.builtin.debug:
var: shell_result.stdout_lines var: cmd_output.stdout_lines
- name: RAM Info - name: RAM Info
hosts: all hosts: all
become: true become: true
tasks: tasks:
- name: Show free and used memory - name: Show free and used memory
ansible.builtin.shell: free -h ansible.builtin.command: free -h
register: shell_result register: cmd_output
changed_when: false changed_when: false
- name: Print stdout to terminal - name: Print stdout to terminal
ansible.builtin.debug: ansible.builtin.debug:
var: shell_result.stdout_lines var: cmd_output.stdout_lines
- name: Disk Info - name: Disk Info
hosts: all hosts: all
become: true become: true
tasks: tasks:
- name: Show mounted disks and their usage - name: Show mounted disks and their usage
ansible.builtin.shell: df -h ansible.builtin.command: df -h
register: shell_result register: cmd_output
changed_when: false changed_when: false
- name: Print stdout to terminal - name: Print stdout to terminal
ansible.builtin.debug: ansible.builtin.debug:
var: shell_result.stdout_lines var: cmd_output.stdout_lines
+23
View File
@@ -0,0 +1,23 @@
---
- name: Deploy Uptime Kuma 2
hosts: uptime_kuma
become: true
tasks:
- name: Ensure named Docker volume exists
community.docker.docker_volume:
name: uptime-kuma
state: present
- name: Run Uptime Kuma container
community.docker.docker_container:
name: uptime-kuma
image: louislam/uptime-kuma:2
state: started
restart_policy: unless-stopped
published_ports:
- "3001:3001"
volumes:
- uptime-kuma:/app/data
pull: true
+15
View File
@@ -1,8 +1,23 @@
collections: collections:
- name: ansible.posix - name: ansible.posix
version: 2.2.2
- name: community.general - name: community.general
version: 13.4.0
- name: community.docker
version: 5.3.0
- name: containers.podman
version: 1.20.2
- name: grafana.grafana
version: 6.1.0
- name: prometheus.prometheus
version: 0.30.1
roles: roles:
- name: gballan.sssd
src: gitea@git.metaunix.net:gballan/ansible-role-sssd.git
scm: git
version: v0.1.7
- src: arillso.sudoers - src: arillso.sudoers
version: 2.3.0 version: 2.3.0
- src: geerlingguy.apache - src: geerlingguy.apache