fix: refactor clone creation logic into separate iteration file
This commit is contained in:
94
tasks/clone_iteration.yml
Normal file
94
tasks/clone_iteration.yml
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
---
|
||||||
|
# clone_iteration.yml - Single clone iteration (called from create-clones.yml loop)
|
||||||
|
|
||||||
|
- name: "[CLONES] Check if clone already exists"
|
||||||
|
ansible.builtin.include_tasks: helpers.yml
|
||||||
|
vars:
|
||||||
|
helper_task: check_vm_exists
|
||||||
|
target_vm_id: "{{ clone.id }}"
|
||||||
|
|
||||||
|
- name: "[CLONES] Display clone status"
|
||||||
|
ansible.builtin.debug:
|
||||||
|
msg: "Clone {{ clone.id }} ({{ clone.hostname }}) - Status: {{ 'EXISTS' if vm_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 vm_exists
|
||||||
|
|
||||||
|
- name: "[CLONES] Verify clone was created"
|
||||||
|
ansible.builtin.include_tasks: helpers.yml
|
||||||
|
vars:
|
||||||
|
helper_task: check_vm_exists
|
||||||
|
target_vm_id: "{{ clone.id }}"
|
||||||
|
when: not vm_exists
|
||||||
|
|
||||||
|
- name: "[CLONES] Ensure clone creation succeeded"
|
||||||
|
ansible.builtin.assert:
|
||||||
|
that:
|
||||||
|
- vm_exists | bool
|
||||||
|
fail_msg: "Failed to create clone {{ clone.id }}"
|
||||||
|
when: not vm_exists
|
||||||
|
|
||||||
|
- name: "[CLONES] Wait for clone to be ready"
|
||||||
|
ansible.builtin.pause:
|
||||||
|
seconds: 2
|
||||||
|
when: not vm_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 vm_exists
|
||||||
|
|
||||||
|
- name: "[CLONES] Apply SSH keys to clone"
|
||||||
|
ansible.builtin.command: >
|
||||||
|
qm set {{ clone.id }}
|
||||||
|
--sshkeys local:snippets/{{ vm_id }}-sshkey.pub
|
||||||
|
when: not vm_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 vm_exists
|
||||||
|
|
||||||
|
- name: "[CLONES] Wait for clone to boot"
|
||||||
|
ansible.builtin.pause:
|
||||||
|
seconds: 3
|
||||||
|
|
||||||
|
- name: "[CLONES] Display clone creation result"
|
||||||
|
ansible.builtin.debug:
|
||||||
|
msg: |
|
||||||
|
{% if vm_exists %}
|
||||||
|
ℹ Clone {{ clone.id }} ({{ clone.hostname }}) already exists - skipped
|
||||||
|
{% else %}
|
||||||
|
✓ Clone created and started
|
||||||
|
- ID: {{ clone.id }}
|
||||||
|
- Hostname: {{ clone.hostname }}
|
||||||
|
- IP: {{ clone.ip }}
|
||||||
|
- Full clone: {{ clone.full | default(0) }}
|
||||||
|
{% endif %}
|
||||||
@@ -9,102 +9,10 @@
|
|||||||
- clones is not defined or clones | length == 0
|
- clones is not defined or clones | length == 0
|
||||||
|
|
||||||
- name: "[CLONES] Process each clone"
|
- name: "[CLONES] Process each clone"
|
||||||
block:
|
include_tasks: clone_iteration.yml
|
||||||
- name: "[CLONES] Check if clone already exists"
|
vars:
|
||||||
ansible.builtin.include_tasks: helpers.yml
|
clone: "{{ item }}"
|
||||||
vars:
|
|
||||||
helper_task: check_vm_exists
|
|
||||||
target_vm_id: "{{ clone.id }}"
|
|
||||||
|
|
||||||
- name: "[CLONES] Display clone status"
|
|
||||||
ansible.builtin.debug:
|
|
||||||
msg: "Clone {{ clone.id }} ({{ clone.hostname }}) - Status: {{ 'EXISTS' if vm_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 vm_exists
|
|
||||||
|
|
||||||
- name: "[CLONES] Verify clone was created"
|
|
||||||
ansible.builtin.include_tasks: helpers.yml
|
|
||||||
vars:
|
|
||||||
helper_task: check_vm_exists
|
|
||||||
target_vm_id: "{{ clone.id }}"
|
|
||||||
when: not vm_exists
|
|
||||||
|
|
||||||
- name: "[CLONES] Ensure clone creation succeeded"
|
|
||||||
ansible.builtin.assert:
|
|
||||||
that:
|
|
||||||
- vm_exists | bool
|
|
||||||
fail_msg: "Failed to create clone {{ clone.id }}"
|
|
||||||
when: not vm_exists
|
|
||||||
|
|
||||||
- name: "[CLONES] Wait for clone to be ready"
|
|
||||||
ansible.builtin.pause:
|
|
||||||
seconds: 2
|
|
||||||
when: not vm_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 vm_exists
|
|
||||||
|
|
||||||
- name: "[CLONES] Apply SSH keys to clone"
|
|
||||||
ansible.builtin.command: >
|
|
||||||
qm set {{ clone.id }}
|
|
||||||
--sshkeys local:snippets/{{ vm_id }}-sshkey.pub
|
|
||||||
when: not vm_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 vm_exists
|
|
||||||
|
|
||||||
- name: "[CLONES] Wait for clone to boot"
|
|
||||||
ansible.builtin.pause:
|
|
||||||
seconds: 3
|
|
||||||
|
|
||||||
- name: "[CLONES] Display clone creation result"
|
|
||||||
ansible.builtin.debug:
|
|
||||||
msg: |
|
|
||||||
{% if vm_exists %}
|
|
||||||
ℹ Clone {{ clone.id }} ({{ clone.hostname }}) already exists - skipped
|
|
||||||
{% else %}
|
|
||||||
✓ Clone created and started
|
|
||||||
- ID: {{ clone.id }}
|
|
||||||
- Hostname: {{ clone.hostname }}
|
|
||||||
- IP: {{ clone.ip }}
|
|
||||||
- Full clone: {{ clone.full | default(0) }}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
loop: "{{ clones }}"
|
loop: "{{ clones }}"
|
||||||
loop_control:
|
|
||||||
loop_var: clone
|
|
||||||
when: create_clones | default(false)
|
when: create_clones | default(false)
|
||||||
|
|
||||||
- name: "[CLONES] Skip clone creation (disabled)"
|
- name: "[CLONES] Skip clone creation (disabled)"
|
||||||
|
|||||||
Reference in New Issue
Block a user