homelab/ansible/books/clone-template.yml
plasmagoat 5feb74d56d
All checks were successful
Hello World / test (push) Successful in 4s
colmena initial implementation for sandbox and monitor
2025-07-06 21:25:57 +02:00

82 lines
2.2 KiB
YAML

- name: Clone VM from Template
hosts: proxmox
become: true
vars_prompt:
- name: "template_vmid"
prompt: "Enter VMID for the template"
private: no
default: "9000"
- name: "new_vmid"
prompt: "Enter the new VMID"
private: no
default: "9001"
- name: "new_name"
prompt: "Enter name for the new VM"
private: no
default: "nixos-clone"
vars:
storage: "local-lvm"
tasks:
- name: Clone the template
ansible.builtin.command: >
qm clone {{ template_vmid }} {{ new_vmid }} --name {{ new_name }}
- name: Resize disk to 10G
ansible.builtin.command: >
qm resize {{ new_vmid }} virtio0 +5G
- name: Set cloud-init params
ansible.builtin.command: >
qm set {{ new_vmid }}
--ciuser root
--cipassword root
--sshkey /root/.ssh/id_rsa.pub
--ipconfig0 ip=dhcp
- name: Start the new VM
ansible.builtin.command: >
qm start {{ new_vmid }}
- name: Wait for QEMU Guest Agent to come online
retries: 20
delay: 5
ansible.builtin.shell: |
qm guest exec {{ new_vmid }} -- true
register: qga_check
until: qga_check.rc == 0
- name: Get IP addresses via QEMU Guest Agent
ansible.builtin.shell: |
qm guest cmd {{ new_vmid }} network-get-interfaces
register: qga_json
failed_when: qga_json.rc != 0
- name: Parse out eth0's IPv4 address
ansible.builtin.set_fact:
vm_ipv4: >-
{{
(
qga_json.stdout
| from_json
| selectattr('name','equalto','eth0')
| map(attribute='ip-addresses')
| first
| selectattr('ip-address-type','equalto','ipv4')
| map(attribute='ip-address')
| first
)
}}
- name: Show the VM's IP
ansible.builtin.debug:
msg: "VM {{ new_vmid }} ({{ new_name }}) reports IPv4: {{ vm_ipv4 }}"
- name: Add new VM's IP to in-memory inventory (for later tasks)
ansible.builtin.add_host:
name: "nixos-{{ new_vmid }}"
ansible_host: "{{ vm_ipv4 }}"
ansible_user: root