From c018f035b67d0b647b78cef1efd24f6ea1bcbc8a Mon Sep 17 00:00:00 2001 From: David Johnson Date: Wed, 9 Jan 2019 20:49:02 -0800 Subject: [PATCH] Added disk image: parameter. Added cdroms for VMs. Fixed problems with write lokcing in qemu_img. --- defaults/main.yml | 1 + library/qemu_img | 2 +- playbook.yml | 39 ++++++++++++++++++++- tasks/config_vms.yml | 68 ++++++++++++++++++++++++++++++++++-- templates/vm-template.xml.j2 | 7 ++++ 5 files changed, 112 insertions(+), 5 deletions(-) diff --git a/defaults/main.yml b/defaults/main.yml index ce8d74b..dc28143 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -253,6 +253,7 @@ kvm_vms: # - disk_driver: 'virtio' # name: 'test_vm.1' # size: '36864' + # image: /tmp/bionic-server-cloudimg-amd64.img # - disk_driver: 'virtio' # name: 'test_vm.2' # size: '51200' diff --git a/library/qemu_img b/library/qemu_img index 37ccc72..794c11e 100755 --- a/library/qemu_img +++ b/library/qemu_img @@ -96,7 +96,7 @@ def main(): module.run_command('%s create -f %s -o %s "%s" %s'%(qemu_img, img_format, opt, dest, size), check_rc=True) changed = True else: - rc, stdout, _ = module.run_command('%s info "%s"'%(qemu_img, dest), check_rc=True) + rc, stdout, _ = module.run_command('%s info -U "%s"'%(qemu_img, dest), check_rc=True) current_size = None for line in stdout.splitlines(): if 'virtual size' in line: diff --git a/playbook.yml b/playbook.yml index 13338e1..7244371 100644 --- a/playbook.yml +++ b/playbook.yml @@ -6,7 +6,15 @@ apt: update_cache: yes cache_valid_time: 3600 - + +- hosts: all + tasks: + - name: download test image + get_url: + url: "https://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img" + dest: /tmp/ubuntu.img + +# VM with empty disk - hosts: all become: true vars: @@ -31,3 +39,32 @@ type: 'network' roles: - role: ansible-kvm + +# VM with a defined disk config +- hosts: all + become: true + vars: + kvm_config: true + kvm_manage_vms: true + kvm_disable_apparmor: true + kvm_vms: + - name: 'testhost2' + autostart: true + boot_devices: + - 'hd' + memory: '512' + state: 'running' + vcpu: '1' + disks: + - disk_driver: 'virtio' + name: 'testhost2-disk' + image: '/tmp/ubuntu.img' + size: '8192' +# cdroms: +# - source: /tmp/example.iso + network_interfaces: + - source: 'default' + network_driver: 'virtio' + type: 'network' + roles: + - role: ansible-kvm diff --git a/tasks/config_vms.yml b/tasks/config_vms.yml index 170f4be..7ed6261 100644 --- a/tasks/config_vms.yml +++ b/tasks/config_vms.yml @@ -19,7 +19,7 @@ item['host'] is defined and inventory_hostname == item['host'] -- name: config_vms | Creating VM Disk(s) +- name: config_vms | Creating VM Disk(s), undefined host, empty disk qemu_img: dest: "{{ kvm_images_path }}/{{ item[1]['name'] }}.{{ kvm_images_format_type }}" size: "{{ item[1]['size'] }}" @@ -28,9 +28,40 @@ with_subelements: - "{{ kvm_vms }}" - disks - when: item[0]['host'] is not defined + when: > + item[0]['host'] is not defined and + item[1]['image'] is not defined + +- name: config_vms | Creating VM Disk(s), undefined host, primed disk, fetch + copy: + dest: "{{ kvm_images_path }}/{{ item[1]['name'] }}.{{ kvm_images_format_type }}" + src: "{{ item[1]['image'] }}" + remote_src: yes + force: no + register: new_image + become: true + with_subelements: + - "{{ kvm_vms }}" + - disks + when: > + item[0]['host'] is not defined and + item[1]['image'] is defined + +- name: config_vms | Creating VM Disk(s), undefined host, primed disk, resize + qemu_img: + dest: "{{ kvm_images_path }}/{{ item[1]['name'] }}.{{ kvm_images_format_type }}" + size: "{{ item[1]['size'] }}" + become: true + with_subelements: + - "{{ kvm_vms }}" + - disks + when: > + item[0]['host'] is not defined and + item[1]['image'] is defined and + item[1]['size'] is defined and + new_image.changed -- name: config_vms | Creating VM Disk(s) +- name: config_vms | Creating VM Disk(s), defined host, empty disk qemu_img: dest: "{{ kvm_images_path }}/{{ item[1]['name'] }}.{{ kvm_images_format_type }}" size: "{{ item[1]['size'] }}" @@ -43,6 +74,37 @@ item[0]['host'] is defined and inventory_hostname == item[0]['host'] +- name: config_vms | Creating VM Disk(s), defined host, primed disk, fetch + copy: + dest: "{{ kvm_images_path }}/{{ item[1]['name'] }}.{{ kvm_images_format_type }}" + src: "{{ item[1]['image'] }}" + remote_src: yes + force: no + register: new_image + become: true + with_subelements: + - "{{ kvm_vms }}" + - disks + when: > + item[0]['host'] is defined and + inventory_hostname == item[0]['host'] and + item[1]['image'] is defined + +- name: config_vms | Creating VM Disk(s), defined host, primed disk, resize + qemu_img: + dest: "{{ kvm_images_path }}/{{ item[1]['name'] }}.{{ kvm_images_format_type }}" + size: "{{ item[1]['size'] }}" + become: true + with_subelements: + - "{{ kvm_vms }}" + - disks + when: > + item[0]['host'] is defined and + inventory_hostname == item[0]['host'] and + item[1]['image'] is defined and + item[1]['size'] is defined and + new_image.changed + - name: config_vms | Setting VM State virt: name: "{{ item['name'] }}" diff --git a/templates/vm-template.xml.j2 b/templates/vm-template.xml.j2 index 8056550..28964c8 100644 --- a/templates/vm-template.xml.j2 +++ b/templates/vm-template.xml.j2 @@ -28,6 +28,13 @@ {% endif %} {% endfor %} +{% for cdrom in item.cdroms|default([]) %} + + + + + +{% endfor %} {% for int in item.network_interfaces %} {% if int['portgroup'] is not defined %}