Merge "MNAIO: Enable using a data disk for file-backed VM's"
This commit is contained in:
commit
8c480fcb2a
@ -263,9 +263,9 @@ backing store) for the VM's, then set the following option before executing
|
|||||||
|
|
||||||
If you wish to save the current file-based images in order to implement a
|
If you wish to save the current file-based images in order to implement a
|
||||||
thin-provisioned set of VM's which can be saved and re-used, then use the
|
thin-provisioned set of VM's which can be saved and re-used, then use the
|
||||||
``save-vms.yml`` playbook. This will stop the VM's and save the files to
|
``save-vms.yml`` playbook. This will stop the VM's and rename the files to
|
||||||
``/var/lib/libvirt/images/*-base.img``. Re-executing the ``deploy-vms.yml``
|
``*-base.img``. Re-executing the ``deploy-vms.yml`` playbook afterwards will
|
||||||
playbook afterwards will rebuild the VMs from those images.
|
rebuild the VMs from those images.
|
||||||
|
|
||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
|
|
||||||
|
@ -31,6 +31,11 @@
|
|||||||
tags:
|
tags:
|
||||||
- always
|
- always
|
||||||
|
|
||||||
|
- name: Get info about the virt storage pools
|
||||||
|
virt_pool:
|
||||||
|
command: info
|
||||||
|
register: _virt_pools
|
||||||
|
|
||||||
- name: Stop running VMs
|
- name: Stop running VMs
|
||||||
virt:
|
virt:
|
||||||
name: "{{ hostvars[item]['server_hostname'] }}"
|
name: "{{ hostvars[item]['server_hostname'] }}"
|
||||||
@ -53,7 +58,7 @@
|
|||||||
|
|
||||||
- name: Delete VM Disk Image
|
- name: Delete VM Disk Image
|
||||||
file:
|
file:
|
||||||
path: "/var/lib/libvirt/images/{{ hostvars[item]['server_hostname'] }}.img"
|
path: "{{ _virt_pools.pools.default.path | default('/data') }}/{{ hostvars[item]['server_hostname'] }}.img"
|
||||||
state: absent
|
state: absent
|
||||||
when:
|
when:
|
||||||
- hostvars[item]['server_vm'] | default(false) | bool
|
- hostvars[item]['server_vm'] | default(false) | bool
|
||||||
@ -84,7 +89,7 @@
|
|||||||
block:
|
block:
|
||||||
- name: Find existing base image files
|
- name: Find existing base image files
|
||||||
find:
|
find:
|
||||||
paths: /var/lib/libvirt/images
|
paths: "{{ _virt_pools.pools.default.path | default('/data') }}"
|
||||||
patterns: '*-base.img'
|
patterns: '*-base.img'
|
||||||
register: _base_images
|
register: _base_images
|
||||||
|
|
||||||
@ -99,9 +104,9 @@
|
|||||||
qemu-img create
|
qemu-img create
|
||||||
-f qcow2
|
-f qcow2
|
||||||
{% if vm_use_snapshot | bool %}
|
{% if vm_use_snapshot | bool %}
|
||||||
-b /var/lib/libvirt/images/{{ hostvars[item]['server_hostname'] }}-base.img
|
-b {{ _virt_pools.pools.default.path | default('/data') }}/{{ hostvars[item]['server_hostname'] }}-base.img
|
||||||
{% endif %}
|
{% endif %}
|
||||||
/var/lib/libvirt/images/{{ hostvars[item]['server_hostname'] }}.img
|
{{ _virt_pools.pools.default.path | default('/data') }}/{{ hostvars[item]['server_hostname'] }}.img
|
||||||
{{ default_vm_storage }}m
|
{{ default_vm_storage }}m
|
||||||
when:
|
when:
|
||||||
- hostvars[item]['server_vm'] | default(false) | bool
|
- hostvars[item]['server_vm'] | default(false) | bool
|
||||||
|
@ -41,7 +41,7 @@
|
|||||||
{% elif default_vm_disk_mode == "file" %}
|
{% elif default_vm_disk_mode == "file" %}
|
||||||
<disk type='file' device='disk'>
|
<disk type='file' device='disk'>
|
||||||
<driver name='qemu' type='qcow2' cache='none' io='native'/>
|
<driver name='qemu' type='qcow2' cache='none' io='native'/>
|
||||||
<source file='/var/lib/libvirt/images/{{ hostvars[item]["server_hostname"] }}.img'/>
|
<source file='{{ _virt_pools.pools.default.path | default('/data') }}/{{ hostvars[item]["server_hostname"] }}.img'/>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<target dev='vda' bus='virtio'/>
|
<target dev='vda' bus='virtio'/>
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
|
||||||
|
@ -31,6 +31,11 @@
|
|||||||
tags:
|
tags:
|
||||||
- always
|
- always
|
||||||
|
|
||||||
|
- name: Get info about the virt storage pools
|
||||||
|
virt_pool:
|
||||||
|
command: info
|
||||||
|
register: _virt_pools
|
||||||
|
|
||||||
- name: Stop running VMs
|
- name: Stop running VMs
|
||||||
command: "virsh destroy {{ hostvars[item]['server_hostname'] }}"
|
command: "virsh destroy {{ hostvars[item]['server_hostname'] }}"
|
||||||
failed_when: false
|
failed_when: false
|
||||||
@ -41,8 +46,8 @@
|
|||||||
- name: Save VM Disk Image
|
- name: Save VM Disk Image
|
||||||
command: >-
|
command: >-
|
||||||
mv
|
mv
|
||||||
/var/lib/libvirt/images/{{ hostvars[item]['server_hostname'] }}.img
|
{{ _virt_pools.pools.default.path | default('/data') }}/{{ hostvars[item]['server_hostname'] }}.img
|
||||||
/var/lib/libvirt/images/{{ hostvars[item]['server_hostname'] }}-base.img
|
{{ _virt_pools.pools.default.path | default('/data') }}/{{ hostvars[item]['server_hostname'] }}-base.img
|
||||||
when:
|
when:
|
||||||
- hostvars[item]['server_vm'] | default(false) | bool
|
- hostvars[item]['server_vm'] | default(false) | bool
|
||||||
with_items: "{{ groups['pxe_servers'] }}"
|
with_items: "{{ groups['pxe_servers'] }}"
|
||||||
|
@ -242,77 +242,153 @@
|
|||||||
with_dict: "{{ mnaio_host_networks }}"
|
with_dict: "{{ mnaio_host_networks }}"
|
||||||
when: "item.value.iface not in vm_networks.list_nets"
|
when: "item.value.iface not in vm_networks.list_nets"
|
||||||
|
|
||||||
- name: Locate data volume
|
- name: Locate the largest writable data disk if mnaio_data_disk is not set
|
||||||
command: "vgdisplay vg01"
|
shell: >
|
||||||
failed_when: false
|
lsblk -brndo NAME,TYPE,FSTYPE,RO,SIZE | awk '/d[b-z]+ disk +0/{ if ($4>m){m=$4; d=$1}}; END{print d}'
|
||||||
|
register: lsblk
|
||||||
|
changed_when: false
|
||||||
when:
|
when:
|
||||||
- default_vm_disk_mode == "lvm"
|
- mnaio_data_disk is undefined
|
||||||
register: data_volume
|
|
||||||
|
|
||||||
- name: Setup the data volume (LVM)
|
- name: Get info about existing virt storage pools
|
||||||
|
virt_pool:
|
||||||
|
command: info
|
||||||
|
register: _virt_pools
|
||||||
|
|
||||||
|
- name: If an existing virt pool does not match default_vm_disk_mode, remove it
|
||||||
when:
|
when:
|
||||||
- default_vm_disk_mode == "lvm"
|
- _virt_pools.pools.default is defined
|
||||||
- data_volume.rc != 0
|
- (default_vm_disk_mode == "file" and _virt_pools.pools.default.format is defined) or
|
||||||
|
(default_vm_disk_mode == "lvm" and _virt_pools.pools.default.format is not defined)
|
||||||
block:
|
block:
|
||||||
- name: Locate data disk
|
- name: Dismount the mount point if default_vm_disk_mode is 'lvm'
|
||||||
shell: >
|
mount:
|
||||||
lsblk -brndo NAME,TYPE,FSTYPE,RO,SIZE | awk '/d[b-z]+ disk +0/{ if ($4>m){m=$4; d=$1}}; END{print d}'
|
path: /data
|
||||||
register: lsblk
|
state: unmounted
|
||||||
when:
|
when:
|
||||||
- mnaio_data_disk is undefined
|
- default_vm_disk_mode == "lvm"
|
||||||
|
|
||||||
- name: Create data disk label
|
- name: Stop the pool
|
||||||
command: "parted --script /dev/{{ mnaio_data_disk | default(lsblk.stdout) }} mklabel gpt"
|
virt_pool:
|
||||||
|
command: destroy
|
||||||
|
name: default
|
||||||
|
|
||||||
- name: Create data disk partition
|
- name: Delete the pool, destroying its contents
|
||||||
command: "parted --align optimal --script /dev/{{ mnaio_data_disk | default(lsblk.stdout) }} mkpart data1 ext4 0% 100%"
|
virt_pool:
|
||||||
|
command: delete
|
||||||
|
name: default
|
||||||
|
|
||||||
- name: Create data volume group
|
- name: Undefine the pool
|
||||||
|
virt_pool:
|
||||||
|
command: undefine
|
||||||
|
name: default
|
||||||
|
|
||||||
|
- name: Remove the mount point if default_vm_disk_mode is 'lvm'
|
||||||
|
mount:
|
||||||
|
path: /data
|
||||||
|
state: absent
|
||||||
|
when:
|
||||||
|
- default_vm_disk_mode == "lvm"
|
||||||
|
|
||||||
|
- name: Reload systemd to remove generated unit files for mount
|
||||||
|
systemd:
|
||||||
|
daemon_reload: yes
|
||||||
|
when:
|
||||||
|
- default_vm_disk_mode == "lvm"
|
||||||
|
|
||||||
|
- name: Remove the volume group if default_vm_disk_mode is 'file'
|
||||||
|
lvg:
|
||||||
|
vg: vg01
|
||||||
|
state: absent
|
||||||
|
register: _remove_vg
|
||||||
|
when:
|
||||||
|
- default_vm_disk_mode == "file"
|
||||||
|
|
||||||
|
- name: Remove the existing disk partition
|
||||||
|
parted:
|
||||||
|
device: "/dev/{{ mnaio_data_disk | default(lsblk.stdout) }}"
|
||||||
|
number: 1
|
||||||
|
state: absent
|
||||||
|
|
||||||
|
- name: Setup the data disk partition
|
||||||
|
parted:
|
||||||
|
device: "/dev/{{ mnaio_data_disk | default(lsblk.stdout) }}"
|
||||||
|
label: gpt
|
||||||
|
number: 1
|
||||||
|
name: data1
|
||||||
|
state: present
|
||||||
|
register: _add_partition
|
||||||
|
|
||||||
|
- name: Prepare the data disk for 'lvm' default_vm_disk_mode
|
||||||
|
when:
|
||||||
|
- default_vm_disk_mode == "lvm"
|
||||||
|
block:
|
||||||
|
- name: Create the volume group
|
||||||
lvg:
|
lvg:
|
||||||
vg: vg01
|
vg: vg01
|
||||||
pvs: "/dev/{{ mnaio_data_disk | default(lsblk.stdout) }}1"
|
pvs: "/dev/{{ mnaio_data_disk | default(lsblk.stdout) }}1"
|
||||||
|
|
||||||
- name: Locate virt data volume
|
- name: Define the default virt storage pool
|
||||||
virt_pool:
|
virt_pool:
|
||||||
name: "vg01"
|
name: default
|
||||||
command: info
|
state: present
|
||||||
failed_when: false
|
xml: |
|
||||||
|
<pool type='logical'>
|
||||||
|
<name>default</name>
|
||||||
|
<source>
|
||||||
|
<name>vg01</name>
|
||||||
|
<format type='lvm2'/>
|
||||||
|
</source>
|
||||||
|
<target>
|
||||||
|
<path>/dev/vg01</path>
|
||||||
|
</target>
|
||||||
|
</pool>
|
||||||
|
|
||||||
|
- name: Prepare the data disk for 'file' default_vm_disk_mode
|
||||||
when:
|
when:
|
||||||
- default_vm_disk_mode == "lvm"
|
- default_vm_disk_mode == "file"
|
||||||
register: virt_data_volume
|
|
||||||
|
|
||||||
- name: Create /etc/libvirt/storage directory
|
|
||||||
file:
|
|
||||||
path: "/etc/libvirt/storage/"
|
|
||||||
state: "directory"
|
|
||||||
|
|
||||||
- name: Create virt data volume
|
|
||||||
block:
|
block:
|
||||||
- name: Create virt pool
|
- name: Prepare the data disk file system
|
||||||
virt_pool:
|
filesystem:
|
||||||
command: create
|
fstype: ext4
|
||||||
name: vg01
|
dev: "/dev/{{ mnaio_data_disk | default(lsblk.stdout) }}1"
|
||||||
|
force: yes
|
||||||
|
when:
|
||||||
|
- _add_partition is changed
|
||||||
|
|
||||||
- name: Get virt pool xml
|
- name: Mount the data disk
|
||||||
virt_pool:
|
mount:
|
||||||
command: get_xml
|
src: "/dev/{{ mnaio_data_disk | default(lsblk.stdout) }}1"
|
||||||
name: vg01
|
path: /data
|
||||||
register: virt_pool_xml
|
state: mounted
|
||||||
|
fstype: ext4
|
||||||
|
|
||||||
- name: Write data volume xml
|
- name: Define the default virt storage pool
|
||||||
copy:
|
|
||||||
content: "{{ virt_pool_xml.get_xml }}"
|
|
||||||
dest: "/etc/libvirt/storage/vg01.xml"
|
|
||||||
|
|
||||||
- name: Define virt data volume
|
|
||||||
virt_pool:
|
virt_pool:
|
||||||
command: define
|
name: default
|
||||||
name: vg01
|
state: present
|
||||||
xml: "/etc/libvirt/storage/vg01.xml"
|
xml: |
|
||||||
autostart: true
|
<pool type='dir'>
|
||||||
when:
|
<name>default</name>
|
||||||
- default_vm_disk_mode == "lvm"
|
<target>
|
||||||
- virt_data_volume.pools is not defined
|
<path>/data</path>
|
||||||
|
<permissions>
|
||||||
|
<mode>0755</mode>
|
||||||
|
<owner>0</owner>
|
||||||
|
<group>0</group>
|
||||||
|
</permissions>
|
||||||
|
</target>
|
||||||
|
</pool>
|
||||||
|
|
||||||
|
- name: Set default virt storage pool to active
|
||||||
|
virt_pool:
|
||||||
|
name: default
|
||||||
|
state: active
|
||||||
|
|
||||||
|
- name: Set default virt storage pool to autostart
|
||||||
|
virt_pool:
|
||||||
|
name: default
|
||||||
|
autostart: yes
|
||||||
|
|
||||||
- name: Load virtio kernel modules
|
- name: Load virtio kernel modules
|
||||||
shell: |
|
shell: |
|
||||||
|
Loading…
x
Reference in New Issue
Block a user