Set up Ansible homelab infrastructure

- Inventory based on tailscale
- Structure of the project
This commit is contained in:
Damien
2026-06-01 10:02:17 +02:00
commit cfacc40854
13 changed files with 105 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
inventory/__pycache__/
.venv/
.ansible

16
.zed/settings.json Normal file
View File

@@ -0,0 +1,16 @@
{
"lsp": {
"ansible": {
"settings": {
"python": {
"interpreterPath": ".venv/bin/python",
},
"validation": {
"lint": {
"path": ".venv/bin/ansible-lint",
},
},
},
},
},
}

6
ansible.cfg Normal file
View File

@@ -0,0 +1,6 @@
[defaults]
inventory = inventory/
host_key_checking = False
[ssh_connection]
pipelining = True

View File

@@ -0,0 +1,3 @@
ansible_user: debian
ansible_become: true
ansible_become_method: sudo

View File

@@ -0,0 +1 @@
ansible_user: root

11
homelab.yml Normal file
View File

@@ -0,0 +1,11 @@
# yaml-language-server: $schema=https://raw.githubusercontent.com/ansible/ansible-lint/main/src/ansiblelint/schemas/playbook.json
---
- name: Homelab alignment
hosts: online
become: true
roles:
- role: repos
- role: common
- role: ufw
- role: upgrade

View File

@@ -0,0 +1,15 @@
# inventory/static_groups.yml
all:
children:
root_hosts:
hosts:
ipfabric:
pve01:
grafana:
gitea:
prometheus:
prometheus-pve-exporter:
gitea-runner:
debian_hosts:
hosts:
proxy:

View File

@@ -0,0 +1,46 @@
#!/usr/bin/env python3
"""
Dynamic Ansible inventory via local tailscale status.
Only includes peers tagged with tag:homelab.
Groups: online, offline, <os>
"""
import json
import subprocess
FILTER_TAG = "tag:homelab"
def run():
raw = subprocess.check_output(["tailscale", "status", "--json"])
data = json.loads(raw)
inv = {
"_meta": {"hostvars": {}},
"all": {"hosts": [], "children": ["online", "offline"]},
"online": {"hosts": []},
"offline": {"hosts": []},
}
for peer in data.get("Peer", {}).values():
# Filtre sur le tag
tags = peer.get("Tags") or []
if FILTER_TAG not in tags:
continue
name = peer["HostName"]
ip = peer["TailscaleIPs"][0]
up = peer.get("Online", False)
inv["all"]["hosts"].append(name)
inv["online" if up else "offline"]["hosts"].append(name)
inv["_meta"]["hostvars"][name] = {
"ansible_host": ip,
}
print(json.dumps(inv, indent=2))
if __name__ == "__main__":
run()

View File

View File

View File

@@ -0,0 +1,4 @@
# roles/ufw/defaults/main.yml
---
ufw_tailscale_interface: tailscale0
ufw_extra_rules: []

0
roles/ufw/tasks/main.yml Normal file
View File

View File