Some checks failed
CI / lint-and-test (pull_request) Successful in 1m21s
CI / ansible-validation (pull_request) Successful in 9m3s
CI / secret-scanning (pull_request) Successful in 3m19s
CI / dependency-scan (pull_request) Successful in 7m13s
CI / sast-scan (pull_request) Successful in 6m38s
CI / license-check (pull_request) Successful in 1m16s
CI / vault-check (pull_request) Failing after 6m40s
CI / playbook-test (pull_request) Successful in 9m28s
CI / container-scan (pull_request) Successful in 7m59s
CI / sonar-analysis (pull_request) Failing after 1m11s
CI / workflow-summary (pull_request) Successful in 1m11s
- Add roles/pote: Python/venv deployment role with PostgreSQL, cron jobs - Add playbooks/app/: Proxmox app stack provisioning and configuration - Add roles/app_setup: Generic app deployment role (Node.js/systemd) - Add roles/base_os: Base OS hardening role - Enhance roles/proxmox_vm: Split LXC/KVM tasks, improve error handling - Add IP uniqueness validation: Preflight check for duplicate IPs within projects - Add Proxmox-side IP conflict detection: Check existing LXC net0 configs - Update inventories/production/group_vars/all/main.yml: Add pote project config - Add vault.example.yml: Template for POTE secrets (git key, DB, SMTP) - Update .gitignore: Exclude deploy keys, backup files, and other secrets - Update documentation: README, role docs, execution flow guides Security: - All secrets stored in encrypted vault.yml (never committed in plaintext) - Deploy keys excluded via .gitignore - IP conflict guardrails prevent accidental duplicate IP assignments
83 lines
2.4 KiB
YAML
83 lines
2.4 KiB
YAML
---
|
|
# Proxmox QEMU VM provisioning via API (cloud-init).
|
|
# This task file preserves the repo's existing VM behavior.
|
|
|
|
# Break down the Proxmox VM creation to avoid "file name too long" error
|
|
- name: Set VM configuration facts
|
|
ansible.builtin.set_fact:
|
|
vm_scsi_config:
|
|
scsi0: "{{ vm_storage }}:{{ vm_disk_size }},format=raw"
|
|
vm_net_config:
|
|
net0: "virtio,bridge={{ vm_network_bridge }},firewall=1"
|
|
vm_ide_config:
|
|
ide2: "{{ vm_iso_storage }}:cloudinit,format=qcow2"
|
|
vm_ipconfig:
|
|
ipconfig0: "{{ vm_ip_config }}"
|
|
|
|
- name: Create VM on Proxmox
|
|
community.general.proxmox_kvm:
|
|
# Connection
|
|
api_host: "{{ proxmox_host }}"
|
|
api_user: "{{ proxmox_user }}"
|
|
api_password: "{{ vault_proxmox_password }}"
|
|
api_token_id: "{{ proxmox_token_id | default(omit) }}"
|
|
api_token_secret: "{{ vault_proxmox_token | default(omit) }}"
|
|
|
|
# VM identification
|
|
vmid: "{{ vm_id }}"
|
|
name: "{{ vm_name }}"
|
|
node: "{{ proxmox_node }}"
|
|
|
|
# Hardware specs
|
|
memory: "{{ vm_memory }}"
|
|
cores: "{{ vm_cores }}"
|
|
sockets: "{{ vm_sockets }}"
|
|
cpu: "host"
|
|
|
|
# Storage and network
|
|
scsi: "{{ vm_scsi_config }}"
|
|
net: "{{ vm_net_config }}"
|
|
ide: "{{ vm_ide_config }}"
|
|
|
|
# Boot and OS
|
|
boot: "{{ vm_boot_order }}"
|
|
ostype: "{{ vm_os_type }}"
|
|
|
|
# Cloud-init
|
|
ciuser: "{{ vm_ciuser }}"
|
|
cipassword: "{{ vault_vm_cipassword | default(omit) }}"
|
|
sshkeys: "{{ vm_ssh_keys | join('\n') if vm_ssh_keys else omit }}"
|
|
ipconfig: "{{ vm_ipconfig }}"
|
|
nameserver: "{{ vm_nameservers }}"
|
|
|
|
# VM options
|
|
agent: "{{ vm_enable_agent | bool }}"
|
|
autostart: false
|
|
balloon: 0
|
|
state: present
|
|
register: vm_creation_result
|
|
|
|
- name: Start VM if requested
|
|
community.general.proxmox_kvm:
|
|
api_host: "{{ proxmox_host }}"
|
|
api_user: "{{ proxmox_user }}"
|
|
api_password: "{{ vault_proxmox_password }}"
|
|
api_token_id: "{{ proxmox_token_id | default(omit) }}"
|
|
api_token_secret: "{{ vault_proxmox_token | default(omit) }}"
|
|
vmid: "{{ vm_id }}"
|
|
node: "{{ proxmox_node }}"
|
|
state: started
|
|
when: vm_start_after_create | bool
|
|
|
|
- name: Display VM creation results
|
|
ansible.builtin.debug:
|
|
msg: |
|
|
VM Created: {{ vm_name }} (ID: {{ vm_id }})
|
|
Memory: {{ vm_memory }}MB
|
|
Cores: {{ vm_cores }}
|
|
Storage: {{ vm_storage }}:{{ vm_disk_size }}
|
|
Network: {{ vm_network_bridge }}
|
|
Status: {{ vm_creation_result.msg | default('Created') }}
|
|
|
|
|