Standardized the use of `retries` and `delay` variables in tasks to ensure consistent behavior, making it easier to manage and maintain the workflow. This change also enables better error handling and reduces potential issues with task execution.
103 lines
3.5 KiB
YAML
103 lines
3.5 KiB
YAML
---
|
||
# create-clones.yml - Create and configure clones from template with error handling
|
||
|
||
- name: "[CLONES] Validate clone list is not empty"
|
||
ansible.builtin.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"
|
||
ansible.builtin.stat:
|
||
path: "/etc/pve/qemu-server/{{ clone.id }}.conf"
|
||
register: clone_conf
|
||
changed_when: false
|
||
|
||
- name: "[CLONES] Display clone status"
|
||
ansible.builtin.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"
|
||
ansible.builtin.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"
|
||
ansible.builtin.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"
|
||
ansible.builtin.pause:
|
||
seconds: 2
|
||
when: not clone_conf.stat.exists
|
||
|
||
rescue:
|
||
- name: "[CLONES] Handle clone creation error"
|
||
ansible.builtin.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"
|
||
ansible.builtin.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"
|
||
ansible.builtin.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"
|
||
ansible.builtin.debug:
|
||
msg: "WARNING: Could not fully configure clone {{ clone.id }}. You may need to configure manually."
|
||
|
||
- name: "[CLONES] Start clone VM"
|
||
ansible.builtin.command: "qm start {{ clone.id }}"
|
||
register: clone_start
|
||
retries: "{{ max_retries }}"
|
||
delay: "{{ retry_delay }}"
|
||
until: clone_start is succeeded
|
||
when: not clone_conf.stat.exists
|
||
|
||
- name: "[CLONES] Wait for clone to boot"
|
||
ansible.builtin.pause:
|
||
seconds: 3
|
||
|
||
- name: "[CLONES] Display clone creation result"
|
||
ansible.builtin.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)"
|
||
ansible.builtin.debug:
|
||
msg: "ℹ Clone creation is disabled. Set 'create_clones: true' to enable."
|
||
when: not (create_clones | default(false))
|