- Complete project structure with Next.js frontend - GraphQL API backend with Apollo Server - Portal application with NextAuth - Crossplane Proxmox provider - GitOps configurations - CI/CD pipelines - Testing infrastructure (Vitest, Jest, Go tests) - Error handling and monitoring - Security hardening - UI component library - Documentation
127 lines
3.6 KiB
YAML
127 lines
3.6 KiB
YAML
---
|
|
# Ansible Playbook for Multi-Site Deployment
|
|
# Deploys agents and configures Proxmox sites
|
|
|
|
- name: Deploy Hybrid Cloud Control Plane to Multiple Sites
|
|
hosts: all
|
|
become: yes
|
|
vars:
|
|
cloudflare_tunnel_token: "{{ vault_cloudflare_tunnel_token }}"
|
|
site_name: "{{ inventory_hostname | regex_replace('^pve[0-9]+', 'site') }}"
|
|
prometheus_enabled: true
|
|
|
|
tasks:
|
|
- name: Ensure system is up to date
|
|
package:
|
|
name:
|
|
- curl
|
|
- wget
|
|
- git
|
|
- jq
|
|
state: present
|
|
when: ansible_os_family == "Debian"
|
|
|
|
- name: Install cloudflared
|
|
block:
|
|
- name: Check if cloudflared is installed
|
|
command: which cloudflared
|
|
register: cloudflared_check
|
|
changed_when: false
|
|
failed_when: false
|
|
|
|
- name: Download cloudflared
|
|
get_url:
|
|
url: "https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-{{ ansible_architecture | replace('x86_64', 'amd64') | replace('aarch64', 'arm64') }}"
|
|
dest: /usr/local/bin/cloudflared
|
|
mode: '0755'
|
|
when: cloudflared_check.rc != 0
|
|
|
|
- name: Create cloudflared directories
|
|
file:
|
|
path: "{{ item }}"
|
|
state: directory
|
|
mode: '0755'
|
|
loop:
|
|
- /etc/cloudflared
|
|
- /etc/cloudflared/tunnel-configs
|
|
- /var/log/cloudflared
|
|
|
|
- name: Copy tunnel configuration
|
|
template:
|
|
src: tunnel-config.j2
|
|
dest: /etc/cloudflared/tunnel-configs/{{ site_name }}.yaml
|
|
mode: '0644'
|
|
vars:
|
|
node_name: "{{ inventory_hostname }}"
|
|
|
|
- name: Create tunnel credentials file
|
|
copy:
|
|
content: '{"AccountTag":"","TunnelSecret":"","TunnelID":"","TunnelName":"{{ site_name }}-tunnel"}'
|
|
dest: /etc/cloudflared/{{ site_name }}-tunnel.json
|
|
mode: '0600'
|
|
|
|
- name: Create cloudflared systemd service
|
|
template:
|
|
src: cloudflared.service.j2
|
|
dest: /etc/systemd/system/cloudflared-tunnel.service
|
|
mode: '0644'
|
|
vars:
|
|
site_name: "{{ site_name }}"
|
|
notify: restart cloudflared
|
|
|
|
- name: Install Prometheus exporter
|
|
block:
|
|
- name: Install Python pip
|
|
package:
|
|
name: python3-pip
|
|
state: present
|
|
when: ansible_os_family == "Debian"
|
|
|
|
- name: Install pve_exporter
|
|
pip:
|
|
name: pve_exporter
|
|
state: present
|
|
when: prometheus_enabled | bool
|
|
|
|
- name: Create pve_exporter systemd service
|
|
template:
|
|
src: pve-exporter.service.j2
|
|
dest: /etc/systemd/system/pve-exporter.service
|
|
mode: '0644'
|
|
when: prometheus_enabled | bool
|
|
notify: restart pve-exporter
|
|
|
|
- name: Enable and start services
|
|
systemd:
|
|
name: "{{ item }}"
|
|
enabled: yes
|
|
state: started
|
|
daemon_reload: yes
|
|
loop:
|
|
- cloudflared-tunnel
|
|
- pve-exporter
|
|
when: item != "pve-exporter" or prometheus_enabled | bool
|
|
|
|
- name: Verify cloudflared is running
|
|
systemd:
|
|
name: cloudflared-tunnel
|
|
register: cloudflared_status
|
|
|
|
- name: Display tunnel status
|
|
debug:
|
|
msg: "Cloudflare tunnel is {{ cloudflared_status.status.ActiveState }}"
|
|
|
|
handlers:
|
|
- name: restart cloudflared
|
|
systemd:
|
|
name: cloudflared-tunnel
|
|
state: restarted
|
|
daemon_reload: yes
|
|
|
|
- name: restart pve-exporter
|
|
systemd:
|
|
name: pve-exporter
|
|
state: restarted
|
|
daemon_reload: yes
|
|
|