Set up Ansible homelab infrastructure
- Inventory based on tailscale - Structure of the project
This commit is contained in:
46
inventory/tailscale_inventory.py
Executable file
46
inventory/tailscale_inventory.py
Executable 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()
|
||||
Reference in New Issue
Block a user