82 lines
2.2 KiB
YAML
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
|