- Added default configuration for VM creation in defaults/main.yml. - Created tasks for configuring the VM with UEFI, TPM, disks, GPU, and Cloud-Init in tasks/configure-vm.yml. - Implemented clone creation and configuration logic in tasks/create-clones.yml. - Added template conversion functionality in tasks/create-template.yml. - Developed base VM creation logic in tasks/create-vm.yml. - Included image download and caching tasks in tasks/download-image.yml. - Introduced utility tasks for common operations in tasks/helpers.yml. - Organized main orchestration logic in tasks/main.yml, with clear stages for each operation. - Added pre-flight checks to validate the environment before execution in tasks/preflight-checks.yml.
103 lines
3.2 KiB
YAML
103 lines
3.2 KiB
YAML
---
|
||
# create-clones.yml - Create and configure clones from template with error handling
|
||
|
||
- name: "[CLONES] Validate clone list is not empty"
|
||
fail:
|
||
msg: "No clones defined in 'clones' variable"
|
||
when:
|
||
- create_clones | default(false)
|
||
- clones is not defined or clones | length == 0
|
||
|
||
- name: "[CLONES] Process each clone"
|
||
block:
|
||
- name: "[CLONES] Check if clone already exists"
|
||
stat:
|
||
path: "/etc/pve/qemu-server/{{ clone.id }}.conf"
|
||
register: clone_conf
|
||
changed_when: false
|
||
|
||
- name: "[CLONES] Display clone status"
|
||
debug:
|
||
msg: "Clone {{ clone.id }} ({{ clone.hostname }}) - Status: {{ 'EXISTS' if clone_conf.stat.exists else 'WILL BE CREATED' }}"
|
||
|
||
- name: "[CLONES] Clone VM from template"
|
||
block:
|
||
- name: "[CLONES] Execute clone command"
|
||
command: >
|
||
qm clone {{ vm_id }} {{ clone.id }}
|
||
--name {{ clone.hostname }}
|
||
--full {{ clone.full | default(0) }}
|
||
register: clone_cmd
|
||
when: not clone_conf.stat.exists
|
||
|
||
- name: "[CLONES] Verify clone was created"
|
||
stat:
|
||
path: "/etc/pve/qemu-server/{{ clone.id }}.conf"
|
||
register: clone_verify
|
||
changed_when: false
|
||
failed_when: not clone_verify.stat.exists
|
||
|
||
- name: "[CLONES] Wait for clone to be ready"
|
||
pause:
|
||
seconds: 2
|
||
when: not clone_conf.stat.exists
|
||
|
||
rescue:
|
||
- name: "[CLONES] Handle clone creation error"
|
||
fail:
|
||
msg: |
|
||
Failed to clone VM {{ vm_id }} to {{ clone.id }}:
|
||
{{ ansible_failed_result | default('Unknown error') }}
|
||
|
||
- name: "[CLONES] Configure Cloud-Init for clone (if needed)"
|
||
block:
|
||
- name: "[CLONES] Set clone hostname and IP"
|
||
command: >
|
||
qm set {{ clone.id }}
|
||
--hostname {{ clone.hostname }}
|
||
--ipconfig0 "ip={{ clone.ip }},gw={{ clone.gateway }}"
|
||
register: clone_config
|
||
when: not clone_conf.stat.exists
|
||
|
||
- name: "[CLONES] Apply SSH keys to clone"
|
||
command: >
|
||
qm set {{ clone.id }}
|
||
--sshkeys local:snippets/{{ vm_id }}-sshkey.pub
|
||
when: not clone_conf.stat.exists
|
||
|
||
rescue:
|
||
- name: "[CLONES] Handle clone configuration error"
|
||
debug:
|
||
msg: "WARNING: Could not fully configure clone {{ clone.id }}. You may need to configure manually."
|
||
|
||
- name: "[CLONES] Start clone VM"
|
||
command: "qm start {{ clone.id }}"
|
||
register: clone_start
|
||
retries: 3
|
||
delay: 2
|
||
until: clone_start is succeeded
|
||
when: not clone_conf.stat.exists
|
||
|
||
- name: "[CLONES] Wait for clone to boot"
|
||
pause:
|
||
seconds: 3
|
||
|
||
- name: "[CLONES] Display clone creation result"
|
||
debug:
|
||
msg: |
|
||
✓ Clone created and started
|
||
- ID: {{ clone.id }}
|
||
- Hostname: {{ clone.hostname }}
|
||
- IP: {{ clone.ip }}
|
||
- Full clone: {{ clone.full | default(0) }}
|
||
|
||
loop: "{{ clones }}"
|
||
loop_control:
|
||
loop_var: clone
|
||
when: create_clones | default(false)
|
||
|
||
- name: "[CLONES] Skip clone creation (disabled)"
|
||
debug:
|
||
msg: "ℹ Clone creation is disabled. Set 'create_clones: true' to enable."
|
||
when: not (create_clones | default(false))
|