Back to ansible collections
This commit is contained in:
@@ -52,6 +52,7 @@ proxmox-template-clone/
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- community.general >= 8.0.0
|
- community.general >= 8.0.0
|
||||||
|
- community.proxmox >= 0.1.0
|
||||||
- ansible.posix >= 1.5.0
|
- ansible.posix >= 1.5.0
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -2,5 +2,7 @@
|
|||||||
collections:
|
collections:
|
||||||
- name: community.general
|
- name: community.general
|
||||||
version: ">=8.0.0"
|
version: ">=8.0.0"
|
||||||
|
- name: community.proxmox
|
||||||
|
version: ">=0.1.0"
|
||||||
- name: ansible.posix
|
- name: ansible.posix
|
||||||
version: ">=1.5.0"
|
version: ">=1.5.0"
|
||||||
|
|||||||
@@ -1,92 +1,43 @@
|
|||||||
---
|
---
|
||||||
- name: Get next available VMID from Proxmox API
|
- name: Clone LXC from template
|
||||||
ansible.builtin.uri:
|
community.proxmox.proxmox:
|
||||||
url: "https://{{ proxmox_api_host }}:8006/api2/json/cluster/nextid"
|
api_host: "{{ proxmox_api_host }}"
|
||||||
method: GET
|
api_user: "{{ proxmox_api_user }}"
|
||||||
headers:
|
api_token_id: "{{ proxmox_api_token_id }}"
|
||||||
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
|
api_token_secret: "{{ proxmox_api_token_secret }}"
|
||||||
validate_certs: false
|
node: "{{ lxc_template_node }}"
|
||||||
register: nextid_response
|
clone: "{{ lxc_template_id }}"
|
||||||
|
|
||||||
- name: Set VMID fact
|
|
||||||
ansible.builtin.set_fact:
|
|
||||||
next_vmid: "{{ nextid_response.json.data }}"
|
|
||||||
|
|
||||||
- name: Clone LXC from template via API
|
|
||||||
ansible.builtin.uri:
|
|
||||||
url: "https://{{ proxmox_api_host }}:8006/api2/json/nodes/{{ lxc_template_node }}/lxc/{{ lxc_template_id }}/clone"
|
|
||||||
method: POST
|
|
||||||
headers:
|
|
||||||
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
|
|
||||||
body_format: form-urlencoded
|
|
||||||
body:
|
|
||||||
newid: "{{ next_vmid }}"
|
|
||||||
hostname: "{{ vm_hostname }}"
|
hostname: "{{ vm_hostname }}"
|
||||||
full: "1"
|
full: true
|
||||||
storage: "local-lvm"
|
storage: "local-lvm"
|
||||||
validate_certs: false
|
|
||||||
register: clone_result
|
|
||||||
|
|
||||||
- name: Wait for clone task to complete
|
|
||||||
ansible.builtin.uri:
|
|
||||||
url: "https://{{ proxmox_api_host }}:8006/api2/json/nodes/{{ lxc_template_node }}/lxc/{{ next_vmid }}/status/current"
|
|
||||||
method: GET
|
|
||||||
headers:
|
|
||||||
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
|
|
||||||
validate_certs: false
|
|
||||||
register: lxc_status
|
|
||||||
until: lxc_status.status == 200
|
|
||||||
retries: 60
|
|
||||||
delay: 5
|
|
||||||
|
|
||||||
- name: Migrate LXC to target node
|
|
||||||
ansible.builtin.uri:
|
|
||||||
url: "https://{{ proxmox_api_host }}:8006/api2/json/nodes/{{ lxc_template_node }}/lxc/{{ next_vmid }}/migrate"
|
|
||||||
method: POST
|
|
||||||
headers:
|
|
||||||
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
|
|
||||||
body_format: form-urlencoded
|
|
||||||
body:
|
|
||||||
target: "{{ target_node }}"
|
target: "{{ target_node }}"
|
||||||
restart: "0"
|
timeout: 600
|
||||||
validate_certs: false
|
register: cloned_lxc
|
||||||
when: lxc_template_node != target_node
|
|
||||||
register: migrate_result
|
|
||||||
|
|
||||||
- name: Wait for migration to complete
|
|
||||||
ansible.builtin.uri:
|
|
||||||
url: "https://{{ proxmox_api_host }}:8006/api2/json/nodes/{{ target_node }}/lxc/{{ next_vmid }}/status/current"
|
|
||||||
method: GET
|
|
||||||
headers:
|
|
||||||
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
|
|
||||||
validate_certs: false
|
|
||||||
register: lxc_status
|
|
||||||
until: lxc_status.status == 200
|
|
||||||
retries: 30
|
|
||||||
delay: 10
|
|
||||||
when: lxc_template_node != target_node
|
|
||||||
|
|
||||||
- name: Configure LXC resources
|
- name: Configure LXC resources
|
||||||
ansible.builtin.uri:
|
community.proxmox.proxmox:
|
||||||
url: "https://{{ proxmox_api_host }}:8006/api2/json/nodes/{{ target_node }}/lxc/{{ next_vmid }}/config"
|
api_host: "{{ proxmox_api_host }}"
|
||||||
method: PUT
|
api_user: "{{ proxmox_api_user }}"
|
||||||
headers:
|
api_token_id: "{{ proxmox_api_token_id }}"
|
||||||
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
|
api_token_secret: "{{ proxmox_api_token_secret }}"
|
||||||
body_format: form-urlencoded
|
node: "{{ target_node }}"
|
||||||
body:
|
vmid: "{{ cloned_lxc.vmid }}"
|
||||||
cores: "{{ cpu_cores }}"
|
cores: "{{ cpu_cores }}"
|
||||||
memory: "{{ ram_gb | int * 1024 }}"
|
memory: "{{ ram_gb | int * 1024 }}"
|
||||||
|
netif:
|
||||||
net0: "name=eth0,bridge=vmbr0,ip=dhcp"
|
net0: "name=eth0,bridge=vmbr0,ip=dhcp"
|
||||||
validate_certs: false
|
state: present
|
||||||
|
|
||||||
- name: Start the LXC container
|
- name: Start the LXC container
|
||||||
ansible.builtin.uri:
|
community.proxmox.proxmox:
|
||||||
url: "https://{{ proxmox_api_host }}:8006/api2/json/nodes/{{ target_node }}/lxc/{{ next_vmid }}/status/start"
|
api_host: "{{ proxmox_api_host }}"
|
||||||
method: POST
|
api_user: "{{ proxmox_api_user }}"
|
||||||
headers:
|
api_token_id: "{{ proxmox_api_token_id }}"
|
||||||
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
|
api_token_secret: "{{ proxmox_api_token_secret }}"
|
||||||
validate_certs: false
|
node: "{{ target_node }}"
|
||||||
|
vmid: "{{ cloned_lxc.vmid }}"
|
||||||
|
state: started
|
||||||
|
|
||||||
- name: Set VMID fact for later use
|
- name: Set VMID fact for later use
|
||||||
ansible.builtin.set_fact:
|
ansible.builtin.set_fact:
|
||||||
created_vmid: "{{ next_vmid }}"
|
created_vmid: "{{ cloned_lxc.vmid }}"
|
||||||
|
|||||||
@@ -1,93 +1,44 @@
|
|||||||
---
|
---
|
||||||
- name: Get next available VMID from Proxmox API
|
- name: Clone VM from template
|
||||||
ansible.builtin.uri:
|
community.proxmox.proxmox_kvm:
|
||||||
url: "https://{{ proxmox_api_host }}:8006/api2/json/cluster/nextid"
|
api_host: "{{ proxmox_api_host }}"
|
||||||
method: GET
|
api_user: "{{ proxmox_api_user }}"
|
||||||
headers:
|
api_token_id: "{{ proxmox_api_token_id }}"
|
||||||
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
|
api_token_secret: "{{ proxmox_api_token_secret }}"
|
||||||
validate_certs: false
|
node: "{{ vm_template_node }}"
|
||||||
register: nextid_response
|
vmid: "{{ vm_template_id }}"
|
||||||
|
clone: "template"
|
||||||
- name: Set VMID fact
|
|
||||||
ansible.builtin.set_fact:
|
|
||||||
next_vmid: "{{ nextid_response.json.data }}"
|
|
||||||
|
|
||||||
- name: Clone VM from template via API
|
|
||||||
ansible.builtin.uri:
|
|
||||||
url: "https://{{ proxmox_api_host }}:8006/api2/json/nodes/{{ vm_template_node }}/qemu/{{ vm_template_id }}/clone"
|
|
||||||
method: POST
|
|
||||||
headers:
|
|
||||||
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
|
|
||||||
body_format: form-urlencoded
|
|
||||||
body:
|
|
||||||
newid: "{{ next_vmid }}"
|
|
||||||
name: "{{ vm_hostname }}"
|
name: "{{ vm_hostname }}"
|
||||||
full: "1"
|
full: true
|
||||||
storage: "local-lvm"
|
storage: "local-lvm"
|
||||||
validate_certs: false
|
|
||||||
register: clone_result
|
|
||||||
|
|
||||||
- name: Wait for clone task to complete
|
|
||||||
ansible.builtin.uri:
|
|
||||||
url: "https://{{ proxmox_api_host }}:8006/api2/json/nodes/{{ vm_template_node }}/qemu/{{ next_vmid }}/status/current"
|
|
||||||
method: GET
|
|
||||||
headers:
|
|
||||||
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
|
|
||||||
validate_certs: false
|
|
||||||
register: vm_status
|
|
||||||
until: vm_status.status == 200
|
|
||||||
retries: 60
|
|
||||||
delay: 5
|
|
||||||
|
|
||||||
- name: Migrate VM to target node
|
|
||||||
ansible.builtin.uri:
|
|
||||||
url: "https://{{ proxmox_api_host }}:8006/api2/json/nodes/{{ vm_template_node }}/qemu/{{ next_vmid }}/migrate"
|
|
||||||
method: POST
|
|
||||||
headers:
|
|
||||||
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
|
|
||||||
body_format: form-urlencoded
|
|
||||||
body:
|
|
||||||
target: "{{ target_node }}"
|
target: "{{ target_node }}"
|
||||||
online: "0"
|
timeout: 600
|
||||||
with-local-disks: "1"
|
register: cloned_vm
|
||||||
validate_certs: false
|
|
||||||
when: vm_template_node != target_node
|
|
||||||
register: migrate_result
|
|
||||||
|
|
||||||
- name: Wait for migration to complete
|
|
||||||
ansible.builtin.uri:
|
|
||||||
url: "https://{{ proxmox_api_host }}:8006/api2/json/nodes/{{ target_node }}/qemu/{{ next_vmid }}/status/current"
|
|
||||||
method: GET
|
|
||||||
headers:
|
|
||||||
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
|
|
||||||
validate_certs: false
|
|
||||||
register: vm_status
|
|
||||||
until: vm_status.status == 200
|
|
||||||
retries: 30
|
|
||||||
delay: 10
|
|
||||||
when: vm_template_node != target_node
|
|
||||||
|
|
||||||
- name: Configure VM resources
|
- name: Configure VM resources
|
||||||
ansible.builtin.uri:
|
community.proxmox.proxmox_kvm:
|
||||||
url: "https://{{ proxmox_api_host }}:8006/api2/json/nodes/{{ target_node }}/qemu/{{ next_vmid }}/config"
|
api_host: "{{ proxmox_api_host }}"
|
||||||
method: PUT
|
api_user: "{{ proxmox_api_user }}"
|
||||||
headers:
|
api_token_id: "{{ proxmox_api_token_id }}"
|
||||||
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
|
api_token_secret: "{{ proxmox_api_token_secret }}"
|
||||||
body_format: form-urlencoded
|
node: "{{ target_node }}"
|
||||||
body:
|
vmid: "{{ cloned_vm.vmid }}"
|
||||||
cores: "{{ cpu_cores }}"
|
cores: "{{ cpu_cores }}"
|
||||||
memory: "{{ ram_gb | int * 1024 }}"
|
memory: "{{ ram_gb | int * 1024 }}"
|
||||||
|
net:
|
||||||
net0: "virtio,bridge=vmbr0"
|
net0: "virtio,bridge=vmbr0"
|
||||||
validate_certs: false
|
update: true
|
||||||
|
|
||||||
- name: Start the VM
|
- name: Start the VM
|
||||||
ansible.builtin.uri:
|
community.proxmox.proxmox_kvm:
|
||||||
url: "https://{{ proxmox_api_host }}:8006/api2/json/nodes/{{ target_node }}/qemu/{{ next_vmid }}/status/start"
|
api_host: "{{ proxmox_api_host }}"
|
||||||
method: POST
|
api_user: "{{ proxmox_api_user }}"
|
||||||
headers:
|
api_token_id: "{{ proxmox_api_token_id }}"
|
||||||
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
|
api_token_secret: "{{ proxmox_api_token_secret }}"
|
||||||
validate_certs: false
|
node: "{{ target_node }}"
|
||||||
|
vmid: "{{ cloned_vm.vmid }}"
|
||||||
|
state: started
|
||||||
|
|
||||||
- name: Set VMID fact for later use
|
- name: Set VMID fact for later use
|
||||||
ansible.builtin.set_fact:
|
ansible.builtin.set_fact:
|
||||||
created_vmid: "{{ next_vmid }}"
|
created_vmid: "{{ cloned_vm.vmid }}"
|
||||||
|
|||||||
Reference in New Issue
Block a user