summaryrefslogtreecommitdiffstats
path: root/roles/pve-lxc
diff options
context:
space:
mode:
Diffstat (limited to 'roles/pve-lxc')
-rw-r--r--roles/pve-lxc/defaults/main.yml7
-rw-r--r--roles/pve-lxc/meta/argument_specs.yml40
-rw-r--r--roles/pve-lxc/meta/main.yml14
-rw-r--r--roles/pve-lxc/tasks/main.yml50
4 files changed, 111 insertions, 0 deletions
diff --git a/roles/pve-lxc/defaults/main.yml b/roles/pve-lxc/defaults/main.yml
new file mode 100644
index 00000000..eb270323
--- /dev/null
+++ b/roles/pve-lxc/defaults/main.yml
@@ -0,0 +1,7 @@
+---
+pve_lxc_disk: "local-lvm:4"
+pve_lxc_cores: 1
+pve_lxc_memory: 512
+pve_lxc_ip: "10.0.0.100/24"
+pve_lxc_gateway: "10.0.0.1"
+pve_lxc_dns: "10.0.0.1"
diff --git a/roles/pve-lxc/meta/argument_specs.yml b/roles/pve-lxc/meta/argument_specs.yml
new file mode 100644
index 00000000..4a6c84e5
--- /dev/null
+++ b/roles/pve-lxc/meta/argument_specs.yml
@@ -0,0 +1,40 @@
+---
+argument_specs:
+ main:
+ options:
+ pve_lxc_id:
+ type: "int"
+ description: "Unique VM/CT ID in PVE"
+ required: true
+ pve_lxc_hostname:
+ type: "str"
+ description: "Container hostname"
+ required: true
+ pve_lxc_template:
+ type: "str"
+ description: "OS template filename fetched from PVE appliance repo into local storage"
+ required: true
+ pve_lxc_disk:
+ type: "str"
+ description: "Root disk in <storage>:<size> format (e.g. local-lvm:4)"
+ default: "local-lvm:4"
+ pve_lxc_cores:
+ type: "int"
+ description: "Number of vCPU cores"
+ default: 1
+ pve_lxc_memory:
+ type: "int"
+ description: "RAM in MB"
+ default: 512
+ pve_lxc_ip:
+ type: "str"
+ description: "Container IP in CIDR notation (e.g. 10.0.0.100/24)"
+ default: "10.0.0.100/24"
+ pve_lxc_gateway:
+ type: "str"
+ description: "Container default gateway"
+ default: "10.0.0.1"
+ pve_lxc_dns:
+ type: "str"
+ description: "Container DNS server"
+ default: "10.0.0.1"
diff --git a/roles/pve-lxc/meta/main.yml b/roles/pve-lxc/meta/main.yml
new file mode 100644
index 00000000..82db1bad
--- /dev/null
+++ b/roles/pve-lxc/meta/main.yml
@@ -0,0 +1,14 @@
+---
+dependencies:
+ - role: "proxmoxer"
+ - role: "pve"
+ - role: "pve-network"
+galaxy_info:
+ author: "a14m"
+ description: "Provision an LXC container on Proxmox VE"
+ license: "MIT"
+ min_ansible_version: "2.18"
+ platforms:
+ - name: "Debian"
+ versions:
+ - "bookworm"
diff --git a/roles/pve-lxc/tasks/main.yml b/roles/pve-lxc/tasks/main.yml
new file mode 100644
index 00000000..5d035270
--- /dev/null
+++ b/roles/pve-lxc/tasks/main.yml
@@ -0,0 +1,50 @@
+---
+- name: "Download LXC template"
+ community.general.proxmox_template:
+ api_host: "{{ ansible_facts['hostname'] }}"
+ api_user: "{{ pve_admin_user }}@pve"
+ api_password: "{{ pve_admin_password }}"
+ node: "{{ ansible_facts['hostname'] }}"
+ storage: "local"
+ content_type: "vztmpl"
+ template: "{{ pve_lxc_template }}"
+ state: present
+ no_log: true
+ tags:
+ # PVE API not available in containers — requires proxmox-ve package
+ - "molecule-notest"
+
+- name: "Provision LXC container"
+ community.general.proxmox:
+ api_host: "{{ ansible_facts['hostname'] }}"
+ api_user: "{{ pve_admin_user }}@pve"
+ api_password: "{{ pve_admin_password }}"
+ node: "{{ ansible_facts['hostname'] }}"
+ vmid: "{{ pve_lxc_id }}"
+ hostname: "{{ pve_lxc_hostname }}"
+ ostemplate: "local:vztmpl/{{ pve_lxc_template }}"
+ disk: "{{ pve_lxc_disk }}"
+ cores: "{{ pve_lxc_cores }}"
+ memory: "{{ pve_lxc_memory }}"
+ pubkey: "{{ user_public_keys | join('\n') }}"
+ netif:
+ net0: "name=eth0,ip={{ pve_lxc_ip }},gw={{ pve_lxc_gateway }},bridge=vmbr0"
+ nameserver: "{{ pve_lxc_dns }}"
+ onboot: true
+ unprivileged: true
+ state: present
+ tags:
+ # PVE API not available in containers — requires proxmox-ve package
+ - "molecule-notest"
+
+- name: "Start LXC container"
+ community.general.proxmox:
+ api_host: "{{ ansible_facts['hostname'] }}"
+ api_user: "{{ pve_admin_user }}@pve"
+ api_password: "{{ pve_admin_password }}"
+ vmid: "{{ pve_lxc_id }}"
+ state: started
+ no_log: true
+ tags:
+ # PVE API not available in containers — requires proxmox-ve package
+ - "molecule-notest"