infra/ansible/playbook.yml
Graham McIntire 6d173d9fcb
loki: add log aggregation on prom + promtail daemonset in home-cluster
- new ansible loki role installs loki 3.5.5 on prometheus_servers as a
  systemd unit (single-binary, filesystem store, 30d retention)
- open tcp/3100 on prom.w5isp.com to 10.0.0.0/16
- grafana: provision loki datasource at http://127.0.0.1:3100
- k8s: promtail daemonset + rbac in monitoring namespace, ships pod logs
  to http://10.0.15.31:3100 with cluster=home-cluster label
- argocd: Application points at home/cluster/promtail
2026-05-11 10:24:30 -05:00

263 lines
5.7 KiB
YAML

---
- name: Apply common configuration to all nodes
hosts: all
become: true
# become_method: sudo
gather_facts: true
remote_user: ansible
roles:
- base
tags:
- common
tasks:
- name: Set timezone
community.general.timezone:
name: "{{ timezone }}"
- name: Apply firewall configuration
hosts: all:!proxmox_servers
become: true
gather_facts: true
tags:
- firewall
roles:
- firewall
- name: Apply resolver config
hosts: resolvers
become: true
gather_facts: true
tags:
- resolvers
roles:
- resolvers
- name: Install and configure NetBox
hosts: netbox_servers
become: true
gather_facts: true
tags:
- netbox
roles:
- netbox
- name: Install and configure Icinga2 monitor
hosts: monitoring_servers
become: true
gather_facts: true
tags:
- monitor
- icinga2
roles:
- monitor
- name: Install and configure Caddy
hosts: caddy_servers
become: true
tags:
- caddy
roles:
- caddy
- name: Provision BIND9 VM on Proxmox
hosts: localhost
gather_facts: false
tags:
- dns
- bind9
- provision
- never
vars:
# Proxmox connection settings (matches terraform/variables.tf)
proxmox_node: "{{ lookup('env', 'PROXMOX_NODE') | default('vm2-380', true) }}"
proxmox_api_host: 10.0.0.2
proxmox_api_user: "{{ lookup('env', 'PROXMOX_API_USER') | default('root@pam', true) }}"
proxmox_api_password: "{{ lookup('env', 'PROXMOX_API_PASSWORD') }}"
proxmox_storage: local-lvm
proxmox_template_name: debian-cloud-init
proxmox_template_vmid: 9000
# BIND9 VM configuration
vm_name: ns1.as393837.net
vm_vmid: 222
vm_ip: 204.110.191.222
vm_gateway: 204.110.191.254
vm_netmask: 255.255.255.224
vm_cores: 2
vm_memory: 2048
vm_disk_size: 64
ansible_ssh_key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFghGMnDdkfNC6JPEhMxrKhYDmNcXjHXp/y/mf3uLtzb"
tasks:
- name: Clone cloud-init template for BIND9 server
community.proxmox.proxmox_kvm:
node: "{{ proxmox_node }}"
vmid: "{{ proxmox_template_vmid }}"
clone: "{{ proxmox_template_name }}"
newid: "{{ vm_vmid }}"
name: "{{ vm_name }}"
api_user: "{{ proxmox_api_user }}"
api_password: "{{ proxmox_api_password }}"
api_host: "{{ proxmox_api_host }}"
storage: "{{ proxmox_storage }}"
timeout: 90
full: true
- name: Configure VM resources
community.proxmox.proxmox_kvm:
node: "{{ proxmox_node }}"
vmid: "{{ vm_vmid }}"
name: "{{ vm_name }}"
api_user: "{{ proxmox_api_user }}"
api_password: "{{ proxmox_api_password }}"
api_host: "{{ proxmox_api_host }}"
cores: "{{ vm_cores }}"
memory: "{{ vm_memory }}"
update: true
- name: Resize disk
community.proxmox.proxmox_disk:
vmid: "{{ vm_vmid }}"
api_user: "{{ proxmox_api_user }}"
api_password: "{{ proxmox_api_password }}"
api_host: "{{ proxmox_api_host }}"
disk: scsi0
size: "{{ vm_disk_size }}G"
state: resized
- name: Configure cloud-init network
community.proxmox.proxmox_kvm:
node: "{{ proxmox_node }}"
vmid: "{{ vm_vmid }}"
name: "{{ vm_name }}"
api_user: "{{ proxmox_api_user }}"
api_password: "{{ proxmox_api_password }}"
api_host: "{{ proxmox_api_host }}"
ipconfig:
ipconfig0: "ip={{ vm_ip }}/26,gw={{ vm_gateway }}"
nameservers:
- 1.1.1.1
- 8.8.8.8
ciuser: debian
cipassword: "sxcbctolxALGnj2R8GStXrfW8GVd3s/ju91fNon7T1U="
update: true
- name: Start VM
community.proxmox.proxmox_kvm:
node: "{{ proxmox_node }}"
vmid: "{{ vm_vmid }}"
name: "{{ vm_name }}"
api_user: "{{ proxmox_api_user }}"
api_password: "{{ proxmox_api_password }}"
api_host: "{{ proxmox_api_host }}"
state: started
- name: Wait for VM to be accessible via SSH
wait_for:
host: "{{ vm_ip }}"
port: 22
delay: 30
timeout: 300
state: started
- name: Add VM to in-memory inventory
add_host:
name: "{{ vm_name }}"
ansible_host: "{{ vm_ip }}"
groups: bind9_servers
- name: Configure BIND9 Servers
hosts: bind9_servers
become: yes
gather_facts: true
tags:
- dns
- bind9
roles:
- role: base
tags: base
- role: ns
tags: ns
# Plays from general.yml
- name: Apply general configuration to all nodes
hosts: all
become: yes
become_method: sudo
roles:
- general
tags:
- general
- name: Configure Forgejo servers
hosts: forgejo_servers
become: yes
gather_facts: true
tags:
- forgejo
roles:
- forgejo
- name: Configure LibreNMS servers
hosts: librenms_servers
become: yes
gather_facts: true
tags:
- librenms
roles:
- librenms
- name: Configure aprsc servers
hosts: aprsc_servers
become: yes
gather_facts: true
tags:
- aprsc
roles:
- aprsc
- name: Configure UISP servers
hosts: uisp_servers
become: yes
gather_facts: true
tags:
- uisp
roles:
- uisp
- name: Configure Dokku servers
hosts: dokku_servers
become: yes
gather_facts: true
tags:
- dokku
roles:
- dokku
- name: Configure node_exporter targets
hosts: node_exporter_servers
become: yes
gather_facts: true
tags:
- node_exporter
- prometheus_stack
roles:
- node_exporter
- name: Configure Prometheus monitoring stack
hosts: prometheus_servers
become: yes
gather_facts: true
tags:
- prometheus_stack
roles:
- role: alertmanager
tags: alertmanager
- role: prometheus
tags: prometheus
- role: loki
tags: loki
- role: grafana
tags: grafana