Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ---
- - name: Define template types
- ansible.builtin.set_fact:
- template_types:
- bare:
- vm_id: 1002
- vm_name: ol8-template
- si:
- vm_id: 1003
- vm_name: ol8-si-template
- rac:
- vm_id: 1004
- vm_name: ol8-rac-template
- - name: Define valid types
- ansible.builtin.set_fact:
- valid_types: "{{ template_types.keys() | list }}"
- - name: Assert template type
- ansible.builtin.assert:
- that:
- - template_type is defined
- - template_type in valid_types
- - name: Define vm_id and vm_name
- ansible.builtin.set_fact:
- vm_id: "{{ template_types[template_type].vm_id }}"
- vm_name: "{{ template_types[template_type].vm_name }}"
- - name: Check if Oracle Linux 8 cloud image exists
- ansible.builtin.stat:
- path: "{{ image_storage_path }}/{{ ol8_image_filename }}"
- no_log: true
- register: ol8_image_check
- - name: Download Oracle Linux 8 cloud image
- ansible.builtin.get_url:
- url: "{{ ol8_image_url }}"
- dest: "{{ image_storage_path }}/{{ ol8_image_filename }}"
- mode: '0644'
- timeout: 600
- async: 3600
- poll: 15
- when: not ol8_image_check.stat.exists
- register: image_download
- - name: Check if VM already exists
- ansible.builtin.shell: |
- set -o pipefail && qm list | grep -q '^.*{{ vm_id }}'
- args:
- executable: /bin/bash
- register: vm_exists
- failed_when: false
- changed_when: false
- - name: Fail if VM already exists
- ansible.builtin.fail:
- msg: "VM {{ vm_name }} already exists"
- when: vm_exists.rc == 0
- - name: Create new VM
- ansible.builtin.command: >
- qm create {{ vm_id }}
- --name {{ vm_name }}
- --memory {{ vm_memory }}
- --cores {{ vm_cores }}
- --net0 virtio={{ 'BC:24:11' | community.general.random_mac(seed=vm_name) }},bridge={{ vm_network_bridge }}
- --scsihw virtio-scsi-pci
- --scsi0 {{ vm_storage }}:0,import-from={{ image_storage_path }}/{{ ol8_image_filename }},discard=on
- --ide2 {{ vm_storage }}:cloudinit
- --boot c --bootdisk scsi0
- --serial0 socket --vga serial0
- --agent enabled=1
- --localtime 1
- register: qm_create_result
- changed_when: qm_create_result == 0
- - name: Resize disk to desired size
- ansible.builtin.command: qm resize {{ vm_id }} scsi0 {{ vm_disk_size }}
- register: qm_resize_result
- changed_when: qm_resize_result == 0
- - name: Copy Cloud-Init data to snippets
- ansible.builtin.template:
- src: user-data.j2
- dest: "/var/lib/vz/snippets/user-data-{{ vm_id }}.yml"
- owner: root
- group: root
- mode: '0644'
- - name: Configure Cloud-Init settings
- ansible.builtin.command: >
- qm set {{ vm_id }}
- --cicustom "user=local:snippets/user-data-{{ vm_id }}.yml"
- --ipconfig0 ip=dhcp
- register: qm_set_result
- changed_when: qm_set_result == 0
- - name: Start VM
- ansible.builtin.command: "qm start {{ vm_id }}"
- register: qm_start_result
- changed_when: qm_start_result == 0
- - name: Check VM status and wait for it to be stopped
- ansible.builtin.shell: "qm status {{ vm_id }}"
- register: qm_status_result
- until: "'status: stopped' in qm_status_result.stdout"
- retries: 60
- delay: 15
- changed_when: false
- - name: "Remove cloud init drive from {{ vm_id }}"
- ansible.builtin.command:
- cmd: "qm set {{ vm_id }} --ide2 none"
- changed_when: true
- failed_when: false
- - name: "Generate Cloud-Init configuration for {{ vm_name }}"
- ansible.builtin.template:
- src: cloud-init.yml.j2
- dest: "/var/lib/vz/snippets/ci-{{ vm_id }}.yaml"
- mode: '0644'
- - name: "Attach cloud-init drive and apply configuration"
- ansible.builtin.shell:
- cmd: "qm set {{ vm_id }} --ide2 \"local-lvm:cloudinit\" && qm set {{ vm_id }} --cicustom \"user=local:snippets/ci-{{ vm_id }}.yaml\""
- changed_when: true
- - name: Start VM
- ansible.builtin.command: "qm start {{ vm_id }}"
- register: qm_start_result
- changed_when: qm_start_result == 0
- - name: "Wait for VM to start"
- ansible.builtin.wait_for:
- host: "{{ vm_name }}"
- port: 22
- delay: 30
- - name: Configure template
- when: template_type == 'si'
- ansible.builtin.import_tasks:
- file: configure_si.yml
- delegate_to: "{{ vm_name }}"
- remote_user: oracle
- - name: Configure template
- when: template_type == 'rac'
- ansible.builtin.import_tasks:
- file: configure_rac.yml
- delegate_to: "{{ vm_name }}"
- remote_user: oracle
- - name: Prepare the VM for template
- ansible.builtin.command:
- cmd: "{{ item }}"
- with_items:
- - "rm -f /etc/machine-id"
- - "rm -f /var/lib/dbus/machine-id"
- delegate_to: "{{ vm_name }}"
- become: true
- remote_user: oracle
- - name: Stop VM
- ansible.builtin.command: "qm stop {{ vm_id }}"
- register: qm_stop_result
- changed_when: qm_stop_result == 0
- - name: Check VM status and wait for it to be stopped
- ansible.builtin.shell: "qm status {{ vm_id }}"
- register: qm_status_result
- until: "'status: stopped' in qm_status_result.stdout"
- retries: 60
- delay: 15
- changed_when: false
- - name: Convert the VM to a template
- ansible.builtin.command: "qm template {{ vm_id }}"
- register: qm_tmpl_result
- changed_when: qm_tmpl_result == 0
Advertisement
Add Comment
Please, Sign In to add comment